滑动窗口

数据载入

def load(path:str):
    with open(path) as f:
        for line in f:
            tmp = extract(line)
            if tmp:
                yield tmp
            else:
                # TODO 解析失败就抛弃,或者打印日志
                continue

时间窗口分析

概念

  • 很多数据,例如日志,都和时间相关的,都是按照时间顺序产生的。
  • 产生的数据分析的时候,要按照时间求值
  • interval 表示每一次求值的时间间隔
  • width 时间窗口宽度,指的一次求值的时间窗口宽度

当width > interval

59fc4cf3f13bb34ae2000000

  • 数据求值是会有重叠

当width = interval

59fc4d26f13bb34ae2000001

  • 数据求值没有重叠

当width < interval

  • 一般不采纳,因为这样会有数据流失

时序数据

  • 运行环境中,日志、监控等产生的数据都是与时间相关的数据,按照时间先后产生并记录下来的数据,所以一般按照时间对数据进行分析

时序数据分析的节本程序结构

  • 随机生成几个数,产生时间相关的数据,返回 时间 + 随机数
  • 每次取三个值,求平均值
    import random
    import datetime
    import time
    
    def f():
        while True:
            yield {'value':random.randrange(100), 'time':datetime.datetime.now()}
            time.sleep(1)
    
    src = f()
    items = [next(src) for _ in range(3)]
    
    def handler(iterable):
        vals = [x['value'] for x in iterable]
        return sum(vals) / len(vals)
    
    print(items)
    print(handler(items))
    

59fc5ab3f13bb34ae2000002


窗口函数实现

import random
import datetime
import time

# 数据源函数
def f():
    while True:
        yield {'value':random.randrange(100), 'time':datetime.datetime.now()}
        time.sleep(5)

def window(src, handler, width:int, interval:int):
    """
    窗口函数
    :param src: 数据源,生成器,用来拿数据
    :param handler: 数据处理函数
    :param width: 时间窗口宽度,秒
    :param interval: 处理时间间隔,秒
    """

    # 初始两个时间段
    start = datetime.datetime.strptime('20170101 00:00:00', '%Y%m%d %H:%M:%S')
    current = datetime.datetime.strptime('20170101 00:01:00', '%Y%m%d %H:%M:%S')

    buffer = [] # 窗口中待计算的数据
    delta = datetime.timedelta(seconds = width - interval)

    while True:
        # 从数据源获取数据
        data = next(src)

        # 存入临时缓冲等待计算
        if data: # 筛掉不符合的数据
            buffer.append(data)
            current = data['time']

        # 进入循环开始操作
        if (current - start).total_seconds() >= interval:
            ret = handler(buffer)
            print('{:.2f}'.format(ret))
            start = current

            # 处理重叠的数据
            buffer = [x for x in buffer if x['time'] > current - delta]


def handler(iterable):
    vals = [x['value'] for x in iterable]
    return sum(vals) / len(vals)
  • 第41行current – delta是因为现在的current还没有更新,而current的时间值到当前current时间值之间的数据正好是重叠的数据
  • widthinterval给一样的时候,那么delta为0,所以不会有重复数据

59fd5b032bd5a743d1000004
59fd5b2f2bd5a743d1000005

  • 相当于用给定的width往后滑动,一下走这么多interval
  • 比如这个,是时间宽为4往下走,两个两个的往后走,所以每次会有两个重复的数据

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88218

(1)
nolannolan
上一篇 2017-11-04 11:20
下一篇 2017-11-05 00:13

相关推荐

  • Python内置数据结构

    解析器和生成器

    Python笔记 2018-04-08
  • Python函数返回值、作用域以及树的概念

    Python函数返回值、作用域以及树的概念

    Python笔记 2018-04-15
  • 正则表达式

    正则表达式 分类 BRE:基本正则表达式,grep,sed,vi等软件支持,vim有扩展 ERE:扩展正则表达式,egrep,grep -E ,sed  r等 PCRE:几乎所有的高级语言都是PCRE的方言或则变种, 基本语法 元字符metacharater .  匹配除换行符外任意一个字符 [abc]字符集合,只能表示一个字符的位置,匹配所包含的任意一个字…

    Python笔记 2018-05-07
  • Python函数式编程指南(四):生成器

    转自 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html 生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。 这是函数式编程指南的最后一篇,似乎拖了一个星期才写好,嗯…… 转载请注明原作者和原文地…

    Linux干货 2015-03-09
  • 函数

    函数、参数、参数解构
    返回值、作用域
    递归函数
    匿名函数、
    生成器

    2018-04-16
  • 程序员如何在小公司成长和大公司学习-python

    这篇文章会带有普遍性,不见得适合所有人,或者文章所描述的也不见得是对的,只是根据我的经历和所见写成的一篇文章,仅供参考。 前言: 在软件行业工作有几个年头了,换过多个开发语言,跳过槽,也被猎头找过,经历了三五杆枪打天下和创业公司一起成长灭亡,也进入了大公司。在这些年的历练中,看见很多刚进入软件行业不久的新人总在抱怨,说学不到东西。其实不管你在大公司还是小公司…

    Python干货 2015-03-16