前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图解pandas的窗口函数rolling

图解pandas的窗口函数rolling

原创
作者头像
皮大大
发布2023-04-08 16:04:18
2.8K02
代码可运行
发布2023-04-08 16:04:18
举报
文章被收录于专栏:机器学习/数据可视化
运行总次数:2
代码可运行

公众号:尤而小屋 作者:Peter 编辑:Peter

大家好,我是Peter~

图解pandas的窗口函数rolling

在我们处理数据,尤其是和时间相关的数据中,经常会听到移动窗口、滑动窗口或者移动平均、窗口大小等相关的概念。

今天给大家介绍一个pandas中常用来处理滑动窗口的函数:rolling。这个函数极其重要,希望你花时间看完文章和整个图解过程。

本文关键词:pandas、滑动窗口、移动平均、rolling

模拟数据

首先导入两个常用的包,用于模拟数据:

In 1:

代码语言:python
代码运行次数:0
复制
import numpy as np
import pandas as pd

模拟一份简单的数据

In 2:

代码语言:txt
复制
data = pd.DataFrame({"col1": np.arange(10)})
data

rolling参数

下面是rolling函数的具体参数和解释:

代码语言:python
代码运行次数:2
复制
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,默认Noneoffset情况下,默认为1。offset类型是专门针对时间类型
  • center: 把窗口的标签设置为居中。布尔类型,默认False,向右对齐。
  • win_type:窗口的类型。截取窗的各种函数。字符串类型,默认为None
  • on:可选参数;对于dataframe而言,指定要计算滚动窗口的列,值可以是dataframe中的列名。
  • axis:int或者字符串;如果是0或者index,则按照行进行计算,如果是1或者columns,则按照列进行计算。默认是0,即对列进行计算
  • closed:用于定义区间的开闭,支持int类型的窗口window。对于offset类型默认是左开右闭,即默认为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()

相关系数

参数window

使用3个滑动窗口,计算平均值。

In 3:

代码语言:txt
复制
data.rolling(3).mean()   # 求均值

# 等效
# data.rolling(3, axis=0).mean() 

结果为:

如何通过图解的形式来理解?看下面的图示:

  • 第一个元素0:往前数3个元素(包含本身),NaN、NaN、0;均值是NaN
  • 第二个元素1:往前数3个元素(包含本身),NaN、1、1;均值为NaN
  • 第三个元素2:往前数3个元素(包含本身),0、1、2;均值为( 0 + 1 + 2 ) / 3 = 1
  • 第四个元素3:往前数3个元素(包含本身),1、2、3;均值为( 1 + 2 + 3 ) / 3 = 2
  • 第五个元素4:往前数3个元素(包含本身),2、3、4;均值为( 2 + 3 + 4) / 3 = 3
  • 以此类推…

如果是移动之后求和,也是同样的道理:

在这里需要注意的是:pandas或者numpy中的np.nan空值与其他数值相乘或者相加都是nan:

参数min_periods

如何理解参数min_periods?表示的是窗口里面的最小元素数量。min_periods必须小于等于window值

In 9:

代码语言:python
代码运行次数:0
复制
data.rolling(3, min_periods=2).mean()   # 基于min_periods 求平均  
  • 因为在第二个元素1这里,往前数刚好是两个元素,满足min_periods的值,所以能够进行求均值
  • 从第三个元素开始,往前数都满足窗口的3个元素,直接求均值

注意:当min_periods的值大于窗口window的值时,则会报错:

参数center

如何理解参数center?表示的是以当前元素为中心,在上下两个方向进行滑窗然后进行统计计算:

In 11:

代码语言:txt
复制
data.rolling(3, center=True).mean()   # 参数center + 窗口为奇数

具体的过程可以看下面的图解:

  • 第一个元素0:以0为中心,移动3个元素为NaN、0、1,均值为NaN
  • 第二个元素1:以1为中心,移动3个元素为0、1、2,均值为1
  • 第三个元素2:以2为中心,移动3个元素为1、2、3,均值为2
  • 以此类推...
  • 最后一个元素9:以9为中心,移动3个元素为:8、9、NaN;均值为NaN

上面的例子是窗口为3(奇数);如果窗口为偶数呢?

代码语言:python
代码运行次数:0
复制
data.rolling(4, center=True).mean()   # 参数center + 窗口为偶数

具体解释的过程请参考下面的图示:

  • 第一个元素0:以0为“中心”,往前移动2个元素为NaN、NaN,往后移动1个元素为1,NaN、NaN、0、1的均值为NaN
  • 第二个元素1:以1为“中心”,往前移动2个元素为NaN、0,往后移动1个元素为2,NaN、0、1、2的均值为NaN
  • 第三个元素2:以2为“中心”,往前移动2个元素为0、1,往后移动1个元素为3,0、1、2、3的均值为1.5
  • 以此类推...
  • 最后一个元素9:以9为“中心”,往前移动2个元素为7、8,往后移动一个元素为NaN,7、8、9、NaN的均值为NaN

参数center配合min_periods同时使用:

代码语言:python
代码运行次数:0
复制
data.rolling(3, center=True, min_periods=2).mean()   # 参数center 

同样选择窗口为3:

  • 除了第一个和最后一个元素不同;其他相同
  • 因为存在min_periods=2,所以它们能够计算出结果,而不是NaN

参数closed

取值可以为right、left、both和neither

官网的详细解释:

  • right:窗口中的第一个数据点从计算中删除(excluded)
  • left:窗口中的最后一个数据点从计算中删除
  • both:不删除或者排除任何数据点
  • neither:第一个和最后一个数据点从计算中删除

取值1:right

先看看默认情况right

代码语言:python
代码运行次数:0
复制
data.rolling(3).mean()   # 求均值

# 等效于下面的代码  默认是right
# data.rolling(3, closed="right").mean()   

解释过程为这张图:

取值2:left

如果将closed参数改为left呢?

取值3:both

如果取值是both:

代码语言:python
代码运行次数:0
复制
data.rolling(3, closed="both").mean()   

上图的解释:

  • 第一个元素0:往前最多window(3)+1 也就是4个元素,为NaN、NaN、NaN、0,均值为NaN
  • 第二个元素1:往前最多也是4个元素,为NaN、NaN、0、1,均值为NaN
  • 第三个元素2:往前最多也是4个元素,为NaN、0、1、2,但是此时窗口数是3,因此可以计算均值:(0+1+2)/3=1
  • 第四个元素3:往前最多也是4个元素,为0、1、2、3,计算均值:(0+1+2+3)/4=1.5
  • 以此类推...

取值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

具体的解释参考下面的图示:

  • 第一个元素0:排除第一个和最后一个元素后,均为NaN,均值为NaN
  • 第二个元素1:排除第一个和最后一个元素后,为NaN、0,均值为NaN
  • 第三个元素2:排除第一个和最后一个元素后,为0、1,均值为0.5
  • 第一个元素3:排除第一个和最后一个元素后,为1、2,均值为1.5
  • 以此类推…

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图解pandas的窗口函数rolling
  • 模拟数据
  • rolling参数
  • 使用
  • 参数window
  • 参数min_periods
  • 参数center
  • 参数closed
    • 取值1:right
      • 取值2:left
        • 取值3:both
          • 取值4:neither
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档