公众号:尤而小屋 作者:Peter 编辑:Peter
大家好,我是Peter~
在我们处理数据,尤其是和时间相关的数据中,经常会听到移动窗口、滑动窗口或者移动平均、窗口大小等相关的概念。
今天给大家介绍一个pandas中常用来处理滑动窗口的函数:rolling
。这个函数极其重要,希望你花时间看完文章和整个图解过程。
本文关键词:pandas、滑动窗口、移动平均、rolling
首先导入两个常用的包,用于模拟数据:
In 1:
import numpy as np
import pandas as pd
模拟一份简单的数据
In 2:
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)
NA
。值可以是int
,默认None
。offset
情况下,默认为1。offset类型是专门针对时间类型False
,向右对齐。None
。dataframe
而言,指定要计算滚动窗口的列,值可以是dataframe
中的列名。int
或者字符串;如果是0或者index,则按照行进行计算,如果是1或者columns,则按照列进行计算。默认是0
,即对列进行计算左开右闭
,即默认为right
,也可以根据具体的情况指定为left、both
等更多的资料到官网学习地址:
https://pandas.pydata.org/docs/reference/window.html
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.rolling.html
一般在使用了移动窗口函数rolling之后,我们需要配合使用相关的统计函数,比如sum、mean、max等。使用最多的是mean函数,生成移动平均值。下面汇总了常用的统计相关函数:
方法 | 描述 |
---|---|
count() | 统计非空数量 |
sum() | 求和 |
mean() | 求均值 |
median() | 求中位数 |
min() | 最小值 |
max() | 最大值 |
std() | 求标准差 |
var() | 有偏方差 |
skew() | 偏度 |
kurt() | 峰度 |
quantile() | 求四分位数 |
apply() | apply函数使用 |
cov() | 无偏方差 |
corr() | 相关系数 |
使用3个滑动窗口,计算平均值。
In 3:
data.rolling(3).mean() # 求均值
# 等效
# data.rolling(3, axis=0).mean()
结果为:
如何通过图解的形式来理解?看下面的图示:
如果是移动之后求和,也是同样的道理:
在这里需要注意的是:pandas或者numpy中的np.nan空值与其他数值相乘或者相加都是nan:
如何理解参数min_periods?表示的是窗口里面的最小元素数量。min_periods必须小于等于window值
In 9:
data.rolling(3, min_periods=2).mean() # 基于min_periods 求平均
注意:当min_periods的值大于窗口window的值时,则会报错:
如何理解参数center?表示的是以当前元素为中心,在上下两个方向进行滑窗然后进行统计计算:
In 11:
data.rolling(3, center=True).mean() # 参数center + 窗口为奇数
具体的过程可以看下面的图解:
上面的例子是窗口为3(奇数);如果窗口为偶数呢?
data.rolling(4, center=True).mean() # 参数center + 窗口为偶数
具体解释的过程请参考下面的图示:
参数center配合min_periods同时使用:
data.rolling(3, center=True, min_periods=2).mean() # 参数center
同样选择窗口为3:
取值可以为right、left、both和neither
官网的详细解释:
先看看默认情况right
data.rolling(3).mean() # 求均值
# 等效于下面的代码 默认是right
# data.rolling(3, closed="right").mean()
解释过程为这张图:
如果将closed参数改为left呢?
如果取值是both:
data.rolling(3, closed="both").mean()
上图的解释:
如果直接使用neither,结果全部为NaN:
解决bug:可以参考pandas官网的issue:https://github.com/pandas-dev/pandas/issues/39038
当close='neither'时,参数min_periods不等于n-1(n为窗口大小),而是等于n。
作为滚动计算的对象窗口里,却至多只剩n-1个值,达不到min_periods的最小窗口值 数(n)的要求。所以我们需要手动将min_periods设置成: n-1
具体的解释参考下面的图示:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。