簡介
上篇文章中,我們講解了如何對時間資料進行重采樣及重采樣中降采樣和升采樣的概覽和使用方法,通過重采樣我們可以得到任何想要頻率的資料,但是這些資料也是一個時點的資料,那麼就存在這樣一個問題:時點的資料波動較大,某一點的資料不能很好的表現它本身的特性,于是我們就想,能否用一個區間的的資料去表現呢,這樣資料的準确性是不是更好一些呢?是以,引出滑動視窗(移動視窗)的概念,簡單點說,為了提升資料的可靠性,将某個點的取值擴大到包含這個點的一段區間,用區間來進行判斷,這個區間就是視窗。如下面的示意圖所示,其中時間序列資料代表的是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),參數含義如下圖:
rolling參數詳解
用法代碼示範
上面我們介紹了滑動視窗的概念及實作函數的參數,下面我們通過代碼示範,依次展示各參數的作用。
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()
window=3
如上圖所示,當視窗開始滑動時,第一個時間點和第二個時間點的時間為空,這是因為這裡視窗長度為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()
min_periods=1
上面講解了兩個常用的參數,下面我們通過繪圖來觀察原始序列與滑動視窗産生的序列值的關系圖,如下:
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')
紅色是原始序列折線圖,藍色是視窗平均時間折線圖
可以從上面的圖中看到通過視窗取的值比原始序列資料更加平穩,這也是為何使用滑動視窗的原因。下節講解時間序列分析中的平穩性和差分法,偏理論,喜歡的小夥伴關注收藏!