当前位置: 移动技术网 > IT编程>脚本编程>Python > 对pandas中时间窗函数rolling的使用详解

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

2018年12月04日  | 移动技术网IT编程  | 我要评论

阳城租房信息,馄饨的包法图解,绿巨人2008存档

在建模过程中,我们常常需要需要对有时间关系的数据进行整理。比如我们想要得到某一时刻过去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的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网