AIOps系列(1):時間序列分析的方法

2021-02-20 zartbot
談到時間序列分析,大多數的故事都是機票訂單數這樣的東西,各位學起來難,數據也屬於非常理想的季節性和趨勢性的那種,毫無意義。然後我天天跟你講白噪聲序列,嚴平穩什麼的,然後ARIMA,GARCH估計你也想睡覺,今天就來說點直接上手的東西。今天我們來玩玩一些好玩,股票數據就算了,吃飯的傢伙還是不給大家多說了,來說點zartbot.Net的網絡數據吧,也夠直觀,代入感強,反正大家玩遊戲晚上覺得卡慢,深夜就好了,大概就是這樣一些東西,衡量出來就是「丟包/延遲/抖動」,然後這篇小文教大家用最簡單的方法來預測這些值,預測完了該幹嘛你懂的,大家看看你自己的SDWAN用好了麼~

1. 數據獲取和預處理

還是來自某司的SDWAN的探針數據,從上海電信到香港的私有雲,很有代表性的鏈路擁塞數據集,通過訪問控制器的RestAPI獲得
import json as jsonimport pandas as pdimport numpy as np
delay= json.loads('xxxx')df=pd.DataFrame(delay['data'])df['dateTime']=pd.to_datetime(df['entry_time']+8*3600*1000,unit='ms')data = df[['dateTime','latency','jitter','loss_percentage']]

2. 數據可視化觀測

大多數人會教你直接用Pandas Plot()畫圖,但是你們看看這圖闊以麼。。。

反正我是看了想吐的,我在自己的私募基金量化算法庫中做了一個稍微好看點的Bokeh Wrapper.畫出來的圖如下,還可以拖拉縮放選擇區域,為了不影響閱讀,這個Wrapper的代碼見本文最後...

其實圖上就看到很明顯的周期性了和使用率不同的峰值結構,當然也有一些測量的異常和系統故障點,總體來說還是很不錯的數據集

3.1 Statsmodel Seasonal decompose

我們先用一個老的python的統計模型庫statsmodel,數據周期性分解如下:

from statsmodels.tsa.seasonal import seasonal_decomposedecomposition = seasonal_decompose(data['latency'],freq=48)data['seasonal']= decomposition.seasonaldata['trend'] = decomposition.trenddata['residual'] = decomposition.resid

然後畫個圖:

chart2 =bokeh_multi_line_chart(data,['seasonal'],['周期性'],title='周期')chart3 =bokeh_multi_line_chart(data,['trend'],['延遲'],title='趨勢')chart4 =bokeh_multi_line_chart(data,['residual'],['殘差'],title='殘差')show_column([chart2,chart3,chart4])

可以看到趨勢線維持在平穩的66~67ms之間, 每天的周期性有點好玩,到了晚高峰有些抖動,主要是丟包引起的延遲測量問題,而且5月10日有明顯的異常, 這些異常可以捕獲殘差獲得並上報。

我們再來看丟包率的數據,周期性可以看到明顯的早高峰,下午工作段和晚高峰,而趨勢線可以明顯的看出節假日丟包率更高

3.2 Facebook Prophet預測未來值

這是一套開箱即用的工具,Prophet通過將全自動預測與在線學習相結合從而保證了該工具能夠解決大多數商業業務問題,Prophet工作流程如下圖所示:

然後fit一下:

from fbprophet import Prophetdata['ds'] = data['dateTime']data['y'] = data['latency']m = Prophet(changepoint_prior_scale=0.01).fit(data)future = m.make_future_dataframe(periods=96,freq='H')fcst = m.predict(future)fig = m.plot(fcst)

同樣預測丟包值:

學會了麼?AIOps就這麼簡單這麼容易,趕緊找點數據算算寫點報告給老闆們看吧,加薪了別忘了我就好~~嘿嘿,最後 Bokeh Wrapper代碼:

import tabulate as tabulateimport pandas as pdimport numpy as npimport bokeh.plottingimport bokeh.modelsimport bokeh.layoutsimport bokeh.palettes
bokeh.plotting.output_notebook()

def bokeh_multi_line_chart(df,item_list,legend_list,title,width=1900,height=600,legend_location='bottom_left',x_axis='dateTime',x_axis_type='datetime',y_axis_type='auto',line_width=1.5,alpha=0.7): fig = bokeh.plotting.figure(width=width,height=height,x_axis_type=x_axis_type , y_axis_type=y_axis_type ,title=title) lines_counter = len (item_list) if (lines_counter <= 3): color_list=['#d25535','#35b2d2','#98d235'] elif (lines_counter <=10): color_list=bokeh.palettes.Category10[10] else: color_list=bokeh.palettes.Category20[20]
for idx in range(0,lines_counter): item = item_list[idx] label = legend_list[idx] fig.line(df[x_axis],df[item],color=color_list[idx],legend=label,line_width=line_width,alpha=alpha) fig.legend.location = legend_location fig.legend.label_text_font_size = "0.8em" return fig
def bokeh_hbar_chart(df,categories_col,value_col,title,color='#B2D235',width=400,height=300): categories = list(df[categories_col]) categories.reverse() result_df = df[[categories_col,value_col]] source = bokeh.models.ColumnDataSource(result_df) fig = bokeh.plotting.figure(title=title, y_range=bokeh.models.FactorRange(factors=categories), width=width,height=height) fig.hbar(left=0, y=categories_col,right=value_col, color=color, source=source,height=0.3) return fig
def bokeh_vbar_chart(df,categories_col,value_col,title,color='#4F4478',width=600,height=380): rdf = df[[categories_col,value_col]] factors = list(rdf[categories_col]) fig = bokeh.plotting.figure(title=title, width=width,height=height,x_range=bokeh.models.FactorRange(*factors)) fig.vbar(bottom=0, top=rdf[value_col], x=factors , color=color, width=0.5, alpha=0.8) return fig
def bokeh_multi_hbar_chart(df,cat_col,value_list,width=400,height=300): chart_list=[] value_counter = len(value_list) if (value_counter <= 3): color_list=['#5154eb','#b2d235','#df9815'] elif (value_counter <=10): color_list=bokeh.palettes.Category10[10] else: color_list=bokeh.palettes.Category20[20] for idx in range(0,value_counter): value_name = value_list[idx] pfig = bokeh_hbar_chart(df,cat_col,value_name,value_name,color=color_list[idx], width=width,height=height) chart_list.append(pfig)
return chart_list
def bokeh_hist_chart(item_list,title,bins=100,width=400,height=300,legend_location='bottom_left'): fig = bokeh.plotting.figure(width=width,height=height,title=title) lines_counter = len (item_list) if (lines_counter <=3): color_list=['#036564','red','navy'] elif (lines_counter <=10): color_list=bokeh.palettes.Category10b[10] else: color_list=bokeh.palettes.Category20b[20]
for idx in range(0,lines_counter): hist,edges = np.histogram(item_list[idx], density=True, bins=bins) fig.quad(top=hist, bottom=0, left=edges[:-1], right=edges[1:],fill_color=color_list[idx], line_color="#033649",alpha=0.5) return fig
def show_grid(chart_list, num_in_row = 4): grid_render_idx = 0 grid_render_matrix = [] templist =[] for item in chart_list: templist.append(item) grid_render_idx +=1 if (grid_render_idx == num_in_row): grid_render_matrix.append(templist) templist =[] grid_render_idx =0 if (len(templist) >0 ): grid_render_matrix.append(templist)
bokeh.plotting.show(bokeh.layouts.gridplot(grid_render_matrix))
def show_column(chart_list): bokeh.plotting.show(bokeh.layouts.column(chart_list))
def show_row(chart_list): bokeh.plotting.show(bokeh.layouts.row(chart_list))

相關焦點

  • 時間序列分析方法與tsfresh(Python)
    時間序列基本概念1.1 時間序列的定義      時間序列(時序數據)是按照一定的時間間隔排列的一組數據,其時間間隔可以是任意的時間單位,如小時、日、周、月等,是大數據分析中經常遇到的一種數據類型。      時間序列研究的目的是尋找時間序列的數學表示方法,進而根據歷史數據預測未來數據,從而為各種決策提供依據。
  • 中斷時間序列分析
    一種替代隨機實驗的方法就是利用自然實驗或政策實施等突發乾預來判斷因果效應。例如,可以研究某些地區實施政策後的效果,這種不以實驗為目的的研究方法稱之為自然實驗或準實驗。我們公眾號之前推出的斷點回歸分析(RDD)就是一種很好的接近隨機實驗的非隨機實驗方法,關於斷點回歸分析的內容可以參考本公眾號之前的文章斷點回歸設計(RDD)及其在STATA軟體的實現過程。
  • 時間序列分析(一)
    本文通過一個例子,講解時間序列,預測男裝銷售額。首先簡單介紹一下什麼是時間序列分析。
  • 乾貨| 【時間簡「識」】1.帶你看看時間序列的簡史
    好~~從上面那個故事我們看到了:1、時間序列的定義——按照時間的順序把隨機事件變化發展的過程記錄下來就構成了一個時間序列。2、時間序列分析的定義——對時間序列進行觀察、研究,找尋它變化發展的規律,預測它將來的走勢就是時間序列分析。既然有了序列,那我們怎麼拿來分析呢?
  • R時間序列分析學習筆記(二)——時間序列數據類型(一)
    時間序列的數據可以保存在R的向量中, 或者保存在R的數據框的一列或幾列中, 對應的時間單獨保存或者保存在同一數據框中。也有一些專門的時間序列數據類型, 將時間序列的觀測數據與對應的時間同時保存在一個專用的數據結構中。
  • 乾貨 | ImageJ分析時間序列圖像
    在我們以往的分享中我們已經給大家分享了使用ImageJ分析螢光共定位、細胞計數、免疫組織化學的定量、軌跡追蹤、線粒體形態學測量等使用教程,有需要的小夥伴可以去往期查看。活細胞工作站或共聚焦顯微鏡可方便獲得實時、原位、動態的時間序列圖像或視頻,今天給大家分享使用ImageJ分析時間序列圖像。
  • 定量分析方法第26講:Pandas時間序列與日期功能
    類型None生成方法DateOffset對於時間序列數據,通常在Series或DataFrame的索引中表示時間成分,因此可以對時間元素進行操作。與時間序列相關的實例方法轉移/滯後人們可能想要在時間上前後移動或延遲時間序列中的值。這種方法是shift(),它在所有的panda對象上都可用。
  • CFA level2 量化分析 時間序列分析 R6
    時間序列這章,主要包含以下幾種情況:1.線性和對數線性模型2.自回歸模型3.隨機步模型4.復現性模型5.ARCH和多重時間序列模型線性趨勢和對數線性趨勢如下圖所示,左邊為一個線性趨勢的時間序列數據,我們可以很簡單的用線性模型進行表達。而右邊的數據則不是一個線性趨勢,這種情況下,如果我們還繼續用線性模型去表達,就會導致較大的誤差。
  • 關於時間序列分析關鍵注意點的整理與思考
    特別需要注意一點的是,時間序列分析並不是關於時間的回歸,它主要是研究自身的變化規律。時間序列分析有何意義?當你想對一個序列進行預測時,首先要完成分析這個步驟。而且時間序列的預測也具有極大商業價值,如企業的供求量、網站的訪客量以及股票價格等,都是極其重要的時間序列數據。
  • 掌握Pandas時間序列分析的20個知識點
    一個簡單的定義是,時間序列數據是包含序列時間戳的數據點。時間序列數據的來源是周期性測量或觀測。我們觀察了許多行業的時間序列數據。舉幾個例子:在這篇文章中,我將列出20點,這將有助於你全面了解如何處理Pandas的時間序列數據處理。
  • 時間序列分析工具箱——sweep
    加載包本教程要使用到四個包:sweep:簡化 forecast 包的使用forecast:提供 ARIMA、ETS 和其他流行的預測算法tidyquant:獲取數據並在後臺加載 tidyverse 系列工具timetk:時間序列數據處理工具,用來將 tbl 轉換成 ts# Load
  • NDVI時間序列分析原理與實現(CV和Sen+MK趨勢分析)
    NDVI時間序列分析原理與實現(CV和Sen+MK趨勢分析)總結兩種常用的NDVI時間序列柵格分析方法,變異係數和Sen+MK趨勢分析。簡單介紹原理和實現代碼。變異係數(Coefficient of Variation, CV)原理變異係數是衡量觀測序列值變異程度的一個統計量,可以很好地反映空間數據在時間序列上變化的差異程度,評價數據時間序列的穩定性。
  • 時間序列分析系列II:數據處理前傳(含缺失值、異常值處理)
    一、SAS入門今天,我們要拋開時間序列分析中常用的Eviews和R軟體,介紹另外一種高大上的統計軟體——Statistical Analysis System,也就是SAS。相比於前兩者,SAS軟體有著它得天獨厚的處理優勢:處理方式靈活多樣,可以根據需求自行更改代碼,且面對海量數據時運行速度也是槓槓的。
  • R語言進行簡單的時間序列分析
    經典的統計分析都假定數據序列具有獨立性,而時間序列分析則側重研究數據序列的互相依賴關係。
  • 數據分析-pandas-時間序列
    直觀來看,由於此時是將6條記錄結果上升為12條記錄結果,而這些數據不會憑空出現,所以如果說下採樣需要聚合、上採樣則需要空值填充,常用方法包括前向填充、後向填充等。這裡我們結合業務實際,採取前向填充的方式,得到2小時採樣結果如下:
  • 詳解抑制有限長時間序列中噪聲的有效方法
    但是,在實際工作中,尤其是基於計算機的離線數據分析,常是沒有必要的,還可能費力不討好。數據時間長度較小時,除非有特別明確的依據和需要,基於經典「線性卷積」濾波的思想和方法是不可取的。有限長時間序列x(n),n=0,1,2,...,N-1,是N維空間中的一點。
  • SAS Tips (20): SAS與時間序列分析
    y= z=;run; y=18417 m=5 y=18417 z=74895(說明sas系統裡面記錄的數據被轉換了,以數值方式呈現,系統以1960年1月1日0時為0,這個時間之後值記錄為正值,之前的值為負值) 3、相關的格式Sas系統中有很多時間方面的格式主要有mmddyyn.和 daten.。
  • 乾貨 | 數據驅動與時間序列實踐
    如果沒有數據來支撐,方案是無法通過的,所以需要用科學的數據方法來支撐即數據驅動。很多人認為,數據驅動就是把一些開源組件湊在一起即可,但是真正在企業實踐中,會發現人才儲備、數據源、數據流、數據分析等一系列問題就開始凸顯出來,並不是技術棧的疊加。什麼是數據驅動?
  • 時間序列分析工具箱——tibbletime
    Week: Tidy Time Series Analysis with tibbletime》原文連結:www.business-science.io/code-tools/2017/10/26/demo_week_tibbletime.html注意:由於軟體包的版本變化,部分代碼被修改,文字有刪減tibbletime 的用途tidy 時間序列分析的未來
  • 時間序列資料庫是數據的未來
    時間序列時代您將能夠分析過去,現在和未來!與僅保留數據最新狀態的舊方法相比,發生了什麼變化?您每分鐘都在生成更多數據!我們正在獲得更好的硬體,存儲和更智能的算法。數據是做任何事情的標準。時間序列數據無處不在即使您不認為自己擁有這種數據,也必須從更廣闊的角度考慮管理的數據。