pandas滚动窗口函数rolling参数详解与实战应用
本文详解pandas中rolling函数的核心参数与用法。重点解析window类型(int与offset)、min_periods、center及closed等关键配置,并通过物流场景示例,展示如何结合groupby实现基于时间的滚动聚合计算,提供高效的数据处理方案。
在构建模型时,处理具有时间关联的数据是常见需求。例如,计算过去30分钟内的销量、产量、速度或消耗量等指标。传统方法往往逻辑复杂且资源消耗较大,而利用pandas提供的rolling函数,不仅操作简便,还能显著提升计算效率。
函数原型及参数说明
DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)
window:定义时间窗的大小,支持两种类型(int或offset)。若使用int,数值代表参与统计计算的观测值数量,即向前追溯的数据条数;若使用offset类型,则代表具体的时间窗口大小。关于pandas offset的详细信息可参考相关文档。
min_periods:设定计算所需的最小有效观测值数量。当window为int类型时,默认值与window相等;当window为offset类型时,默认值为1。
freq:该参数自0.18版本起已被移除,不再使用。
center:指定是否以窗口中间值作为标签,默认为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类型,默认值为left open, right close(即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的使用详解即为全部内容,希望能为读者提供参考,并感谢大家的支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













