滑動窗口

數據載入

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.www58058.com/88218

(1)
nolannolan
上一篇 2017-11-04
下一篇 2017-11-05

相關推薦

  • Python內置數據結構——集合set

    集合 定義 set翻譯為集合 collection翻譯為集合類型,是一個較大的概念 set是一個可變的、無序的、不重復的元素組成的集合 set的元素要求必須可以hash,目前已學的不可hash的類型只有list、set 元素不可以索引 set可以迭代 set的初始化 set_1 =set() #表示定義一個空集合set_1 set_1 =set(iterab…

    2017-10-03
  • 基礎語法

    基礎語法、判斷、循環

    2018-03-26
  • Python第十四周網絡知識和數據庫知識總結

    高性能集群Linux virtual server、Nginx、高可用性集群keepalived

    Python筆記 2018-06-10
  • 面向對象之魔術方法

    特殊屬性 屬性 含義 __name__ 類、函數、方法的名稱 __module__ 類定義所在的模塊名 __class__ 對象或類所屬的類 __bases__ 類的基類的元組,順序為它們在基類列表中出現的順序 __doc__ 類、函數的文檔字符串,若沒定義則為None __mro__ 類的mro,方法查找順序 __dict__ 類或實例的屬性,可寫的字典 …

    2018-05-20
  • 通過堡壘機代理SSH運行Ansible(譯)

    有一種常見的網絡安全模式是阻止私有網絡外部對應用服務器的所有連接(指除了業務數據外其它的連接,如后臺管理系統和內部業務系統。譯者注),然后使用 DMZ 區域中的 堡壘機 來選擇性的將到服務器的流量加入白名單。 我們有這樣的一個服務器池,只允許來自特定 IP 地址的 SSH 流量。這些服務器還由 Ansible…

    Linux干貨 2015-02-14
  • Python線程指南

    本文介紹了Python對于線程的支持,包括“學會”多線程編程需要掌握的基礎以及Python兩個線程標準庫的完整介紹及使用示例。 注意:本文基于Python2.4完成,;如果看到不明白的詞匯請記得百度谷歌或維基,whatever。 尊重作者的勞動,轉載請注明作者及原文地址 >.< 1. 線程基礎 1.1. 線程狀態 線程有5種狀態,狀態轉換的過程如…

    2015-03-13
欧美性久久久久