对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:表示时间窗的大小,注意有两种形式(intoroffset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。pandasoffset相关可以参考这里。
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() BB1B2 00.00.01.0 11.01.03.0 22.03.03.0 3NaN3.06.0 44.06.04.0
win_type:窗口类型,默认为None一般不特殊指定,了解支持的其他窗口类型,参考这里。
on:对于DataFrame如果不使用index(索引)作为rolling的列,那么用on来指定使用哪列。
closed:定义区间的开闭,曾经支持int类型的window,新版本已经不支持了。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为leftboth等。
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('2013010109:00:00'), pd.Timestamp('2013010109:00:01'), pd.Timestamp('2013010109:00:02'), pd.Timestamp('2013010109:00:03'), pd.Timestamp('2013010109:00:04'), pd.Timestamp('2013010109:00:05'), pd.Timestamp('2013010109:00:06')]) #12num #2013-01-0109:00:00A1B11 #2013-01-0109:00:01A2B12 #2013-01-0109:00:02A1B11 #2013-01-0109:00:03A2B13 #2013-01-0109:00:04A2B14 #2013-01-0109:00:05A1B12 #2013-01-0109:00:06A2B11
使用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() #12 #A1B12013-01-0109:00:001.0 #2013-01-0109:00:022.0 #2013-01-0109:00:052.0 #A2B12013-01-0109:00:012.0 #2013-01-0109:00:035.0 #2013-01-0109:00:047.0 #2013-01-0109:00:065.0 #Name:num,dtype:float64
由于使用groupby,所以最后的结果是MultiIndex,想使用正常格式在DataFrame上使用reset_index()即可。
以上这篇对pandas中时间窗函数rolling的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。