对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 Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
Python爬虫框架Scrapy安装使用步骤
Apr 01 Python
python和shell实现的校验IP地址合法性脚本分享
Oct 23 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
Python运算符重载详解及实例代码
Mar 07 Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
Jan 15 Python
Python XlsxWriter模块Chart类用法实例分析
Mar 11 Python
如何使用python把ppt转换成pdf
Jun 29 Python
如何使用python进行pdf文件分割
Nov 11 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
python两种注释用法的示例
Oct 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
1 Tube Radio
2021/03/02 无线电
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
PHP 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
extjs 为某个事件设置拦截器
2010/01/15 Javascript
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
详解写好JS条件语句的5条守则
2019/02/28 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
react 生命周期实例分析
2020/05/18 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
python把一个字符串切开的实例方法
2020/09/27 Python
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
公务员个人自我评价分享
2013/11/06 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
新农村建设汇报材料
2014/08/15 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
礼貌问候语大全
2015/11/10 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
Python3接口性能测试实例代码
2021/06/20 Python
python中if和elif的区别介绍
2021/11/07 Python