本片文章主要参考了该作者的图和内容:
原文链接: 图解pandas的窗口函数rolling-腾讯云开发者社区-腾讯云
1.创建数据
import numpy as np
import pandas as pd
data = pd.DataFrame({"col1": np.arange(10)})
data
数据如下
rolling参数
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
- window:表示时间窗口的大小;可省略不写。两种形式:int和offset。如果使用int,数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗口的大小
- min_periods:每个窗口内最少包含的观测值的数量,如果小于这个值的窗口,则结果为
NA
。值可以是int
,默认None
。offset
情况下,默认为1。offset类型是专门针对时间类型 - center: 把窗口的标签设置为居中。布尔类型,默认
False
,向右对齐。 - win_type:窗口的类型。截取窗的各种函数。字符串类型,默认为
None
。 - on:可选参数;对于
dataframe
而言,指定要计算滚动窗口的列,值可以是dataframe
中的列名。 - axis:
int
或者字符串;如果是0或者index,则按照行进行计算,如果是1或者columns,则按照列进行计算。默认是0
,即对列进行计算 - closed:用于定义区间的开闭,支持int类型的窗口window。对于offset类型默认是
左开右闭
,即默认为right
,也可以根据具体的情况指定为left,both等
一般在使用了移动窗口函数rolling之后,我们需要配合使用相关的统计函数,比如sum、mean、max等。使用最多的是mean函数,生成移动平均值。下面汇总了常用的统计相关函数:
方法 | 描述 |
---|---|
count() | 统计非空数量 |
sum() | 求和 |
mean() | 求均值 |
median() | 求中位数 |
min() | 最小值 |
max() | 最大值 |
std() | 求标准差 |
var() | 有偏方差 |
skew() | 偏度 |
kurt() | 峰度 |
quantile() | 求四分位数 |
apply() | apply函数使用 |
cov() | 无偏方差 |
corr() | 相关系数 |
window参数
使用N个滑动窗口,计算平均值。
closed参数:
取值可以为right、left、both和neither
官网的详细解释:
- right:窗口中的第一个数据点从计算中删除(excluded)
- left:窗口中的最后一个数据点从计算中删除
- both:不删除或者排除任何数据点
- neither:第一个和最后一个数据点从计算中删除
min_periods参数:
表示的是窗口里面的最小元素数量。min_periods必须小于等于window值,当达到min_periods时就可进行窗口统计计算。
代码如下:
data.rolling(window = 3).mean() # 求均值,其默认closed = right
#等效于
data.rolling(window = 3, closed="right").mean()
图解就是:
所以实际上window = 3, 需要考虑的是前三个数据加本身的数据点,拿data[1]来说,就是需要考虑的是[Nan,Nan,0,1],但是由于设置closed = right,所以不计算第一个数据点实际是(Nan+0+1) / 3=Nan。(Nan(x),表示不参与计算)
此时要插一句,pandas或者numpy中的np.nan空值与其他数值相乘或者相加都是nan:
所以不难理解closed = left的结果 :
data.rolling(3, closed="left").mean()
再来看一下closed = both的结果:
data.rolling(3,closed="both").mean()
此时计算结果,看几个特殊计算点:
data[2] = (Nan+0+1+2)/3 但是此时窗口数是3,因此可以计算均值
data[3] = (0+1+2+3)/4
再看一个例子:
data.rolling(3,min_periods=2,closed="both").mean()
看一个特殊计算点其跟原先不变:
data[1] = 0+1/2=0.5
所以总结一下就是:满足min_periods就可以计算,满足窗口大小也可以计算,除数要根据实际计算的数据个数来确定。