对pandas中时间窗函数rolling的使用详解


Posted in Python onNovember 28, 2018

在建模过程中,我们常常需要需要对有时间关系的数据进行整理。比如我们想要得到某一时刻过去30分钟的销量(产量,速度,消耗量等),传统方法复杂消耗资源较多,pandas提供的rolling使用简单,速度较快。

函数原型和参数说明

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

window:表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。pandas offset相关可以参考这里。

min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等。对于offset类型,默认为1。

freq:从0.18版本中已经被舍弃。

center:是否使用window的中间值作为label,默认为false。只能在window是int时使用。

# 为方便观察,并列排列

df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
df.rolling(3, min_periods=1).sum()
df.rolling(3, min_periods=1, center=True).sum()
 B B1 B2
0 0.0 0.0 1.0
1 1.0 1.0 3.0
2 2.0 3.0 3.0
3 NaN 3.0 6.0
4 4.0 6.0 4.0

win_type:窗口类型,默认为None一般不特殊指定,了解支持的其他窗口类型,参考这里。

on:对于DataFrame如果不使用index(索引)作为rolling的列,那么用on来指定使用哪列。

closed:定义区间的开闭,曾经支持int类型的window,新版本已经不支持了。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为left both等。

axis:方向(轴),一般都是0。

举例

一个简单的场景,从A向B运送东西,我们想看一下以3秒作为一个时间窗运送的量。

# A地有两个仓库,都运往B。
df = pd.DataFrame({'1': ['A1', 'A2', 'A1', 'A2', 'A2', 'A1', 'A2'],
     '2': ['B1', 'B1', 'B1', 'B1', 'B1', 'B1', 'B1'],
     'num': [1,2,1,3,4,2,1]}, 
     index = [pd.Timestamp('20130101 09:00:00'),
       pd.Timestamp('20130101 09:00:01'),
       pd.Timestamp('20130101 09:00:02'),
       pd.Timestamp('20130101 09:00:03'),
       pd.Timestamp('20130101 09:00:04'),
       pd.Timestamp('20130101 09:00:05'),
       pd.Timestamp('20130101 09:00:06')])
# 1 2 num
# 2013-01-01 09:00:00 A1 B1 1
# 2013-01-01 09:00:01 A2 B1 2
# 2013-01-01 09:00:02 A1 B1 1
# 2013-01-01 09:00:03 A2 B1 3
# 2013-01-01 09:00:04 A2 B1 4
# 2013-01-01 09:00:05 A1 B1 2
# 2013-01-01 09:00:06 A2 B1 1

使用rolling进行计算

# 首先我们先对groupby进行聚合(如果只有从A->B,那么不用聚合一个rolling就可以)
# 以9:00:04秒为例,由于时间窗是3s,默认的closed是right,所以我们相加04,03,02秒的num,共有4+3+0=7
df.groupby(['1', '2'])['num'].rolling('3s').sum()
# 1 2      
# A1 B1 2013-01-01 09:00:00 1.0
#   2013-01-01 09:00:02 2.0
#   2013-01-01 09:00:05 2.0
# A2 B1 2013-01-01 09:00:01 2.0
#   2013-01-01 09:00:03 5.0
#   2013-01-01 09:00:04 7.0
#   2013-01-01 09:00:06 5.0
# Name: num, dtype: float64

由于使用groupby,所以最后的结果是MultiIndex,想使用正常格式在DataFrame上使用reset_index()即可。

以上这篇对pandas中时间窗函数rolling的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编程中time模块的一些关键用法解析
Jan 19 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
Python使用smtplib模块发送电子邮件的流程详解
Jun 27 Python
Python删除Java源文件中全部注释的实现方法
Aug 30 Python
python 实现在txt指定行追加文本的方法
Apr 29 Python
Python设计模式之原型模式实例详解
Jan 18 Python
python实现计数排序与桶排序实例代码
Mar 28 Python
Django 实现图片上传和显示过程详解
Jul 18 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 #Python
使用python对文件中的数值进行累加的实例
Nov 28 #Python
python的concat等多种用法详解
Nov 28 #Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 #Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 #Python
在python中只选取列表中某一纵列的方法
Nov 28 #Python
手把手教你如何安装Pycharm(详细图文教程)
Nov 28 #Python
You might like
PHP5/ZendEngine2的改进
2006/10/09 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
微信支付扫码支付php版
2016/07/22 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
js获取url传值的方法
2015/12/18 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
简单使用Python自动生成文章
2014/12/25 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
办公室文员自荐书
2014/02/03 职场文书
地球一小时宣传标语
2014/06/24 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
2015年药店工作总结
2015/04/20 职场文书
canvas 中如何实现物体的框选
2022/08/05 Javascript