窗口选择逻辑示意:
移动窗口rolling()和groupby很像,但没有固定的分组,而是创建一个按一定移动位移动的移动窗口对象。一个数据会参与到多个窗口(集合、分组)中,而groupby中的一个值只能在一个组中
下图演示了一个典型的移动窗口,对原数据按照固定大小的窗口依次移动,直至全部覆盖数据
“扩展”(expanding)是从数据(大多数情况下是时间)的起初处开始窗口,增加窗口直到指定的大小。一般所有的数据都会参与所有窗口
下图是一个典型的扩展窗口,设置了一个最小起始窗口,然后逐个向后扩展,实现类似累加的效果
指数加权移动对分组中的数据给予不同的权重,用于后面的计算中
s.rolling()是移动窗口函数,此函数可以应用于一系列数据,指定参数window=n,并在其上调用适合的统计函数
in:
s = pd.Series(range(1,7))
s.rolling(2).sum()
out:
0 NaN
1 3.0
2 5.0
3 7.0
4 9.0
5 11.0
dtype: float64
逻辑如下:
最终形成一个与原数据形状一样的新数据
df.rolling(window,
min_periods = None,
center = False,
win_type = None,
on = None,
axis = 0
closed = None)
window:必传,如果使用int,表示窗口大小,如果是offset类型,表示时间数据中窗口按照此时间偏移量设定大小
min_periods:每个窗口的最小数据,小于此值窗口的输出值为NaN,offset情况下,默认为1。默认情况下此值取窗口的大小。
win_type:窗口的类型,默认为加权平均,支持非常丰富的窗口函数,如boxcar、triang、blackman、hamming、bartlett、parzen、bohman、blackmanharris、nuttall、barthann、kaiser(beta)、gaussian(std)、general_gaussian (power, width)、slepian (width)、exponential (tau)等。具体算法可参考SciPy库的官方文档:https://docs.scipy.org/doc/scipy/reference/signal.windows.html。
on:可选参数,对于DataFrame要作为窗口的列
closed:窗口的开闭区间定义,支持'right'、'left、'both'或'neither'。对于offset类型,默认是左开右闭,默认为right
#先定义一个时序DataFrame
df = pd.DataFrame(np.random.randn(30,4),
index = pd.date_range('10/1/2020',periods = 30),
columns = ['A','B','C','D'])
#df
#以每两天为一个窗口,在窗口上求平均数
df.rolling(2).mean()
#接下来,用时间偏移作为周期,2D代表两天,与上例相同。不过,使用时间偏移的话,默认的最小观察数据为1,所以第一天也是有数据的,即它自身
df.rolling('2D').mean()
#如果只对一指定列进行窗口计算,可以用以下两个方法之一:
#仅对A列进行窗口计算
df.rolling('2D')['A'].mean()
df.A.rolling('2D').mean() #同上
使用agg可以调用多个函数,多列使用不同函数或者一列使用多个函数。
#对窗口中的不同列使用不同的计算方法
df.rolling('2D').agg({'A':sum,'B':np.std})
#对同一列使用多个函数,同时对不同函数计算出的列命名
df.A.rolling('2D').agg({'A_sum':sum,'A_std':np.std})
apply可以在窗口上实现自定义函数,要求应用此函数后产生一个单一值,因为窗口计算后每个窗口产生的也是唯一值
#对窗口求和再加1,最终求绝对值
df.A.rolling('2D').apply(lambda x:abs(sum(x)))
s.expanding是pandas扩展窗口的实现函数。使用逻辑与s.rolling()一样。rolling窗口大小固定,移动计算。而expanding()只设定最小可计算数量,不固定窗口大小,不断扩展进行计算
#原始数据
s = pd.Series(range(1,7))
s.expanding(2).sum()
expanding()的窗口每一步都在延伸:在第一个元素时,由于限定窗口为2,所以无法计算,结果是NaN;到第二个元素时,窗口内有1和2,算出结果为3;在第三个元素时窗口内已经包含了1、2、3,计算得6;依次类推,直至全部计算完毕
运行逻辑如下: