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

Pandas滚动窗口报错排查及多特征组合滚动求和优化求助

解决方案

核心问题分析

  1. 报错原因:使用rolling('30D')时,pandas需要基于datetime类型的索引或指定时间列计算窗口,你重置索引后生成了整数索引,导致无法识别时间窗口参数。
  2. 效率问题:循环遍历每个MAKE+MODEL组合是低效的,pandas的groupby可以原生支持分组后批量处理,避免Python层面的循环开销。
  3. 重复记录处理:同一日期同一MAKE+MODEL的多条记录,需先聚合为单条,再参与滚动求和。

优化后的代码

import pandas as pd

# 示例数据(包含一条重复日期的测试记录)
data = {'DATE_ADDED': ['2024-03-01', '2024-03-02', '2024-03-03', '2024-03-04', '2024-03-05', '2024-03-06', '2024-03-02'],
        'MAKE': ['Toyota', 'Toyota', 'Toyota', 'Toyota', 'Toyota', 'Toyota', 'Toyota'],
        'MODEL': ['Camry', 'Camry', 'Camry', 'Camry', 'Camry', 'Camry', 'Camry'],
        'MM_1': [10, 20, 30, 40, 50, 60, 25]}
df = pd.DataFrame(data)

# 1. 日期类型转换与排序
df['DATE_ADDED'] = pd.to_datetime(df['DATE_ADDED'])
df = df.sort_values(by=['MAKE', 'MODEL', 'DATE_ADDED'])

# 2. 处理同一日期同一MAKE+MODEL的重复记录
# 按需求取每条记录的第一个MM_1值,若需要求和则把'first'改为'sum'
df_dedup = df.groupby(['DATE_ADDED', 'MAKE', 'MODEL'], as_index=False)['MM_1'].agg('first')

# 3. 分组计算30天滚动求和
df_dedup['MM_1_sum_30d'] = df_dedup.groupby(['MAKE', 'MODEL'])['MM_1'].rolling(
    window='30D',
    on='DATE_ADDED',
    closed='left'  # 可选:控制窗口是否包含当前日期,默认'right',按需调整
).sum().reset_index(drop=True)

print(df_dedup)

代码解释

  1. 日期处理与排序:将DATE_ADDED转为datetime类型,并按MAKE、MODEL、DATE_ADDED排序,确保分组后数据的时间顺序正确。
  2. 去重/聚合:通过groupby合并同一日期、MAKE、MODEL的记录,使用agg('first')保留第一条MM_1值;若需要将同一天的多条MM_1求和,可替换为agg('sum')。
  3. 分组滚动求和:
    • 用groupby(['MAKE', 'MODEL'])对每个组合单独处理;
    • rolling(window='30D', on='DATE_ADDED')指定30天时间窗口,并用on参数指定时间列(无需将日期设为索引);
    • reset_index(drop=True)扁平化滚动计算后的多级索引,与原数据对齐。

关键优化点

  • 取消循环遍历组合,利用pandas向量化操作大幅提升大数据集处理效率;
  • 直接指定on='DATE_ADDED'作为时间基准,彻底解决原代码的索引错误;
  • 先处理重复记录,确保滚动求和的数据源符合需求。

内容的提问来源于stack exchange,提问作者David Andrews

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:50:05