[时序数据分析]一、窗口计算

1.窗口计算

窗口选择逻辑示意:

[时序数据分析]一、窗口计算_第1张图片

 

1.1移动窗口

移动窗口rolling()和groupby很像,但没有固定的分组,而是创建一个按一定移动位移动的移动窗口对象。一个数据会参与到多个窗口(集合、分组)中,而groupby中的一个值只能在一个组中

下图演示了一个典型的移动窗口,对原数据按照固定大小的窗口依次移动,直至全部覆盖数据

[时序数据分析]一、窗口计算_第2张图片

 1.2扩展窗口

“扩展”(expanding)是从数据(大多数情况下是时间)的起初处开始窗口,增加窗口直到指定的大小。一般所有的数据都会参与所有窗口

下图是一个典型的扩展窗口,设置了一个最小起始窗口,然后逐个向后扩展,实现类似累加的效果

[时序数据分析]一、窗口计算_第3张图片

 

1.3指数加权移动

指数加权移动对分组中的数据给予不同的权重,用于后面的计算中

2.窗口操作

s.rolling()是移动窗口函数,此函数可以应用于一系列数据,指定参数window=n,并在其上调用适合的统计函数

2.1计算方法

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

逻辑如下:

[时序数据分析]一、窗口计算_第4张图片

 最终形成一个与原数据形状一样的新数据

2.2基本语法

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

2.3移动窗口使用

#先定义一个时序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() #同上

2.5 agg()

使用agg可以调用多个函数,多列使用不同函数或者一列使用多个函数。

#对窗口中的不同列使用不同的计算方法
df.rolling('2D').agg({'A':sum,'B':np.std})

#对同一列使用多个函数,同时对不同函数计算出的列命名
df.A.rolling('2D').agg({'A_sum':sum,'A_std':np.std})

2.6 apply()

apply可以在窗口上实现自定义函数,要求应用此函数后产生一个单一值,因为窗口计算后每个窗口产生的也是唯一值

#对窗口求和再加1,最终求绝对值
df.A.rolling('2D').apply(lambda x:abs(sum(x)))

2.7 扩展窗口

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;依次类推,直至全部计算完毕

运行逻辑如下:

[时序数据分析]一、窗口计算_第5张图片

 

你可能感兴趣的:(数据分析,数据挖掘)