公众号:尤而小屋 大家好,我是Peter~ 在我们处理数据,尤其是和时间相关的数据中,经常会听到移动窗口、滑动窗口或者移动平均、窗口大小等相关的概念。 今天给大家介绍一个pandas中常用来处理滑动窗口的函数: 本文关键词:pandas、滑动窗口、移动平均、rolling 模拟数据首先导入两个常用的包,用于模拟数据: In [1]: import numpy as npimport pandas as pd 模拟一份简单的数据 In [2]: data = pd.DataFrame({"col1": np.arange(10)})data ![]() rolling参数下面是rolling函数的具体参数和解释: DataFrame.rolling(window,min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
更多的资料到官网学习地址: https://pandas.pydata.org/docs/reference/window.html https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.rolling.html 使用一般在使用了移动窗口函数rolling之后,我们需要配合使用相关的统计函数,比如sum、mean、max等。使用最多的是mean函数,生成移动平均值。下面汇总了常用的统计相关函数:
参数window使用3个滑动窗口,计算平均值。 In [3]: data.rolling(3).mean() # 求均值# 等效 # data.rolling(3, axis=0).mean() 结果为: ![]() 如何通过图解的形式来理解?看下面的图示:
![]() 如果是移动之后求和,也是同样的道理: ![]() 在这里需要注意的是:pandas或者numpy中的np.nan空值与其他数值相乘或者相加都是nan: 参数min_periods如何理解参数min_periods?表示的是窗口里面的最小元素数量。min_periods必须小于等于window值 In [9]: data.rolling(3, min_periods=2).mean() # 基于min_periods 求平均
注意:当min_periods的值大于窗口window的值时,则会报错: ![]() 参数center如何理解参数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:
![]() 参数closed取值可以为right、left、both和neither 官网的详细解释:
![]() 取值1:right先看看默认情况right data.rolling(3).mean() # 求均值# 等效于下面的代码 默认是right # data.rolling(3, closed="right").mean() 解释过程为这张图: 取值2:left如果将closed参数改为left呢? ![]() 取值3:both如果取值是both: data.rolling(3, closed="both").mean()![]() 上图的解释:
取值4:neither如果直接使用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 ![]() 具体的解释参考下面的图示:
![]() |
万奢网手机版
官网微博:万奢网服务平台