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

 更新时间:2018年11月28日 15:22:04   作者:weijian001  
今天小编就为大家分享一篇对pandas中时间窗函数rolling的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

在建模过程中,我们常常需要需要对有时间关系的数据进行整理。比如我们想要得到某一时刻过去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和GO语言实现的消息摘要算法示例

    Python和GO语言实现的消息摘要算法示例

    这篇文章主要介绍了Python和GO语言实现的消息摘要算法示例,本文讲解了python消息摘要示例、go语言消息摘要示例及各自的运行效果,需要的朋友可以参考下
    2015-03-03
  • python-redis-lock实现锁自动续期的源码逻辑

    python-redis-lock实现锁自动续期的源码逻辑

    这篇文章主要介绍了python-redis-lock实现锁自动续期的源码逻辑,其中用到了多线程threading、弱引用weakref和Lua脚本等相关知识,需要的朋友可以参考下
    2024-07-07
  • Python操作lxml库实战之Xpath篇

    Python操作lxml库实战之Xpath篇

    XPath是一门在XML文档中查找信息的语言,下面这篇文章主要给大家介绍了关于Python操作lxml库实战之Xpath篇的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Python OpenCV形态学运算示例详解

    Python OpenCV形态学运算示例详解

    这篇文章主要为大家介绍了OpenCV中的几个形态学运算,例如:腐蚀&膨胀、开&闭运算、梯度运算、顶帽运算黑帽运算,感兴趣的可以了解一下
    2022-04-04
  • 详解如何用Python模拟登录淘宝

    详解如何用Python模拟登录淘宝

    最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章!本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Python实现mysql数据库中的SQL文件生成和导入

    Python实现mysql数据库中的SQL文件生成和导入

    这篇文章主要介绍了Python实现mysql数据库中的SQL文件生成和导入,首先通过将mysql数据导出到SQL文件中展开详细内容需要的小伙伴可以参考一下
    2022-06-06
  • Python中字符串去空格的五种方法介绍与对比

    Python中字符串去空格的五种方法介绍与对比

    在 Python 中,去除字符串中的空格是一个常见的操作,这篇文章小编将为大家盘点一下python中常用的的去空格的方法,需要的可以参考一下
    2025-02-02
  • 编写python代码实现简单抽奖器

    编写python代码实现简单抽奖器

    这篇文章主要介绍了编写python代码实现简单抽奖器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 如何在VSCode下使用Jupyter的教程详解

    如何在VSCode下使用Jupyter的教程详解

    这篇文章主要介绍了如何在VSCode下使用Jupyter,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Python实现计算圆周率π的值到任意位的方法示例

    Python实现计算圆周率π的值到任意位的方法示例

    这篇文章主要介绍了Python实现计算圆周率π的值到任意位的方法,简单分析了圆周率的计算原理,并结合实例形式分析了Python计算圆周率的相关操作技巧,需要的朋友可以参考下
    2018-05-05

最新评论