You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:12:49