pandas之視窗函式
為了能更好地處理數值型資料,Pandas 提供了幾種視窗函式,比如移動函式(rolling)、擴充套件函式(expanding)和指數加權函式(ewm)。
視窗函式應用場景非常多。舉一個簡單的例子:現在有 10 天的銷售額,而您想每 3 天求一次銷售總和,也就說第五天的銷售額等於(第三天 + 第四天 + 第五天)的銷售額之和,此時視窗函式就派上用場了。
視窗是一種形象化的叫法,這些函式在執行操作時,就如同視窗一樣在資料區間上移動。
本節學習主要講解如何在 DataFrame 和 Series 物件上應用視窗函式。
rolling()
rolling() 又稱移動視窗函式,它可以與 mean、count、sum、median、std 等聚合函式一起使用。為了使用方便,Pandas 為移動函式定義了專門的方法聚合方法,比如 rolling_mean()、rolling_count()、rolling_sum() 等。其的語法格式如下:
rolling(window=n, min_periods=None, center=False)
常用引數說明如下:
引數名稱 | 說明 |
---|---|
window | 預設值為 1,表示視窗的大小,也就是觀測值的數量, |
min_periods | 表示視窗的最小觀察值,預設與 window 的引數值相等。 |
center | 是否把中間值做為視窗標準,預設值為 False。 |
下面看一組示例:
- import pandas as pd
- import numpy as np
- #生成時間序列
- df = pd.DataFrame(np.random.randn(8, 4),index = pd.date_range('12/1/2020', periods=8),columns = ['A', 'B', 'C', 'D'])
- print(df)
- #每3個數求求一次均值
- print(df.rolling(window=3).mean())
輸出結果:
A B C D 2020-12-01 0.580058 -0.715246 0.440427 -1.106783 2020-12-02 -1.313982 0.068954 -0.906665 1.382941 2020-12-03 0.349844 -0.549509 -0.806577 0.261794 2020-12-04 -0.497054 0.921995 0.232008 -0.815291 2020-12-05 2.658108 0.447783 0.049340 0.329209 2020-12-06 -0.271670 -0.070299 0.860684 -0.095122 2020-12-07 -0.706780 -0.949392 0.679680 0.230930 2020-12-08 0.027379 -0.056543 -1.067625 1.386399 A B C D 2020-12-01 NaN NaN NaN NaN 2020-12-02 NaN NaN NaN NaN 2020-12-03 -0.128027 -0.398600 -0.424272 0.179317 2020-12-04 -0.487064 0.147147 -0.493745 0.276481 2020-12-05 0.836966 0.273423 -0.175076 -0.074763 2020-12-06 0.629794 0.433160 0.380677 -0.193734 2020-12-07 0.559886 -0.190636 0.529901 0.155006 2020-12-08 -0.317024 -0.358745 0.157580 0.507402
window=3
表示是每一列中依次緊鄰的每 3 個數求一次均值。當不滿足 3 個數時,所求值均為 NaN 值,因此前兩列的值為 NaN,直到第三行值才滿足要求 window =3。求均值的公式如下所示:
(index1+index2+index3)/3
expanding()
expanding() 又叫擴充套件視窗函式,擴充套件是指由序列的第一個元素開始,逐個向後計算元素的聚合值。
下面示例,min_periods = n
表示向後移動 n 個值計求一次平均值:
- import pandas as pd
- import numpy as np
- df = pd.DataFrame(np.random.randn(10, 4),
- index = pd.date_range('1/1/2018', periods=10),
- columns = ['A', 'B', 'C', 'D'])
- print (df.expanding(min_periods=3).mean())
輸出結果:
A B C D 2020-01-01 NaN NaN NaN NaN 2020-01-02 NaN NaN NaN NaN 2020-01-03 -0.567833 0.258723 0.498782 0.403639 2020-01-04 -0.384198 -0.093490 0.456058 0.459122 2020-01-05 -0.193821 0.085318 0.389533 0.552429 2020-01-06 -0.113941 0.252397 0.214789 0.455281 2020-01-07 0.147863 0.400141 -0.062493 0.565990 2020-01-08 -0.036038 0.452132 -0.091939 0.371364 2020-01-09 -0.043203 0.368912 -0.033141 0.328143 2020-01-10 -0.100571 0.349378 -0.078225 0.225649
設定 min_periods=3,表示至少 3 個數求一次均值,計算方式為 (index0+index1+index2)/3,而 index3 的計算方式是 (index0+index1+index2+index3)/3,依次類推。
ewm()
ewm(全稱 Exponentially Weighted Moving)表示指數加權移動。ewn() 函式先會對序列元素做指數加權運算,其次計算加權後的均值。該函式通過指定 com、span 或者 halflife 引數來實現指數加權移動。示例如下:
- import pandas as pd
- import numpy as np
- df = pd.DataFrame(np.random.randn(10, 4),
- index = pd.date_range('12/1/2020', periods=10),
- columns = ['A', 'B', 'C', 'D'])
- #設定com=0.5,先加權再求均值
- print(df.ewm(com=0.5).mean())
輸出結果:
A B C D 2020-12-01 -1.511428 1.427826 0.252652 0.093601 2020-12-02 -1.245101 -0.118346 0.170232 -0.207065 2020-12-03 0.131456 -0.271979 -0.679315 -0.589689 2020-12-04 -0.835228 0.094073 -0.973924 -0.081684 2020-12-05 1.279812 1.099368 0.203033 0.019014 2020-12-06 0.132027 -0.625744 -0.145090 -0.318155 2020-12-07 0.820230 0.371620 0.119683 -0.227101 2020-12-08 1.088283 -0.275570 0.358557 -1.050606 2020-12-09 0.538304 -1.288146 0.590358 -0.164057 2020-12-10 0.589177 -1.514472 -0.613158 0.367322
在資料分析的過程中,使用視窗函式能夠提升資料的準確性,並且使資料曲線的變化趨勢更加平滑,從而讓資料分析變得更加準確、可靠。