簡介
由於系統編輯器限制,代碼行用無序列表表示。
上篇文章中,我們講解了如何對時間數據進行重採樣及重採樣中降採樣和升採樣的概覽和使用方法,通過重採樣我們可以得到任何想要頻率的數據,但是這些數據也是一個時點的數據,那麼就存在這樣一個問題:時點的數據波動較大,某一點的數據不能很好的表現它本身的特性,於是我們就想,能否用一個區間的的數據去表現呢,這樣數據的準確性是不是更好一些呢?因此,引出滑動窗口(移動窗口)的概念,簡單點說,為了提升數據的可靠性,將某個點的取值擴大到包含這個點的一段區間,用區間來進行判斷,這個區間就是窗口。如下面的示意圖所示,其中時間序列數據代表的是15日每日的溫度,現在我們以3天為一個窗口,將這個窗口從左至右依次滑動,統計出3天的平均值作為這個點的值,比如3號的溫度就是1號、2號、3號的平均溫度,通過示意圖我們已經理解了滑動窗口,下面我們就看看pandas中使用的函數及各參數的含義。
pandas.DataFrame.rolling參數詳解
pandas中提供了pandas.DataFrame.rolling這個函數來實現滑動窗口值計算,下面是這個函數的原型:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None),參數含義如下圖:
用法代碼演示
上面我們介紹了滑動窗口的概念及實現函數的參數,下面我們通過代碼演示,依次展示各參數的作用。
import matplotlib.pylab as pltimport numpy as npimport pandas as pdindex=pd.date_range('20190116','20190130')data=[4,8,6,5,9,1,4,5,2,4,6,7,9,13,6]ser_data=pd.Series(data,index=index)
ser_data.rolling(3).mean()
如上圖所示,當窗口開始滑動時,第一個時間點和第二個時間點的時間為空,這是因為這裡窗口長度為3,他們前面的數都不夠3,所以到2019-01-18時,他的數據就是2019-01-16到2019-01-18三天的均值。那麼有人就會這樣想,在計算2019-01-16序列的窗口數據時,雖然不夠窗口長度3,但是至少有當天的數據,那麼能否就用當天的數據代表窗口數據呢?答案是肯定的,這裡我們可以通過min_periods參數控制,表示窗口最少包含的觀測值,小於這個值的窗口長度顯示為空,等於和大於時有值,如下所示:
#表示窗口最少包含的觀測值為1ser_data.rolling(3,min_periods=1).mean()
上面講解了兩個常用的參數,下面我們通過繪圖來觀察原始序列與滑動窗口產生的序列值的關係圖,如下:
index=pd.date_range('20190116','20190216') np.random.seed(2)data=np.random.randint(20,size=len(index))ser_data=pd.Series(data,index=index) plt.figure(figsize=(15, 5)) ser_data.plot(style='r--') ser_data.rolling(3).mean().plot(style='b')
可以從上面的圖中看到通過窗口取的值比原始序列數據更加平穩,這也是為何使用滑動窗口的原因。下節講解時間序列分析中的平穩性和差分法,偏理論,喜歡的小夥伴關注收藏!