Pandas中条件滚动累加的向量化实现

Pandas中条件滚动累加的向量化实现

本文旨在解决Pandas DataFrame中基于条件和时间窗口进行累加计算的效率问题。通过详细分析迭代方法的局限性,并引入Pandas groupby_rolling函数,展示了如何高效地对指定分组内的历史数据在特定时间窗内进行条件求和。教程提供了示例代码,并强调了数据预处理、排序及窗口定义等关键注意事项,以实现高性能的数据分析。

1. 问题背景与低效实现

在数据分析中,我们经常需要对dataframe中的每一行,根据其特定属性(如商店id)和时间戳,回溯查询满足特定条件的历史数据并进行聚合计算。例如,对于每一笔交易,我们可能需要计算在过去15天内同一商店某种特定商品的出现次数。

传统的实现方式通常涉及使用循环(如iterrows())遍历DataFrame的每一行,然后在循环内部对DataFrame进行过滤和计算。这种方法虽然直观,但对于大型数据集而言,其性能瓶颈非常明显,因为它涉及大量的重复数据筛选操作,且Python循环的效率远低于底层优化的Pandas操作。

考虑以下一个典型的低效实现示例:

import pandas as pdimport numpy as npfrom tqdm import tqdm# 示例数据data = pd.DataFrame({    'shop': [1, 2, 1, 2, 1, 2, 1, 2, 1, 2] * 3,    'execution_date': pd.to_datetime(pd.date_range(start='2023-11-01', periods=30, freq='D')),    'item': np.random.choice(['stuff', 'other', 'another'], size=30)})data.loc[data.index % 3 == 0, 'item'] = 'stuff'data.loc[data.index % 7 == 0, 'item'] = 'stuff'cum_items = []data.execution_date = pd.to_datetime(data.execution_date, errors="coerce")subset = data[["shop", "execution_date", "item"]]# 预处理:将需要计数的条件转换为数值(1或0)# 假设我们要计算 'item' 列中 'stuff' 的出现次数subset['is_stuff'] = (subset['item'] == 'stuff').astype(int)for i, row in tqdm(subset.iterrows(), total=len(subset)):    # 过滤条件:同一商店,且日期严格早于当前日期减去15天    fdf = (subset           .loc[(subset.shop == row["shop"])]           .loc[subset.execution_date < (row["execution_date"] - pd.Timedelta(15, unit='d'))]          )    if len(fdf) == 0:         cum_items.append(np.nan)    else:         cum_items.append(fdf['is_stuff'].sum()) # 计算 'stuff' 的出现次数data["cum_items_iter"] = cum_itemsprint("迭代计算结果 (部分):")print(data[['shop', 'execution_date', 'item', 'cum_items_iter']].head(10))

上述代码通过逐行遍历,为每行构建一个子DataFrame并执行过滤和求和操作。对于包含数万甚至数百万行的数据集,这种方法将导致极长的运行时间。

2. 使用 groupby_rolling 进行向量化优化

为了显著提升性能,我们需要利用Pandas的向量化操作。groupby_rolling是处理此类分组-时间窗口聚合问题的强大工具。它允许我们对DataFrame进行分组,并在每个组内定义一个滑动时间窗口进行计算,从而避免显式循环。

核心思想:

数据预处理: 将需要计数的条件(如item == ‘stuff’)转换为数值类型(1或0),以便进行求和。排序: 确保数据按分组键和时间列进行排序,这是rolling操作正确定义时间窗口的前提。分组与滚动: 使用groupby()指定分组键,然后使用rolling()定义时间窗口,并指定基于哪一列进行滚动。聚合: 在每个滚动窗口内执行聚合操作(如sum())。结果对齐: 将rolling操作的结果重新对齐到原始DataFrame的索引。

下面是使用groupby_rolling实现上述需求的向量化代码:

import pandas as pdimport numpy as np# 示例数据(与上文相同)data = pd.DataFrame({    'shop': [1, 2, 1, 2, 1, 2, 1, 2, 1, 2] * 3,    'execution_date': pd.to_datetime(pd.date_range(start='2023-11-01', periods=30, freq='D')),    'item': np.random.choice(['stuff', 'other', 'another'], size=30)})data.loc[data.index % 3 == 0, 'item'] = 'stuff'data.loc[data.index % 7 == 0, 'item'] = 'stuff'# 1. 确保日期列为datetime类型data.execution_date = pd.to_datetime(data.execution_date, errors="coerce")# 2. 预处理:将需要计数的条件转换为数值(1或0)# 假设我们要计算 'item' 列中 'stuff' 的出现次数data['is_stuff'] = (data['item'] == 'stuff').astype(int)# 3. 排序:按商店和日期排序,这对于滚动操作至关重要# 注意:groupby_rolling 可能会打乱原始顺序,因此在计算前排序并保留原始索引是好习惯subset_sorted = data.sort_values(['shop', 'execution_date']).copy()# 4. 使用 groupby_rolling 进行向量化计算# '15D' 定义了一个15天的窗口,包括当前日期并向前追溯15天# on='execution_date' 指定了滚动基于的日期列data['cum_items_vec'] = (subset_sorted.groupby('shop')                                      .rolling('15D', on='execution_date')['is_stuff']                                      .sum()                                      .reset_index(level=0, drop=True) # 移除groupby引入的shop级别索引                                      .reindex(data.index) # 将结果重新对齐到原始DataFrame的索引                                     )# 由于滚动窗口默认包含当前点,如果需要排除当前点,可以进一步处理# 例如,如果'is_stuff'在当前日期为1,则减去它# data['cum_items_vec'] = data['cum_items_vec'] - data['is_stuff']print("n向量化计算结果 (部分):")print(data[['shop', 'execution_date', 'item', 'is_stuff', 'cum_items_vec']].head(10))# 比较迭代和向量化结果(如果窗口定义一致)# 注意:本例中,迭代方法和向量化方法对时间窗口的定义略有不同# 迭代方法:D' < D - 15天 (严格早于15天前)# 向量化方法:[D - 15天, D] (过去15天,包含当前日期)# 因此,结果通常不会完全相同,但向量化方法解决了“过去N天”的常见需求

关于时间窗口的说明:原问题中迭代方法的条件是 subset.execution_date

3. 关键注意事项

数据类型: 确保用于定义时间窗口的列是Pandas的datetime类型。如果不是,需要使用pd.to_datetime()进行转换。数据排序: 在应用groupby_rolling之前,务必根据分组键和时间列对DataFrame进行排序。rolling操作依赖于数据的顺序来正确地构建时间窗口。窗口定义: 理解rolling()函数中时间偏移字符串(如’15D’)的含义。它定义了一个以当前点为终点的固定长度时间窗口。例如,’15D’表示从当前日期开始,向前追溯15天的窗口,包括当前日期。结果对齐: groupby_rolling操作会生成一个带有MultiIndex的Series。为了将结果添加回原始DataFrame,需要使用reset_index(level=0, drop=True)移除分组键作为索引级别,然后使用reindex(data.index)将结果重新对齐到原始DataFrame的索引。条件计数转换为数值: 如果需要对特定条件(如字符串值)进行计数,应先将该条件转换为布尔值(True/False),再转换为整数(1/0),然后进行sum()操作。

4. 总结

通过将低效的iterrows()循环替换为Pandas的groupby_rolling函数,我们能够实现对DataFrame中条件滚动累加计算的显著性能提升。这种向量化方法不仅代码更简洁,而且利用了Pandas底层C语言优化,极大地加快了大数据集的处理速度。掌握groupby_rolling是进行高效时间序列数据分析的关键技能之一。

以上就是Pandas中条件滚动累加的向量化实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369700.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
asyncio 长运行任务的优雅终止策略:告别 cancel() 的局限性
上一篇 2025年12月14日 09:53:16
优雅地终止异步任务:asyncio.Event的实践应用
下一篇 2025年12月14日 09:53:28

相关推荐

  • SublimeText如何进行代码折叠_快速收起和展开代码块技巧

    SublimeText如何进行代码折叠_快速收起和展开代码块技巧SublimeText如何进行代码折叠_快速收起和展开代码块技巧SublimeText如何进行代码折叠_快速收起和展开代码块技巧SublimeText如何进行代码折叠_快速收起和展开代码块技巧

    Sublime Text通过快捷键、侧边栏标记和上下文菜单实现代码折叠,提升代码阅读与导航效率。核心操作包括:Ctrl+Shift+[ / ](折叠/展开当前块)、Ctrl+K, Ctrl+0(折叠所有)、Ctrl+K, Ctrl+J(展开所有),以及按层级折叠和折叠HTML属性。这些功能降低认知负…

    2026年9月29日 • 用户投稿
    100
  • 2025年在线小说阅读网站推荐-完结小说免费观看平台排行

    2025年在线小说阅读网站推荐-完结小说免费观看平台排行2025年在线小说阅读网站推荐-完结小说免费观看平台排行2025年在线小说阅读网站推荐-完结小说免费观看平台排行2025年在线小说阅读网站推荐-完结小说免费观看平台排行

    优先选择番茄小说、七猫小说、飞读小说等大厂平台,资源全且稳定,依托广告免费阅读;起点读书和晋江文学城设有免费专区与限时活动,可定期关注;第三方聚合软件存在版权与稳定性风险,不建议长期依赖。 想找地方看免费的完结小说,现在确实有不少平台可以选择。重点是区分清楚哪些是正规正版的免费平台,哪些可能只是短期…

    2026年9月29日 • 用户投稿
    000
  • 抖音精选联盟带货设置在哪里?新手怎么做抖音精选联盟

    抖音精选联盟带货设置在哪里?新手怎么做抖音精选联盟抖音精选联盟带货设置在哪里?新手怎么做抖音精选联盟抖音精选联盟带货设置在哪里?新手怎么做抖音精选联盟抖音精选联盟带货设置在哪里?新手怎么做抖音精选联盟

    随着抖音的持续火热,越来越多用户开始尝试通过短视频和直播进行商品推广。作为连接商家与创作者的重要桥梁,抖音精选联盟为带货达人和品牌方提供了高效的合作平台。那么,抖音精选联盟的带货功能究竟如何设置?新手又该如何快速上手?本文将为你详细解析。 一、抖音精选联盟带货设置简介 抖音精选联盟是抖音生态中专为电…

    2026年9月29日 • 用户投稿
    100
  • 如何调用IBM Watson的AI服务 Watson自然语言处理API实战

    如何调用IBM Watson的AI服务 Watson自然语言处理API实战如何调用IBM Watson的AI服务 Watson自然语言处理API实战如何调用IBM Watson的AI服务 Watson自然语言处理API实战如何调用IBM Watson的AI服务 Watson自然语言处理API实战

    调用ibm watson的nlp服务主要包括以下步骤:1. 创建ibm cloud账号并开通watson natural language understanding服务;2. 获取api密钥和服务url,建议保存至配置文件或环境变量;3. 使用python构造请求头、请求体并发送post请求进行a…

    2026年9月29日 • 用户投稿
    500
  • VSCode如何通过调试控制台变量赋值测试不同分支逻辑 VSCode 变量赋值测试分支逻辑的新颖调试方法​

    最直接且高效的方法是利用调试控制台进行变量的实时赋值。1. 设置断点:在条件分支语句前或变量定义后设置断点;2. 启动调试:运行程序并在断点处暂停;3. 打开调试控制台:确保调试控制台视图已打开;4. 实时赋值:在控制台输入变量名和目标值,如userrole = ‘admin&#8217…

    2026年9月29日
    100
  • SublimeText运行Go语言程序_Go语言构建系统设置全攻略

    SublimeText运行Go语言程序_Go语言构建系统设置全攻略SublimeText运行Go语言程序_Go语言构建系统设置全攻略SublimeText运行Go语言程序_Go语言构建系统设置全攻略SublimeText运行Go语言程序_Go语言构建系统设置全攻略

    首先确认Go环境已正确安装并配置PATH,接着在Sublime Text中创建Go构建系统:通过Tools→Build System→New Build System输入指定JSON配置并保存为Go.sublime-build,然后打开.go文件按Ctrl+B或Cmd+B运行程序,确保代码包含pac…

    2026年9月29日 • 用户投稿
    100
  • win11输入法不见了怎么办 win11输入法图标消失解决方法

    win11输入法不见了怎么办 win11输入法图标消失解决方法win11输入法不见了怎么办 win11输入法图标消失解决方法win11输入法不见了怎么办 win11输入法图标消失解决方法win11输入法不见了怎么办 win11输入法图标消失解决方法

    输入法无法调出时,先启用桌面语言栏,再运行ctfmon.exe启动进程,检查TextServicesFramework任务,刷新区域格式,重装输入法,修复键盘驱动,最后重启电脑恢复正常使用。 如果您尝试在电脑上输入中文,却发现无法切换或调出输入法,屏幕上只显示英文字符,这通常是因为输入法组件被意外关…

    2026年9月29日 • 用户投稿
    100
  • “狗都不去做运营”?我劝朋友别把吐槽当真理

    “狗都不去做运营”?我劝朋友别把吐槽当真理“狗都不去做运营”?我劝朋友别把吐槽当真理“狗都不去做运营”?我劝朋友别把吐槽当真理“狗都不去做运营”?我劝朋友别把吐槽当真理

    一句吐槽背后,藏着新媒体运营的真实困境 前几天和一位刚转行做新媒体运营三个月的朋友吃饭,她一坐下就叹气:“现在终于明白网上那句‘狗都不去做运营’是什么意思了。” 每天写脚本、拍视频、追热点,忙得连轴转,结果数据忽高忽低,领导还总说“内容不够抓人”。她说,干了这几个月,越来越怀疑自己是不是选错了方向。…

    2026年9月29日 • 用户投稿
    400
  • Elser AI Comics支持哪些绘画风格?如何选择最适合的风格?

    Elser AI Comics支持哪些绘画风格?如何选择最适合的风格?Elser AI Comics支持哪些绘画风格?如何选择最适合的风格?Elser AI Comics支持哪些绘画风格?如何选择最适合的风格?Elser AI Comics支持哪些绘画风格?如何选择最适合的风格?

    要选择最适合的elser ai comics绘画风格,首先需明确创作主题与受众,再结合各风格特点进行匹配。写实风适合现实题材,卡通风适合儿童或幽默内容,日漫风适合青春恋爱类故事,美式漫画风适用于超级英雄或科幻题材,水墨风则适合传统文化表达;其次可参考平台偏好并尝试生成样本图对比效果,必要时也可混合使…

    2026年9月29日 • 用户投稿
    400
  • win10游戏录制功能Game Bar无法使用_Xbox Game Bar打不开或录制失败修复

    win10游戏录制功能Game Bar无法使用_Xbox Game Bar打不开或录制失败修复win10游戏录制功能Game Bar无法使用_Xbox Game Bar打不开或录制失败修复win10游戏录制功能Game Bar无法使用_Xbox Game Bar打不开或录制失败修复win10游戏录制功能Game Bar无法使用_Xbox Game Bar打不开或录制失败修复

    首先检查并启用Xbox Game Bar开关,确保功能开启;接着确认系统版本为Windows 10 22H2或更高;然后修复或重置Xbox Game Bar应用;再检查Xbox Live相关服务是否启动;更新显卡驱动程序以确保兼容性;最后关闭冲突软件并测试快捷键是否生效。 如果您尝试使用Window…

    2026年9月29日 • 用户投稿
    100
  • sublime怎么快速切换两个不同的文件_文件快速切换操作方法

    sublime怎么快速切换两个不同的文件_文件快速切换操作方法sublime怎么快速切换两个不同的文件_文件快速切换操作方法sublime怎么快速切换两个不同的文件_文件快速切换操作方法sublime怎么快速切换两个不同的文件_文件快速切换操作方法

    掌握Sublime Text快速切换文件需熟悉快捷键与技巧:1. Ctrl+P/Cmd+P打开“Go to Anything”模糊搜索文件;2. Ctrl+Tab循环切换标签页;3. Alt/Cmd+数字键切换指定标签;4. 侧边栏点击文件直接切换;5. Ctrl+Shift+R/Cmd+Shift…

    2026年9月29日 • 用户投稿
    100
  • hdp直播如何调节清晰度

    hdp直播如何调节清晰度hdp直播如何调节清晰度hdp直播如何调节清晰度hdp直播如何调节清晰度

    hdp直播是一款备受欢迎的实时视频播放工具,许多用户在使用过程中希望可以根据实际情况灵活切换直播画质,从而提升观看体验。接下来,本文将详细介绍如何在hdp直播中调整清晰度。 首先,启动hdp直播应用程序。进入主界面后,选择你想要观看的正在直播的频道。在直播播放界面中,通常会在右上角或某个固定区域看到…

    2026年9月29日 • 用户投稿
    100
  • Redhad 7改用CentOS7 yum源【亲测】

    1、遇到问题 在RedHat系统中,默认的yum源需要注册到RedHat Subscription Management才能更新。为了避免花费,我们需要替换为国内的yum源。 2、解决办法 由于CentOS和RedHat系统非常相似,替换为CentOS的yum源是可行的,但过程中可能遇到一些挑战。以…

    2026年9月29日
    100
  • 抖音广告如何转化?抖音广告怎么投放

    抖音广告如何转化?抖音广告怎么投放抖音广告如何转化?抖音广告怎么投放抖音广告如何转化?抖音广告怎么投放抖音广告如何转化?抖音广告怎么投放

    在移动互联网时代,抖音已经成为了一个巨大的流量池。众多品牌纷纷入驻抖音,希望通过广告投放实现品牌曝光和用户转化。如何让抖音广告真正转化为实际的销售业绩,成为了一个亟待解决的问题。本文将为您揭秘抖音广告转化的秘密武器,帮助您实现高效转化。 一、了解抖音广告转化流程 在探讨抖音广告转化之前,我们先来了解…

    2026年9月29日 • 用户投稿
    400
  • 调试PHP与MySQL数据库交互时的逻辑错误

    调试php与mysql交互时的逻辑错误需要通过以下步骤:1. sql查询验证:在数据库客户端中运行查询,确保正确执行。2. 数据类型检查:确保php传递的数据类型与数据库字段匹配。3. php逻辑逐步调试:使用var_dump()或print_r()输出变量值。4. 使用事务管理数据一致性。5. 启…

    2026年9月29日
    300
  • 十一出行 这个高效的素材存储中枢一定要提前准备好

    十一出行 这个高效的素材存储中枢一定要提前准备好十一出行 这个高效的素材存储中枢一定要提前准备好十一出行 这个高效的素材存储中枢一定要提前准备好十一出行 这个高效的素材存储中枢一定要提前准备好

    十一黄金周即将到来,许多人都已制定好出行计划,无论是用运动相机记录徒步途中的风景与足迹,还是用无人机航拍海岸线的壮丽曲线,亦或是用手机捕捉街头巷尾的生活气息,这些珍贵瞬间都将成为假期中最动人的回忆。然而,拍摄素材分散在各类设备中,不仅整理麻烦,还存在丢失或损坏的风险。这时,三星 t9 移动固态硬盘便…

    2026年9月29日 • 用户投稿
    100
  • windows怎么开启卓越性能模式_windows卓越性能模式的开启教程

    首先启用卓越性能模式可提升Windows系统性能,具体通过命令提示符输入powercfg命令激活隐藏模式,或使用注册表编辑器手动添加电源方案,还可利用PowerShell脚本实现批量部署,三种方法均需管理员权限操作。 如果您希望提升Windows系统的响应速度和整体性能,尤其是在运行高负载任务时,启…

    2026年9月28日
    200
  • 蝴蝶号如何申请MCN合作 蝴蝶号机构入驻的条件解析

    蝴蝶号如何申请MCN合作 蝴蝶号机构入驻的条件解析蝴蝶号如何申请MCN合作 蝴蝶号机构入驻的条件解析蝴蝶号如何申请MCN合作 蝴蝶号机构入驻的条件解析蝴蝶号如何申请MCN合作 蝴蝶号机构入驻的条件解析

    申请蝴蝶号mcn合作需具备合法企业资质,重点在于展现机构孵化优质内容、管理创作者及持续输出能力;2. 创作者要求注重内容垂直度、质量稳定性、高互动数据与合规性,平台更青睐有特色、深耕领域的账号而非单纯粉丝量;3. 关键材料包括营业执照、机构简介、创作者名单及核心数据(id、粉丝数、播放量、互动率、代…

    2026年9月28日 • 用户投稿
    200
  • UC浏览器开发者模式怎么开启_UC浏览器开发者选项进入方法

    UC浏览器开发者模式怎么开启_UC浏览器开发者选项进入方法UC浏览器开发者模式怎么开启_UC浏览器开发者选项进入方法UC浏览器开发者模式怎么开启_UC浏览器开发者选项进入方法UC浏览器开发者模式怎么开启_UC浏览器开发者选项进入方法

    首先通过地址栏输入uc://debug开启调试,其次在设置中启用实验室功能的网页调试模式,最后可连接电脑Chrome进行远程调试。 如果您希望在UC浏览器中调试网页或查看页面的底层信息,可以通过开启开发者模式来实现。这一功能通常用于分析网页性能、排查加载问题或测试响应式布局。 本文运行环境:小米14…

    2026年9月28日 • 用户投稿
    100
  • Sublime如何为不同项目配置不同运行环境_项目专属构建系统设置

    Sublime如何为不同项目配置不同运行环境_项目专属构建系统设置Sublime如何为不同项目配置不同运行环境_项目专属构建系统设置Sublime如何为不同项目配置不同运行环境_项目专属构建系统设置Sublime如何为不同项目配置不同运行环境_项目专属构建系统设置

    通过创建项目专属构建系统并绑定到具体项目,可在Sublime中实现运行环境隔离。首先新建.sublime-build文件指定执行命令与参数,保存至项目目录或User包路径;随后在项目配置中添加build_systems字段引用该文件,使构建选项仅对该项目生效;进一步可在构建配置中设置env字段修改P…

    2026年9月28日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信