Python時間序列分析之 時間重採樣(降採樣和升採樣)

上篇文章中,我們學習瞭如何使用pandas庫中的date_range()函數生成時間序列索引,而且我們知道我們可以生成不同頻率的時間索引,比如按小時、按天、按周、按月等等,因此就會引出另外一個問題,如果我們相對數據做不同頻率的轉換,該怎麼做,pandas庫中是否有現成的方法可供使用呢?帶著這個問題,我們本次就來學習下數據重採樣的知識。

首先,簡單解釋什麼是數據重採樣,所謂數據重採樣就是將數據原有的頻率轉換到另一個頻率上,如果是從低頻率轉換到高頻率,那麼就是升採樣,比如原來的數據是按月統計的,通過升採樣可以轉換為按日的序列數據;相反,如果原來的數據是按日的時間序列數據,通過轉換函數轉換為按月的時間序列數據,那麼我們就將這個過程稱為降採樣。不管是升採樣還是降採樣,都通過pandas中的resample函數完成,下面我們就具體來學習這個函數。

pandas.DataFrame.resample

pandas.DataFrame.resample()這個函數主要是用來對時間序列做頻率轉換,函數原型如下:

DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start', kind=None, loffset=None, limit=None, base=0

, on=None, level=None),各參數含義如下列表:

Python時間序列分析之 時間重採樣(降採樣和升採樣)

重採樣參數含義

降採樣(高頻數據到低頻數據)

上面我們已經知道了重採樣的函數和函數各參數的含義,下面我們就用一個例子演示降採樣的過程。為了方便觀察,這裡我們生成10條日數據,如下:

import pandas as pd
import numpy as np
index=pd.date_range('20190115','20190125',freq='D')
data1=pd.Series(np.arange(len(index)),index=index)
data1
Python時間序列分析之 時間重採樣(降採樣和升採樣)

10條日數據

如上圖,這裡有10條日數據,現在我們將這按日統計的數據通過降採樣的方法轉化為按3日求和統計的數據,如下:

data1.resample(rule='3D',how='sum')
Python時間序列分析之 時間重採樣(降採樣和升採樣)

降採樣

可以看到,原來10條按日統計的數據經過降採樣轉換變為4條(最後一條是2日的數據和)按每3天統計的數據,這就是降採樣的過程,這裡需要注意的是起算的節點。上面的例子中label這個參數默認的是left,現在我們改為right,看看有什麼區別,如下:

data1.resample(rule='3D',how='sum',label='right')
Python時間序列分析之 時間重採樣(降採樣和升採樣)

label=left vs label=right

通過上面的對比,可以得出label這個參數控制了分組後聚合標籤的取值。在label為right的情況下,將取分箱右側的值作為新的標籤。上面這個例子基本上演示了降採樣的過程,當然我們可以調整how這個參數值進行不同的取值,如下:

data1.resample(rule='3D',how='mean')#取3天的平均值
Python時間序列分析之 時間重採樣(降採樣和升採樣)

how=mean

也可以將聚合方法寫到外面,如下:

data1.resample(rule='3D').mean()
Python時間序列分析之 時間重採樣(降採樣和升採樣)

取3天的平均值

取3天的最小值作為新標籤值:

Python時間序列分析之 時間重採樣(降採樣和升採樣)

取3天的最小值

升採樣(低頻數據到高頻數據)

上面演示了降採樣的過程,下面我們演示升採樣的過程,根據升採樣的定義,我們只需在resample函數中改變頻率即可,但與降採樣不同的是升採樣後新增頻率的數為空值,為此,rasample也提供了3種方式進行填充,下面我們通過代碼來演示。

data1.resample(rule='6H').asfreq()
Python時間序列分析之 時間重採樣(降採樣和升採樣)

按6小時進行升採樣

可以看到,將原來的按日的數據進行升採樣為6小時時,會產生很多空值,對於這種空值resample提供了3種方式,分別為ffill(取前面的值)、bfill(取後面的值)、interpolate(線性取值),這裡我們分別進行測試,如下:

data1.resample(rule='6H').ffill()
Python時間序列分析之 時間重採樣(降採樣和升採樣)

按前面的值進行填充

可以看到,在ffill不帶任何數字的情況下,填充了所有的空值,這裡我們可以輸入個數,從而指定要填充的空值個數,如下:

data1.resample(rule='6H').ffill(2)
Python時間序列分析之 時間重採樣(降採樣和升採樣)

填充2個

data1.resample(rule='6H').bfill()
Python時間序列分析之 時間重採樣(降採樣和升採樣)

用後面的值填充

data1.resample(rule='6H').interpolate()
Python時間序列分析之 時間重採樣(降採樣和升採樣)

線性填充

好了,今天的內容到此為止,下篇講時間滑動窗口。喜歡的小夥伴請收藏和關注!


分享到:


相關文章: