Pandas的窗口函数rolling和expanding用法说明

news2024/11/17 9:58:43

Pandas的窗口函数rolling和expanding

1、rolling 移动窗口

rolling() 移动窗口函数,它可以与 mean、count、sum、median、std 等聚合函数一起使用。为了使用方便,Pandas 为移动函数定义了专门的方法聚合方法,比如 rolling_mean()、rolling_count()、rolling_sum() 等。
其的语法格式如下:

rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)

(1)参数:

  • window:表示时间窗的大小,有两种形式:
    1)使用数值int,则表示观测值的数量,即向前几个数据;
    2)也可以使用offset类型,这种类型较复杂,使用场景较少,此处暂不做介绍;
  • min_periods:每个窗口最少包含的观测值数量,小于这个值的窗口结果为NA。值可以是int,默认None。offset情况下,默认为1;
  • center: 把窗口的标签设置为居中,布尔型,默认False,居右
  • win_type: 窗口的类型。截取窗的各种函数。字符串类型,默认为None;
  • on: 可选参数。对于dataframe而言,指定要计算滚动窗口的列。值为列名。
  • axis: 默认为0,即对列进行计算
  • closed:定义区间的开闭,支持int类型的window。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为left、both等。

(2)用例:

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np

seed = 8
s = pd.Series(range(seed), index=pd.date_range('2023-01-01', periods=seed, freq='1D'))
print(s)

print(s.rolling(window=3).sum())
print(s.rolling(window=3, min_periods=1).sum())
print(s.rolling(window='3D').sum())

结果如下:

2023-01-01    0
2023-01-02    1
2023-01-03    2
2023-01-04    3
2023-01-05    4
2023-01-06    5
2023-01-07    6
2023-01-08    7
Freq: D, dtype: int64
2023-01-01     NaN
2023-01-02     NaN
2023-01-03     3.0
2023-01-04     6.0
2023-01-05     9.0
2023-01-06    12.0
2023-01-07    15.0
2023-01-08    18.0
Freq: D, dtype: float64
2023-01-01     0.0
2023-01-02     1.0
2023-01-03     3.0
2023-01-04     6.0
2023-01-05     9.0
2023-01-06    12.0
2023-01-07    15.0
2023-01-08    18.0
Freq: D, dtype: float64
2023-01-01     0.0
2023-01-02     1.0
2023-01-03     3.0
2023-01-04     6.0
2023-01-05     9.0
2023-01-06    12.0
2023-01-07    15.0
2023-01-08    18.0
Freq: D, dtype: float64

print(s.rolling(window=3).sum())
窗口宽度是3,1月1日前两天无数据,是空值,因此1日和2日的结果都是NaN

2023-01-01     NaN
2023-01-02     NaN
2023-01-03     3.0

print(s.rolling(window=3, min_periods=1).sum())
为了解决上述问题,使用min_periods,如果没有数据,最小窗口就是1 ,所以1日和2日有数据。

2023-01-01     0.0
2023-01-02     1.0
2023-01-03     3.0

print(s.rolling(window=‘3D’).sum())
索引是日期,按索引的日期3天作为窗口宽度,则同使用min_periods=1参数一样的效果。

(3)用法拓展

rolling()函数除了sum(),还支持很多函数,比如:
count() 非空观测值数量
mean() 值的平均值
median() 值的算术中值
min() 最小值
max() 最大
std() 贝塞尔修正样本标准差
var() 无偏方差
skew() 样品偏斜度(三阶矩)
kurt() 样品峰度(四阶矩)
quantile() 样本分位数(百分位上的值)
cov() 无偏协方差(二元)
corr() 相关性(二进制)

还可以与agg聚合函数使用

df = pd.DataFrame({"A": range(5), "B": range(10, 15)})

df.rolling(window=2).agg([np.sum, np.mean, np.std])

结果如下:
在这里插入图片描述

2、expanding 扩展窗口函数

expanding() 扩展窗口函数,扩展是指由序列的第一个元素开始,逐个向后计算元素的聚合值。

(1)参数:

expanding()函数的参数,与rolling()函数的参数用法相同;没有window参数。不固定窗口大小,实现累计计算,即不断扩展。
rolling()函数,是固定窗口大小,进行滑动计算,expanding()函数只设置最小的观测值数量。

expanding()函数,类似cumsum()函数的累计求和,其优势在于还可以进行更多的聚类计算;

(2)用例:

seed =21
df = pd.DataFrame({'a':np.random.randint(20,500,seed),'b':np.random.randint(20,100,seed)}, index=pd.date_range('2020-01-01', periods=seed, freq='1D'))
df.index.name='testdate'

print(df)
print(df.expanding(min_periods=7).max())
print(df.expanding(min_periods=7).min())

最小窗口是7天,所以最大值和最小值,1日到6日都是NaN 。
窗口从7天,不断扩展到全部dataframe记录 。
a列:

2020-01-01 492 ,
一直到最后一天 ,超过了第一天的最大值,max值变化
2020-01-21 499.0
同理b列最大值。

结果如下:

              a   b
testdate           
2020-01-01  492  80
2020-01-02  399  73
2020-01-03  309  58
2020-01-04   66  38
2020-01-05  318  20
2020-01-06  488  29
2020-01-07  328  33
2020-01-08  347  25
2020-01-09  240  47
2020-01-10   80  71
2020-01-11  265  54
2020-01-12   33  65
2020-01-13  396  61
2020-01-14   71  54
2020-01-15   39  49
2020-01-16  189  48
2020-01-17   79  67
2020-01-18  303  62
2020-01-19  482  98
2020-01-20  208  27
2020-01-21  499  43
                a     b
testdate               
2020-01-01    NaN   NaN
2020-01-02    NaN   NaN
2020-01-03    NaN   NaN
2020-01-04    NaN   NaN
2020-01-05    NaN   NaN
2020-01-06    NaN   NaN
2020-01-07  492.0  80.0
2020-01-08  492.0  80.0
2020-01-09  492.0  80.0
2020-01-10  492.0  80.0
2020-01-11  492.0  80.0
2020-01-12  492.0  80.0
2020-01-13  492.0  80.0
2020-01-14  492.0  80.0
2020-01-15  492.0  80.0
2020-01-16  492.0  80.0
2020-01-17  492.0  80.0
2020-01-18  492.0  80.0
2020-01-19  492.0  98.0
2020-01-20  492.0  98.0
2020-01-21  499.0  98.0
               a     b
testdate              
2020-01-01   NaN   NaN
2020-01-02   NaN   NaN
2020-01-03   NaN   NaN
2020-01-04   NaN   NaN
2020-01-05   NaN   NaN
2020-01-06   NaN   NaN
2020-01-07  66.0  20.0
2020-01-08  66.0  20.0
2020-01-09  66.0  20.0
2020-01-10  66.0  20.0
2020-01-11  66.0  20.0
2020-01-12  33.0  20.0
2020-01-13  33.0  20.0
2020-01-14  33.0  20.0
2020-01-15  33.0  20.0
2020-01-16  33.0  20.0
2020-01-17  33.0  20.0
2020-01-18  33.0  20.0
2020-01-19  33.0  20.0
2020-01-20  33.0  20.0
2020-01-21  33.0  20.0

(3)用法拓展:

df = pd.DataFrame(
    np.random.rand(6, 4),
    index=pd.date_range("2022-01-01", periods=6),
    columns=["A", "B", "C", "D"],
)
print(df)
print (df.expanding(min_periods=3).mean())

print('mini window 3 mean result:')
print(df.iloc[0:3].mean())

print('last mean result')
print(df['A'].mean(),df['B'].mean(),df['C'].mean(),df['D'].mean())

3日的平均值,与df.iloc[0:3].mean() 等价。
6日的平均值,与df[‘A’].mean(),df[‘B’].mean(),df[‘C’].mean(),df[‘D’].mean()等价,或者是df.mean()等价 。
结果如下:

                   A         B         C         D
2022-01-01  0.697834  0.100287  0.652869  0.207896
2022-01-02  0.495769  0.010228  0.033768  0.311194
2022-01-03  0.404906  0.814433  0.447700  0.369165
2022-01-04  0.148014  0.980413  0.869525  0.760739
2022-01-05  0.925820  0.322119  0.363028  0.927978
2022-01-06  0.988882  0.997867  0.419070  0.276822
                   A         B         C         D
2022-01-01       NaN       NaN       NaN       NaN
2022-01-02       NaN       NaN       NaN       NaN
2022-01-03  0.532836  0.308316  0.378112  0.296085
2022-01-04  0.436631  0.476340  0.500966  0.412248
2022-01-05  0.534469  0.445496  0.473378  0.515394
2022-01-06  0.610204  0.537558  0.464327  0.475632
mini window 3 mean result:
A    0.532836
B    0.308316
C    0.378112
D    0.296085
dtype: float64
last mean result
0.6102041426142952 0.5375578633503776 0.4643265893696882 0.47563227350705956

再次理解一下扩展窗口的含义:
表示至少 3 个数求一次均值,计算方式为
A2=(A0+A1+A2)/3,
A3=(A0+A1+A2+A3)/4
A4=(A0+A1+A2+A3+A4)/5
A5 A6 依次类推。

df = pd.DataFrame({'a':range(5)})
print(df)
print(df.rolling(window=len(df), min_periods=1).mean())
print(df.expanding(min_periods=1).mean())

当rolling()函数的参数window=len(df)时,实现的效果与expanding()函数是一样的。结果如下:

     a
0  0
1  1
2  2
3  3
4  4
     a
0  0.0
1  0.5
2  1.0
3  1.5
4  2.0
     a
0  0.0
1  0.5
2  1.0
3  1.5
4  2.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/642194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArduPilot之H743自动PID调节

ArduPilot之H743自动PID调节 1. 源由2. 涉及参数2.1 AUTOTUNE_*2.2 RCx_OPTION 3. 自动校准3.1 预准备3.2 参数配置3.3 操作步骤 4. 实操&总结5. 参考资料6. 补充视频 1. 源由 ArduCopter可以自动通过算法来对PID进行调优,不过这里有个前提是模型噪声要比较少。…

Mysql数据库的初体验

数据库管理系统是一个由因相互关联的数据的集合和一组用访问这些数据的程序组成,这个数据集合通常称作数据库,其中包含了关于某个企业的信息。DBMS的主要目标就是提供一种可以方便高效的存取数据库信息的途径。 一、数据库的基本概念 1.数据库的组成 ①…

一文让你了解appium自动化的工作原理

目录 前言: 一、Appium加载的过程图解 二、初步认识appium工作过程 三、bootstrap介绍 四、所使用的技术 五、Capabilities 六、自我理解的工作原理 前言: Appium是一个流行的开源自动化测试框架,支持移动应用程序的自动化测试。 一…

Varnish开源HTTP反向代理缓存服务器

第三阶段基础 时 间:2023年6月13日 参加人:全班人员 内 容: Varnish 目录 Varnish 端口号:TCP/6081 TCP/6082 配置文件:/etc/varnish/default.vcl 安装部署: 测试功能: Varnish V…

6月14日晚 19:00公开课直播 | 入门必看:40min 掌握低代码基础功能

大家好,新一期「ONEIN 公开课」要和大家见面啦! Onein 公开课介绍 Onein 公开课,是万应低代码开设的直播课堂,专注低代码领域,希望帮助每一位用户更好的使用万应低代码。 随着低代码的兴起,低代码这一名词…

从小白到大神之路之学习运维第39天---第三阶段---MongoDB非关系型数据库(概述、安装、设置管理员、简单操作、配置文件说明,备份和还原)

第三阶段基础 时 间:2023年6月13日 参加人:全班人员 内 容: 目录 MongoDB概述 端口号:TCP/27017 配置文件:/etc/mongod.conf MongoDb安装部署 MongoDB设置密码 MongoDB操作命令与说明 配置文件说明 备份操作 1. 热备…

chatgpt赋能python:Python怎么居中对齐

Python怎么居中对齐 在Python中,输出对齐是一项基本功能。当我们想要打印表格或美化输出时,居中对齐是一个常见的要求。本文将介绍如何使用Python进行居中对齐,以及一些相关的技术和应用。 如何居中对齐? 要在Python中实现居中…

TypeScript知识汇总

一、ts简介 1、什么是ts 2、ts增加了什么 二、TypeScript开发环境搭建 注:如果npm i运行报错,需要以管理员身份运行一次,以上主要就是tsc xxx.ts 三、ts的基本类型——ts相当于是给js可以指定类型 //number、string、boolean等常用类型&am…

[游戏开发][Unreal]项目启动

新建项目时会有 [项目名].uproject文件,鼠标右键该文件点击Switch Unreal Engine version 如果你的 [项目名].uproject文件是个纯白的图标,证明没有关联到Unreal,该怎么办呢 使用搜索工具搜UnrealVersionSelector.exe 或者直接去你的UE5安装目…

在华为外包待了3年,我秃了,但没变强...

我25岁,中级测试,外包,薪资13.5k,人在上海。内卷什么的就不说了,而且人在外包那些高级精英年薪大几十的咱也接触不到,就说说外包吧。 假设以我为界限,25岁一线城市13.5k,那22-24大部…

J.A.Woollam光谱型椭偏仪电源维修M-2000XI

M-2000系列光谱椭圆仪是为满足薄膜表征的需求而设计的。RCE技术结合了旋转补偿器椭圆仪和CCD检测,在几分之一秒内收集整个光谱(数百个波长),并有多种配置。擅长于从原位监测和过程控制到大面积均匀性绘图和通用薄膜表征的椭偏仪。…

mac m1(arm)安装brew(Homebrew)

安装 使用国内脚本安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装完成后使用brew安装tcping试试 brew install tcping发现报错 Error: Cannot install in Homebrew on ARM processor in Intel default prefi…

应急指挥调度系统之指挥中心是由什么构成的

应急指挥调度系统是应急管理的重要组成部分,而指挥中心则是应急指挥系统的控制中枢,可以说是应急指挥调度系统体系中的大脑,应急管理中的所有应急指令都会从指挥中心发出,作为应急指挥系统的控制中枢,应急指挥调度系统…

5款国产优质软件,满足工作效率提升需求,你值得拥有

不少人对国产软件的印象,还停留在各种弹窗、各种捆绑,想要提升工作效率,只能使用国外的软件。今天给大家分享5款国产优质软件,不仅没有各种弹窗、捆绑,还能满足工作效率提升需求。 亿图脑图MindMaster MindMaster是一款…

聊聊如何利用服务定位器模式按需返回我们需要的服务实例

前言 什么是服务定位器模式 服务定位器是一个了解如何提供各种应用所需的服务(或组件)的对象。在服务定位器中,每个服务(或组件)都只有一个单独的实例,并通过ID 唯一地标识。 用这个 ID 就能从服务定位器中…

JVM 调优分析 如何进行JVM调优

文章目录 1.为什么需要进行JVM调优?2.什么情况下可能需要JVM调优3.JVM调优参数4.JVM调优参数设置参考5.JVM内部结构1. 类加载器(Class Loader)2. 运行时数据区(Runtime Data Area)3. 垃圾收集器(Garbage Co…

css常见布局方式

css常见布局方式 0、前言1、两栏布局1.1 浮动 margin1.2 浮动 BFC(overflow: hidden)1.3 定位 margin-left1.4 给父容器设置flex布局,左盒子固定宽度,然后给右子元素设置 flex: 1。1.5 table布局 2、三栏布局2.1 float布局2.2 …

小红书数据分析:流量手到擒来,热点创作大解密!

年中大促618接近尾声,对小红书来说,这次的“反向”营销博得满堂彩。 为了呼吁大家不要冲动消费,线下举办了“反冲动俱乐部”活动,以“365天无理由退货”、“退货的商品可兑换成小红书现金券”等玩法在一众促销信息中呈现差异化内…

如何从Prometheus单独提取个别数据持久化到InfluxDB

背景 首先解释一个问题,为什么会选择让InfluxDB来持久化Prometheus的数据,直接存在Prometheus中不行吗?下面是Claude的回答,我来总结一下: 1)InfluxDB提供了更强大的Flux查询语言,比如提供了复…

长鑫存储面试(部分)

你平时写代码时,如何保证代码可靠、可复用、可扩展、可维护?有总结经验吗,请举例说明。参考答案 by newBing: 编写文档:编写文档是保证代码可维护性的重要手段。文档应该包括代码的设计思路、实现细节、使用方法等。 遵…