时点的数据波动较大,某一点的数据不能很好的表现它本身的特性,于是我们就想,能否用一个区间的的数据去表现呢,这样数据的准确性是不是更好一些呢?因此,引出滑动窗口(移动窗口)的概念,简单点说,为了提升数据的可靠性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。如下面的示意图所示,其中时间序列数据代表的是15日每日的温度,现在我们以3天为一个窗口,将这个窗口从左至右依次滑动,统计出3天的平均值作为这个点的值,比如3号的温度就是1号、2号、3号的平均温度,通过示意图我们已经理解了滑动窗口,下面我们就看看pandas中使用的函数及各参数的含义。
滑动窗口示意图
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ||
5 | 7 | 6 | 5 | 9 | 1 | 4 | 5 | 4 | 4 | 6 | 7 | 9 | 13 | 6 | ||
滑窗数=3 | ||||||||||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ||
5 | 7 | 6 | 5 | 9 | 1 | 4 | 5 | 4 | 4 | 6 | 7 | 9 | 13 | 6 | ||
滑窗数=3 | ||||||||||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ||
5 | 7 | 6 | 5 | 9 | 1 | 4 | 5 | 4 | 4 | 6 | 7 | 9 | 13 | 6 | ||
滑窗数=3 | ||||||||||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ||
5 | 7 | 6 | 5 | 9 | 1 | 4 | 5 | 4 | 4 | 6 | 7 | 9 | 13 | 6 | ||
滑窗数=3 | ||||||||||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ||
5 | 7 | 6 | 5 | 9 | 1 | 4 | 5 | 4 | 4 | 6 | 7 | 9 | 13 | 6 | ||
滑窗数=3 |
pandas.DataFrame.rolling参数详解
pandas中提供了pandas.DataFrame.rolling这个函数来实现滑动窗口值计算,下面是这个函数的原型:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None),参数含义如下图:
参数 | 参数说明 |
windws | 滑窗大小,注意两种形式int或者offset。如果使用int,则数值via哦是计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。 |
min_periods | 每个窗口最少包含的观测值数量,小于这个值的窗口结果为NA.值可以是int,默认NONE。offset情况下,默认为1 |
center | 把窗口的标签设置为居中。布尔型默认为False,默认为1。 |
win_type | 窗口的类型。截取窗的各种函数。字符串类型,默认为None |
on | 可选参数。对于dataframe而言,制定要计算滚动窗口的列。值为列名。 |
axis | int、字符串。默认为0,即对列进行计算 |
closed | 定义区间的开闭,支持int类型的Window。offset类型的默认为佐凯右闭的。即默认为right。 |
用法代码演示
上面我们介绍了滑动窗口的概念及实现函数的参数,下面我们通过代码演示,依次展示各参数的作用。
import matplotlib.pylab as pltimport numpy as npimport pandas as pdindex=pd.date_range('20190116','20190130')data=[4,8,6,5,9,1,4,5,2,4,6,7,9,13,6]ser_data=pd.Series(data,index=index)
如上图所示,当窗口开始滑动时,第一个时间点和第二个时间点的时间为空,这是因为这里窗口长度为3,他们前面的数都不够3,所以到2019-01-18时,他的数据就是2019-01-16到2019-01-18三天的均值。那么有人就会这样想,在计算2019-01-16序列的窗口数据时,虽然不够窗口长度3,但是至少有当天的数据,那么能否就用当天的数据代表窗口数据呢?答案是肯定的,这里我们可以通过min_periods参数控制,表示窗口最少包含的观测值,小于这个值的窗口长度显示为空,等于和大于时有值,如下所示:
#表示窗口最少包含的观测值为1ser_data.rolling(3,min_periods=1).mean()
index=pd.date_range('20190116','20190216')np.random.seed(2)data=np.random.randint(20,size=len(index))ser_data=pd.Series(data,index=index)plt.figure(figsize=(15, 5))ser_data.plot(style='r--')ser_data.rolling(3).mean().plot(style='b')