pandas滑動窗口學習筆記(shift, diff, pct_change)
窗口對象
pandas 中有3類窗口,分別是滑動窗口 rolling 、擴張窗口 expanding 以及指數(shù)加權窗口 ewm 。
滑窗對象
要使用滑窗函數(shù),就必須先要對一個序列使用 .rolling 得到滑窗對象,其最重要的參數(shù)為窗口大小 window 。
In [95]: s = pd.Series([1,2,3,4,5]) In [96]: roller = s.rolling(window = 3) In [97]: roller Out[97]: Rolling [window=3,center=False,axis=0]
在得到了滑窗對象后,能夠使用相應的聚合函數(shù)進行計算,需要注意的是窗口包含當前行所在的元素,例如在第四個位置進行均值運算時,應當計算(2+3+4)/3,而不是(1+2+3)/3:
In [98]: roller.mean() Out[98]: 0 NaN 1 NaN 2 2.0 3 3.0 4 4.0 dtype: float64 In [99]: roller.sum() Out[99]: 0 NaN 1 NaN 2 6.0 3 9.0 4 12.0 dtype: float64
對于滑動相關系數(shù)或滑動協(xié)方差的計算,可以如下寫出:
In [100]: s2 = pd.Series([1,2,6,16,30]) In [101]: roller.cov(s2) Out[101]: 0 NaN 1 NaN 2 2.5 3 7.0 4 12.0 dtype: float64 In [102]: roller.corr(s2) Out[102]: 0 NaN 1 NaN 2 0.944911 3 0.970725 4 0.995402 dtype: float64
此外,還支持使用 apply 傳入自定義函數(shù),其傳入值是對應窗口的 Series ,例如上述的均值函數(shù)可以等效表示:
In [103]: roller.apply(lambda x:x.mean()) Out[103]: 0 NaN 1 NaN 2 2.0 3 3.0 4 4.0 dtype: float64
shift, diff, pct_change 是一組類滑窗函數(shù),它們的公共參數(shù)為 periods=n ,默認為1,這里的 n 可以為負,表示反方向的類似操作。
| 函數(shù) | 說明 |
|---|---|
| shift | 取向前第 n 個元素的值 |
| diff | 與向前第 n 個元素做差(與 Numpy 中不同,后者表示 n 階差分) |
| pct_change | 與向前第 n 個元素相比計算增長率 |
In [104]: s = pd.Series([1,3,6,10,15]) In [105]: s.shift(2) Out[105]: 0 NaN 1 NaN 2 1.0 3 3.0 4 6.0 dtype: float64 In [106]: s.diff(3) Out[106]: 0 NaN 1 NaN 2 NaN 3 9.0 4 12.0 dtype: float64 In [107]: s.pct_change() Out[107]: 0 NaN 1 2.000000 2 1.000000 3 0.666667 4 0.500000 dtype: float64 In [108]: s.shift(-1) Out[108]: 0 3.0 1 6.0 2 10.0 3 15.0 4 NaN dtype: float64 In [109]: s.diff(-2) Out[109]: 0 -5.0 1 -7.0 2 -9.0 3 NaN 4 NaN dtype: float64
將其視作類滑窗函數(shù)的原因是,它們的功能可以用窗口大小為 n+1 的 rolling 方法等價代替
In [110]: s.rolling(3).apply(lambda x:list(x)[0]) # s.shift(2) Out[110]: 0 NaN 1 NaN 2 1.0 3 3.0 4 6.0 dtype: float64 In [111]: s.rolling(4).apply(lambda x:list(x)[-1]-list(x)[0]) # s.diff(3) Out[111]: 0 NaN 1 NaN 2 NaN 3 9.0 4 12.0 dtype: float64 In [112]: def my_pct(x): .....: L = list(x) .....: return L[-1]/L[0]-1 .....: In [113]: s.rolling(2).apply(my_pct) # s.pct_change() Out[113]: 0 NaN 1 2.000000 2 1.000000 3 0.666667 4 0.500000 dtype: float64
擴張窗口
擴張窗口又稱累計窗口,可以理解為一個動態(tài)長度的窗口,其窗口的大小就是從序列開始處到具體操作的對應位置,其使用的聚合函數(shù)會作用于這些逐步擴張的窗口上。具體地說,設序列為a1, a2, a3, a4,則其每個位置對應的窗口即[a1]、[a1, a2]、[a1, a2, a3]、[a1, a2, a3, a4]。
In [114]: s = pd.Series([1, 3, 6, 10]) In [115]: s.expanding().mean() Out[115]: 0 1.000000 1 2.000000 2 3.333333 3 5.000000 dtype: float64
cummax, cumsum 函數(shù)是典型的類擴張窗口函數(shù),請使用 expanding 對象依次實現(xiàn)它們。
s = pd.Series([1, 3, 6, 10]) #cumsum s.expanding().sum() 0 1.000000 1 2.000000 2 3.333333 3 5.000000 dtype: float64 #cummax s.expanding().max() 0 1.0 1 3.0 2 6.0 3 10.0 dtype: float64
指數(shù)加權窗口
作為擴張窗口的 ewm 窗口
在擴張窗口中,用戶可以使用各類函數(shù)進行歷史的累計指標統(tǒng)計,但這些內置的統(tǒng)計函數(shù)往往把窗口中的所有元素賦予了同樣的權重。事實上,可以給出不同的權重來賦給窗口中的元素,指數(shù)加權窗口就是這樣一種特殊的擴張窗口。
其中,最重要的參數(shù)是 alpha,它決定了默認情況下的窗口權重為
wi?=(1−α)i,i∈{0,1,2,...,t},其中i=t 表示當前元素, i=0 表示序列的第一個元素。
從權重公式可以看出,離開當前值越遠則權重越小,若記原序列為 x ,更新后的當前元素為 yt ,此時通過加權公式歸一化后可知:

對于 Series 而言,可以用 ewm 對象如下計算指數(shù)平滑后的序列:
In [118]: np.random.seed(0) In [119]: s = pd.Series(np.random.randint(-1,2,30).cumsum()) In [120]: s.head() Out[120]: 0 -1 1 -1 2 -2 3 -2 4 -2 dtype: int32 In [121]: s.ewm(alpha=0.2).mean().head() Out[121]: 0 -1.000000 1 -1.000000 2 -1.409836 3 -1.609756 4 -1.725845 dtype: float64
到此這篇關于pandas滑動窗口學習筆記(shift, diff, pct_change)的文章就介紹到這了,更多相關pandas滑動窗口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python?PaddleGAN實現(xiàn)照片人物性別反轉
PaddleGAN中的styleganv2editing.py是支持性別編輯的。所以本文將介紹如何通過調整參數(shù),來試著實現(xiàn)一下照片的性別翻轉。感興趣的小伙伴可以學習一下2021-12-12
python和pyqt實現(xiàn)360的CLable控件
這篇文章主要介紹了python和pyqt實現(xiàn)360的CLable控件示例,需要的朋友可以參考下2014-02-02
Python實現(xiàn)手機號自動判斷男女性別(實例解析)
這篇文章主要介紹了Python實現(xiàn)手機號自動判斷男女性別,本文性別判斷主要依靠airtest中的自動化測試實現(xiàn),通過實例代碼給大家講解的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
python使用requests庫提交multipart/form-data請求的方法詳解
multipart/form-data的基礎是post請求,即基于post請求來實現(xiàn)的 ,下面這篇文章主要給大家介紹了關于python使用requests庫提交multipart/form-data請求的相關資料,需要的朋友可以參考下2023-01-01
基于Python3.6中的OpenCV實現(xiàn)圖片色彩空間的轉換
這篇文章主要介紹了基于Python3.6的OpenCV實現(xiàn)圖片色彩空間的轉換,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02

