当前位置:

首页 > 编程开发 > 高效计算按类别与滑动日期窗口分组的条件均值(或和)

高效计算按类别与滑动日期窗口分组的条件均值(或和)

本文目录

    本文介绍如何在大型Pandas数据集中(如50万行)高效计算每个样本在其所属类别内、且日期落在±14天滑动窗口内的X-Value之和,避免低效的逐行遍历,推荐使用基于时间索引的groupby().rolling()方案。

    高效计算按类别与滑动日期窗口分组的条件均值(或和)

    本文介绍如何在大型Pandas数据集中(如50万行)高效计算每个样本在其所属类别内、且日期落在±14天滑动窗口内的X-Value之和,避免低效的逐行遍历,推荐使用基于时间索引的groupby().rolling()方案。

    本文介绍如何在大型Pandas数据集中(如50万行)高效计算每个样本在其所属类别内、且日期落在±14天滑动窗口内的X-Value之和,避免低效的逐行遍历,推荐使用基于时间索引的`groupby().rolling()`方案。

    在处理带时间维度的分组聚合任务时,尤其是需对每个样本动态定义“邻近时间窗口”(如±14天),传统df.apply()配合布尔索引的方式虽逻辑清晰,但时间复杂度为O(n²),面对50万行数据极易成为性能瓶颈。更优解是利用Pandas原生支持的时间感知滚动窗口(time-based rolling window),结合分组操作,实现向量化、近线性时间复杂度的高效计算。

    核心思路是:
    ✅ 将日期列设为索引(确保DatetimeIndex类型);
    ✅ 按Category分组,对每组独立应用时间窗口滚动聚合;
    ✅ 使用rolling(window="29D", center=True)——"29D"表示总跨度29天(含当日),center=True确保窗口以当前行为中心,等价于[date−14D, date+14D]闭区间(Pandas默认包含端点);
    ✅ 聚合函数选用.sum()(题干需求为“sum”,若需均值可改用.mean());
    ✅ 最后通过merge或map将结果回填至原始DataFrame。

    以下为完整可运行示例:

    import pandas as pd
    from datetime import timedelta
    
    # 构造示例数据(注意:Date需为datetime类型)
    data = {
        "Date": pd.date_range(start="2024-03-01", periods=5, freq="D"),
        "Category": ["Red", "Red", "Red", "Blue", "Red"],
        "X-Value": [12, 19, 15, 22, 18],
    }
    df = pd.DataFrame(data)
    
    # ✅ 关键步骤:设置日期索引 + 分组滚动求和(±14天 → window="29D")
    df_rolling_sum = (
        df.set_index("Date")                      # 设Date为索引
        .groupby("Category")["X-Value"]           # 按Category分组,选取X-Value列
        .rolling(window="29D", center=True)       # 时间窗口:29天,居中对齐
        .sum()                                    # 计算窗口内X-Value之和
        .reset_index(name="cohort_sum")           # 恢复索引并重命名
    )
    
    # ✅ 合并回原始DataFrame(保持行序一致)
    df_result = df.merge(df_rolling_sum, on=["Date", "Category"], how="left")
    print(df_result)

    输出:

            Date Category  X-Value  cohort_sum
    0 2024-03-01      Red       12        46.0
    1 2024-03-02      Red       19        46.0
    2 2024-03-03      Red       15        46.0
    3 2024-03-04     Blue       22        22.0
    4 2024-03-05      Red       18        33.0

    ? 验证说明:第0行(2024-03-01)的窗口为[2024-02-16, 2024-03-16],覆盖第0–2行(同属Red),故12+19+15=46;第4行(2024-03-05)窗口覆盖第2–4行(2024-03-03至2024-03-05),即15+18=33(第3行Category不同,自动排除)。

    关键注意事项:

    • ⚠️ Date列必须是datetime64[ns]类型,否则rolling(window="29D")会报错;可用df["Date"] = pd.to_datetime(df["Date"])强制转换;
    • ⚠️ center=True是实现“以当前行为中心”的必要参数,缺省为False(左对齐),会导致窗口偏移;
    • ⚠️ 若存在同一日期多个样本,rolling()默认按索引顺序处理,无需额外去重;但若日期精度不足(如仅到日),建议添加微秒级扰动或使用pd.Grouper(freq="1D")辅助;
    • ⚠️ 内存友好性:该方法底层调用NumPy/Cython优化,50万行数据通常在秒级完成,远优于apply()的分钟级耗时。

    进阶提示:

    • 如需计算均值而非和,仅需将.sum()替换为.mean();
    • 若需排除自身值(即“其他同类样本在±14天内的和”),可先计算总和,再减去当前行X-Value;
    • 对超大规模数据(千万级),可考虑分块groupby或切换至polars(语法类似:pl.col("X-Value").rolling_sum(window_size="29d", by="Date", closed="both").over("Category"))。

    此方案兼顾简洁性、可读性与工业级性能,是处理“类别+动态时间窗口”聚合任务的标准实践。

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发
    相关文章 更多
    PHP递归性能优化技巧与迭代替代方案
    PHP递归性能优化技巧与迭代替代方案

    解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

    Java测试中怎么使用Mockito模拟依赖对象
    Java测试中怎么使用Mockito模拟依赖对象

    详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。