窗口对象
pandas
中有3类窗口,分别是滑动窗口rolling
、扩张窗口expanding
以及指数加权窗口ewm
。需要说明的是,以日期偏置为窗口大小的滑动窗口将在第十章讨论,指数加权窗口见本章练习。
1. 滑窗对象
要使用滑窗函数,就必须先要对一个序列使用.rolling
得到滑窗对象,其最重要的参数为窗口大小window
。
s = pd.Series([1,2,3,4,5]) roller = s.rolling(window = 3) roller
Rolling [window=3,center=False,axis=0]
在得到了滑窗对象后,能够使用相应的聚合函数进行计算,需要注意的是窗口包含当前行所在的元素,例如在第四个位置进行均值运算时,应当计算(2+3+4)/3,而不是(1+2+3)/3:
roller.mean()
0 NaN 1 NaN 2 2.0 3 3.0 4 4.0 dtype: float64
roller.sum()
0 NaN 1 NaN 2 6.0 3 9.0 4 12.0 dtype: float64
对于滑动相关系数或滑动协方差的计算,可以如下写出:
s2 = pd.Series([1,2,6,16,30]) roller.cov(s2)
0 NaN 1 NaN 2 2.5 3 7.0 4 12.0 dtype: float64
roller.corr(s2)
0 NaN 1 NaN 2 0.944911 3 0.970725 4 0.995402 dtype: float64
此外,还支持使用apply
传入自定义函数,其传入值是对应窗口的Series
,例如上述的均值函数可以等效表示:
roller.apply(lambda x:x.mean())
0 NaN 1 NaN 2 2.0 3 3.0 4 4.0 dtype: float64
shift, diff, pct_change
是一组类滑窗函数,它们的公共参数为periods=n
,默认为1,分别表示取向前第n
个元素的值、与向前第n
个元素做差(与Numpy
中不同,后者表示n
阶差分)、与向前第n
个元素相比计算增长率。这里的n
可以为负,表示反方向的类似操作。
s = pd.Series([1,3,6,10,15]) s.shift(2)
0 NaN 1 NaN 2 1.0 3 3.0 4 6.0 dtype: float64
s.diff(3)
0 NaN 1 NaN 2 NaN 3 9.0 4 12.0 dtype: float64
s.pct_change()
0 NaN 1 2.000000 2 1.000000 3 0.666667 4 0.500000 dtype: float64
s.shift(-1)
0 3.0 1 6.0 2 10.0 3 15.0 4 NaN dtype: float64
s.diff(-2)
0 -5.0 1 -7.0 2 -9.0 3 NaN 4 NaN dtype: float64
将其视作类滑窗函数的原因是,它们的功能可以用窗口大小为n+1
的rolling
方法等价代替:
s.rolling(3).apply(lambda x:list(x)[0]) # s.shift(2)
0 NaN 1 NaN 2 1.0 3 3.0 4 6.0 dtype: float64
s.rolling(4).apply(lambda x:list(x)[-1]-list(x)[0]) # s.diff(3)
0 NaN 1 NaN 2 NaN 3 9.0 4 12.0 dtype: float64
def my_pct(x): L = list(x) return L[-1]/L[0]-1 s.rolling(2).apply(my_pct) # s.pct_change()
0 NaN 1 2.000000 2 1.000000 3 0.666667 4 0.500000 dtype: float64