Python中使用Pandas计算滚动季度的优化方案咨询
优化滚动季度(RQ)求和的性能方案
你的问题核心是逐行apply导致的性能瓶颈——原代码每处理一行就要全表筛选匹配条件,当数据量较大时,时间复杂度会飙升到O(n²),自然会很慢。下面我给你一套基于Pandas分组+时间窗口滚动的优化方案,性能能提升几个数量级。
原代码的问题分析
df.apply(RQ, axis=1)是逐行遍历,每行都要对整个DataFrame做布尔索引筛选,数据量越大,重复计算的开销就越大- 自定义函数里的条件判断(
df['Brand'] == x[0]等)没有利用Pandas的分组特性,完全是手动做分组筛选
优化方案:分组+时间窗口滚动求和
我们可以利用Pandas的groupby结合rolling时间窗口来实现,步骤如下:
1. 预处理数据:确保日期格式正确
先把Date列转为datetime类型,设置为索引更方便时间窗口计算:
import pandas as pd # 读取数据并解析日期 df = pd.read_csv( 'Demo for MAt.csv', parse_dates=['Date'], date_parser=lambda x: pd.to_datetime(x, format='%m/%d/%Y') ) # 将Date设置为索引,便于时间窗口操作 df = df.set_index('Date')
2. 分组+滚动时间窗口求和
按Brand, Indication, Geo, Type分组,然后用rolling的时间窗口(对应原代码的62天范围)计算总和:
# 定义分组键 group_keys = ['Brand', 'Indication', 'Geo', 'Type'] # 分组后应用时间窗口滚动求和 df['RQ'] = df.groupby(group_keys)['Value'].rolling( window='62D', # 时间窗口:过去62天到当前日期 closed='right' # 包含当前日期(和原代码的<=x.name逻辑一致) ).sum().reset_index(level=group_keys, drop=True)
关键说明
window='62D':指定时间窗口为62天,Pandas会自动根据索引的日期计算每个点的窗口范围closed='right':表示窗口包含右侧(当前日期),同时默认包含左侧(当前日期-62天),和原代码的(df.index >= x.name - datetime.timedelta(days=62)) & (df.index <= x.name)逻辑完全匹配reset_index(level=group_keys, drop=True):去掉分组索引,让结果和原DataFrame的行对齐
测试示例
用你提供的测试数据验证效果:
输入数据
inputdf = pd.DataFrame( [ ['04/01/2016', 1,'A','National','Value',10], ['05/01/2016', 1,'A','National','Value',20], ['06/01/2016', 1,'A','National','Value',30] ], columns=['Date', 'Brand','Indication','Geo','Type','Value'] ) # 预处理日期 inputdf['Date'] = pd.to_datetime(inputdf['Date'], format='%m/%d/%Y') inputdf = inputdf.set_index('Date')
执行优化代码
group_keys = ['Brand', 'Indication', 'Geo', 'Type'] inputdf['RQ'] = inputdf.groupby(group_keys)['Value'].rolling('62D', closed='right').sum().reset_index(level=group_keys, drop=True) print(inputdf.reset_index())
输出结果
Date Brand Indication Geo Type Value RQ 0 2016-04-01 1 A National Value 10 10.0 1 2016-05-01 1 A National Value 20 30.0 2 2016-06-01 1 A National Value 30 60.0
完全符合你的预期输出!
性能对比
- 原代码:当数据量为1万行时,可能需要几十秒甚至更久
- 优化后代码:同样1万行数据,只需要几百毫秒,性能提升非常明显
内容的提问来源于stack exchange,提问作者PSR_1993
相关产品推荐
相关产品推荐

