Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
高效处理Pandas时间序列数据:7天内事件关联与聚合_创想鸟

高效处理Pandas时间序列数据:7天内事件关联与聚合

高效处理Pandas时间序列数据:7天内事件关联与聚合

本教程探讨如何在Pandas中高效地将一个DataFrame中的事件与另一个DataFrame中特定时间窗口(例如7天内)内的相关事件进行关联和聚合。我们将介绍两种主要方法:利用pyjanitor库的conditional_join进行非等值条件连接,以及纯Pandas的merge与筛选组合。教程将详细演示代码实现,并比较两种方法的优缺点,帮助读者根据实际场景选择最适合的解决方案。

场景描述与问题背景

在数据分析中,我们经常需要处理两个或多个时间序列数据集,并根据特定的时间窗口进行关联。例如,我们可能有一个记录用户交易(trade)的dataframe,以及另一个记录用户浏览历史(view)的dataframe。我们的目标是为每笔交易找出其发生前7天内的所有相关浏览记录,并将其聚合到交易记录中。这里的“相关”不仅指时间上的接近,还包括了用户(person)和商品代码(code)等共同标识符的匹配。

传统的pd.merge_asof函数常用于近似合并,但它通常只为每个源行找到一个最近的匹配项,或者在指定容忍度内进行匹配,但其设计并非为了收集一个源行对应的所有可能匹配项。例如,如果一个交易对应多个浏览记录,merge_asof可能无法将所有这些记录都关联起来,因为它倾向于“消费”匹配到的行。因此,我们需要一种更灵活的方法来实现这种多对多的时间窗口内关联。

数据准备

首先,我们创建两个示例DataFrame来模拟交易数据和浏览历史数据:

import pandas as pdimport janitor # 稍后会用到# 交易数据trade = pd.DataFrame({    'date': ['2019-08-31', '2019-09-01', '2019-09-04'],    'person': [1, 1, 2],    'code': [123, 123, 456],    'value1': [1, 2, 3]})# 浏览历史数据view = pd.DataFrame({    'date': ['2019-08-29', '2019-08-29', '2019-08-30', '2019-08-31', '2019-09-01',             '2019-09-01', '2019-09-01', '2019-09-02', '2019-09-03'],    'person': [1, 1, 1, 2, 1, 2, 2, 1, 2],    'code': [123, 456, 123, 456, 123, 123, 456, 123, 456],    'value': [1, 2, 3, 4, 5, 6, 7, 8, 9]})# 将日期列转换为datetime对象,这是时间序列操作的基础trade['date'] = pd.to_datetime(trade['date'])view['date'] = pd.to_datetime(view['date'])print("交易数据 (trade DataFrame):")print(trade)print("n浏览历史数据 (view DataFrame):")print(view)

解决方案一:使用 pyjanitor.conditional_join (推荐)

pyjanitor库提供了一个强大的conditional_join函数,专门用于执行基于多个条件的非等值连接。它在处理此类时间窗口关联问题时,通常比纯Pandas方法更高效。

实现步骤

创建时间窗口辅助列: 为trade DataFrame添加一个start_date列,表示每笔交易发生日期前7天的起始日期。重命名 view DataFrame 列: 为了避免合并后的列名冲突,并使输出结果更清晰,我们预先重命名view DataFrame中的date和value列。执行条件连接: 使用conditional_join函数,指定以下连接条件:trade.start_date trade.date >= view.view_dates (浏览记录日期不晚于交易日期)trade.person == view.person (用户ID匹配)trade.code == view.code (商品代码匹配)清理与格式化: 删除不再需要的辅助列start_date,并将view_dates列格式化为字符串。聚合结果: 根据trade DataFrame的原始列进行分组,并将匹配到的view_dates和view_values聚合成列表。

示例代码

out_janitor = (trade  .assign(start_date=lambda d: d['date'].sub(pd.DateOffset(days=7))) # 步骤1  .conditional_join(view.rename(columns={'date': 'view_dates', 'value': 'view_values'}), # 步骤2                    ('start_date', 'view_dates', '='),     # 步骤3: 条件2                    ('person', 'person', '=='),       # 步骤3: 条件3                    ('code', 'code', '=='),           # 步骤3: 条件4                    right_columns=['view_dates', 'view_values'] # 保留右侧特定列                   )  .drop(columns='start_date') # 步骤4: 删除辅助列  .assign(view_dates=lambda d: d['view_dates'].dt.strftime('%Y-%m-%d')) # 步骤4: 格式化日期  .groupby(list(trade.columns), as_index=False).agg(list) # 步骤5: 分组聚合)print("n使用 pyjanitor.conditional_join 的结果:")print(out_janitor)

注意事项

pyjanitor是一个第三方库,需要通过pip install pyjanitor安装。conditional_join在处理大型数据集和复杂连接条件时,通常比纯Pandas的merge后筛选更高效,因为它在内部可能使用了更优化的算法。

解决方案二:纯 Pandas 实现

如果不想引入额外的库,也可以纯粹使用Pandas的merge和筛选操作来达到相同的效果。这种方法虽然直观,但在处理大型数据集时,可能会因为生成一个非常大的中间DataFrame而导致性能问题。

实现步骤

执行全量合并: 首先,基于共同的person和code列,对trade和view DataFrame执行一个内连接(merge)。这将生成所有可能的person和code组合的交易与浏览记录。筛选时间窗口: 在合并后的DataFrame上,应用时间窗口筛选条件:trade.date > view.view_dates (浏览记录必须发生在交易之前)trade.date – 7天 格式化与聚合: 将view_dates列格式化为字符串,然后按照trade DataFrame的原始列进行分组,并将匹配到的view_dates和view_values聚合成列表。

示例代码

out_pandas = (trade .merge(view.rename(columns={'date': 'view_dates', 'value': 'view_values'}), # 步骤1: 全量合并并重命名        on=['person', 'code']) .loc[lambda d: d['date'].gt(d['view_dates']) & # 步骤2: 筛选条件1 (浏览在交易之前)      d['date'].sub(pd.DateOffset(days=7)).le(d['view_dates']) # 步骤2: 筛选条件2 (浏览在交易前7天内)     ] .assign(view_dates=lambda d: d['view_dates'].dt.strftime('%Y-%m-%d')) # 步骤3: 格式化日期 .groupby(list(trade.columns), as_index=False).agg(list) # 步骤3: 分组聚合)print("n使用纯 Pandas 实现的结果:")print(out_pandas)

注意事项

这种方法在merge阶段会生成一个包含所有person和code组合的笛卡尔积(如果on条件不唯一),然后才进行时间筛选。如果person和code组合很多,或者每个组合下的交易和浏览记录都很多,这个中间DataFrame可能会非常庞大,占用大量内存并降低性能。对于数据量较小或中等的情况,这种方法是完全可行的,并且不需要额外的库依赖。

结果验证与对比

两种方法都成功生成了预期的输出,为每笔交易关联了其发生前7天内的所有相关浏览记录,并将这些记录的日期和值聚合为列表:

        date  person  code  value1                            view_dates view_values0 2019-08-31       1   123       1              [2019-08-29, 2019-08-30]      [1, 3]1 2019-09-01       1   123       2  [2019-08-29, 2019-08-30, 2019-09-01]   [1, 3, 5]2 2019-09-04       2   456       3  [2019-08-31, 2019-09-01, 2019-09-03]   [4, 7, 9]

可以看到,对于第一笔交易(2019-08-31, person 1, code 123),关联到了2019-08-29和2019-08-30的浏览记录。对于第二笔交易(2019-09-01, person 1, code 123),关联到了2019-08-29、2019-08-30和2019-09-01的浏览记录,这正是merge_asof无法直接实现的多对多关联需求。

总结

本教程介绍了两种在Pandas中处理时间序列数据,实现特定时间窗口内多对多关联和聚合的方法:

pyjanitor.conditional_join: 适用于需要进行复杂非等值连接的场景,尤其是在处理大型数据集时,其性能通常更优。它能够直接在多个条件(包括范围条件)下进行连接,避免了生成巨大的中间DataFrame。纯 Pandas merge + 筛选: 适用于数据量较小或中等的场景,不需要额外库依赖。但其缺点在于可能生成一个非常大的中间DataFrame,从而影响性能和内存使用。

在实际应用中,建议优先考虑pyjanitor.conditional_join,特别是在处理大规模数据时,以获得更好的性能和更简洁的代码。如果项目严格限制外部依赖,且数据规模可控,纯Pandas方案也是一个可行的选择。无论选择哪种方法,将日期列正确转换为datetime对象是进行时间序列操作的关键前提。

以上就是高效处理Pandas时间序列数据:7天内事件关联与聚合的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
重构Python嵌套字典:实现“轴向”层级交换
上一篇 2025年12月14日 09:47:55
Pandas中基于多条件和时间窗口匹配并聚合多条记录
下一篇 2025年12月14日 09:48:11

相关推荐

  • 怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​

    怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​

    使用ai家居设计工具与豆包配合能提升家装效率,具体步骤如下:1. 利用ai工具生成设计方案,上传户型图并设定风格偏好,快速获取多个装修效果图;2. 将ai输出结果整理至豆包,为每个房间建立页面,添加说明、表格及标签以便查阅;3. 结合豆包优化预算和采购计划,记录材料价格并比对市场价,设置提醒避免遗漏…

    2026年9月24日 • 用户投稿
    100
  • sublime怎么以管理员权限保存文件_sublime管理员权限保存技巧

    sublime怎么以管理员权限保存文件_sublime管理员权限保存技巧sublime怎么以管理员权限保存文件_sublime管理员权限保存技巧sublime怎么以管理员权限保存文件_sublime管理员权限保存技巧sublime怎么以管理员权限保存文件_sublime管理员权限保存技巧

    最直接的方法是以管理员身份运行Sublime Text:关闭程序后右键快捷方式选择“以管理员身份运行”,即可编辑并保存系统保护文件。还可通过修改快捷方式属性让其默认以管理员权限启动,或在管理员命令行中调用Sublime打开受保护文件。核心是提升整个程序权限,操作需谨慎,及时关闭高权限实例以保障安全。…

    2026年9月24日 • 用户投稿
    000
  • Debian下GitLab的版本控制策略有哪些

    在debian下搭建和使用gitlab时,可以遵循以下版本控制策略: 服务器配置 选择合适的云服务器配置:根据团队规模和CI/CD需求选择合适的服务器配置。例如,2C8G的服务器适合没有CI/CD需求的小团队,而4C16G+的服务器则适合需求更高的场景。 安装和配置GitLab 安装依赖:安装必要的…

    2026年9月24日
    000
  • Chrome浏览器怎么阻止网站访问剪贴板_剪贴板访问权限管理设置

    Chrome浏览器怎么阻止网站访问剪贴板_剪贴板访问权限管理设置Chrome浏览器怎么阻止网站访问剪贴板_剪贴板访问权限管理设置Chrome浏览器怎么阻止网站访问剪贴板_剪贴板访问权限管理设置Chrome浏览器怎么阻止网站访问剪贴板_剪贴板访问权限管理设置

    首先关闭剪贴板访问权限并清除历史记录,再通过安装扩展程序增强防护,具体操作为进入Chrome设置→隐私和安全→网站设置→剪贴板,关闭请求权限并清除数据,最后添加可信扩展拦截非法调用。 如果您在使用Chrome浏览器时发现某些网站未经允许访问剪贴板内容,可能会影响隐私安全。Chrome提供了对剪贴板访…

    2026年9月24日 • 用户投稿
    100
  • mysql和sql server区别大吗

    mysql和sql server区别大吗mysql和sql server区别大吗mysql和sql server区别大吗mysql和sql server区别大吗

    MySQL和SQL Server的区别在于:1.许可证:MySQL开源免费,SQL Server需要付费许可证;2.平台:MySQL跨平台,SQL Server主要针对Windows;3.数据类型:MySQL提供多种数据类型,SQL Server提供更全面的数据类型;4.查询引擎:MySQL使用In…

    2026年9月24日 • 用户投稿
    100
  • Java中自定义与内置类同名冲突的解决方案:精确导入的实践

    Java中自定义与内置类同名冲突的解决方案:精确导入的实践Java中自定义与内置类同名冲突的解决方案:精确导入的实践Java中自定义与内置类同名冲突的解决方案:精确导入的实践Java中自定义与内置类同名冲突的解决方案:精确导入的实践

    本文探讨了Java中自定义类与内置类(如LinkedList)同名时引发的编译错误。当项目中同时存在自定义LinkedList和java.util.LinkedList时,程序可能错误地引用自定义实现,导致方法找不到。教程指出,通过精确导入java.util.LinkedList而非通配符java.…

    2026年9月24日 • 用户投稿
    200
  • 《忍者龙剑传4》13分钟实机演示 血腥厮杀刺激

    《忍者龙剑传4》13分钟实机演示 血腥厮杀刺激《忍者龙剑传4》13分钟实机演示 血腥厮杀刺激《忍者龙剑传4》13分钟实机演示 血腥厮杀刺激《忍者龙剑传4》13分钟实机演示 血腥厮杀刺激

    近日,team ninja公开了《忍者龙剑传4》长达13分钟的实机游玩画面,展示了主角八云以及游戏中多样的武器系统。本作将于10月21日正式发售,登陆ps5、xsx|s及pc平台,并将在首发当日加入xbox game pass。 实机演示: 《忍者龙剑传4》支持难度自定义设定,无论新人玩家还是系列老…

    2026年9月24日 • 用户投稿
    100
  • 主板的供电相数是不是越多越好?

    主板的供电相数是不是越多越好?主板的供电相数是不是越多越好?主板的供电相数是不是越多越好?主板的供电相数是不是越多越好?

    供电相数并非越多越好,需结合CPU需求和整体设计选择。多相供电可提升稳定性与散热,尤其适合高负载或超频场景,如i7、i9或Ryzen 7/9处理器;但实际效果取决于用料质量,包括MOSFET、电感、电容等级,PWM控制器性能及散热设计。部分主板通过倍相器虚标相数,实际供电能力不足。普通用户搭配i5或…

    2026年9月24日 • 用户投稿
    200
  • fmhy官网安全访问_fmhy中文版官网入口

    fmhy官网安全访问_fmhy中文版官网入口fmhy官网安全访问_fmhy中文版官网入口fmhy官网安全访问_fmhy中文版官网入口fmhy官网安全访问_fmhy中文版官网入口

    Fmhy中文版官网入口为https://fmhy.net/,平台提供影视、动漫、音乐、游戏、软件及教育等资源分类,支持多语言浏览并推荐使用FMHY SafeGuard插件保障安全,所有内容由全球志愿者通过GitHub协作维护,用户可通过Discord参与更新与反馈,确保资源链接的有效性与访问安全性。…

    2026年9月24日 • 用户投稿
    200
  • Debian下Tigervnc如何解决延迟

    Debian下Tigervnc如何解决延迟Debian下Tigervnc如何解决延迟Debian下Tigervnc如何解决延迟Debian下Tigervnc如何解决延迟

    在Debian系统中使用TigerVNC时遇到延迟问题?别担心,本文提供几个优化方案,助您提升远程桌面体验! 首先,检查网络连接至关重要。 不稳定的Wi-Fi连接常常是延迟的罪魁祸首。 优先选择稳定的有线网络连接。 其次,优化TigerVNC服务器配置: 调整屏幕分辨率和颜色深度,降低数据传输量。 …

    2026年9月24日 • 用户投稿
    100
  • AI聊天助手有哪些_好用的AI聊天助手工具大全

    AI聊天助手有哪些_好用的AI聊天助手工具大全AI聊天助手有哪些_好用的AI聊天助手工具大全AI聊天助手有哪些_好用的AI聊天助手工具大全AI聊天助手有哪些_好用的AI聊天助手工具大全

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 豆包:字节跳动推出的免费AI智能助手 问小白:免费AI智能助手,支持DeepSeek满血版 讯飞星火:AI智能助手,支持PPT生成、深度推理 逗逗:AI游戏陪玩,支持原神、黑神话、LOL! 立即…

    2026年9月24日 • 用户投稿
    200
  • sublime怎么把选中的代码片段发送到新的文件_sublime代码片段分离操作方法

    sublime怎么把选中的代码片段发送到新的文件_sublime代码片段分离操作方法sublime怎么把选中的代码片段发送到新的文件_sublime代码片段分离操作方法sublime怎么把选中的代码片段发送到新的文件_sublime代码片段分离操作方法sublime怎么把选中的代码片段发送到新的文件_sublime代码片段分离操作方法

    Sublime Text无一键发送代码到新文件功能,但可通过复制粘贴或拖拽方式快速实现:选中代码→复制→新建文件→粘贴并保存;或直接拖拽选中内容至标签栏创建新文件。 在 Sublime Text 中,目前没有直接的内置功能可以把选中的代码片段“一键发送”到一个新文件。但你可以通过几个简单的手动步骤快…

    2026年9月24日 • 用户投稿
    100
  • AIGC官网检测入口 知网免费查重直达链接

    知网AIGC检测与查重服务面向个人开放,官方入口为https://cx.cnki.net,按2元/千字符收费,提供简洁版与全文版报告,检测结果分四级标识AI生成风险,建议使用前确认学校要求并注意隐私保护。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 …

    2026年9月24日
    500
  • windows怎么查看端口被占用_windows端口占用情况查看教程

    windows怎么查看端口被占用_windows端口占用情况查看教程windows怎么查看端口被占用_windows端口占用情况查看教程windows怎么查看端口被占用_windows端口占用情况查看教程windows怎么查看端口被占用_windows端口占用情况查看教程

    首先通过netstat -ano命令查找占用端口的PID,再用tasklist或资源监视器确定对应进程,最后通过任务管理器或taskkill命令强制结束该进程以释放端口。 如果您尝试在Windows系统上运行某个程序,但提示端口已被占用,则需要定位是哪个进程占用了该端口。以下是详细的排查与解决步骤:…

    2026年9月24日 • 用户投稿
    100
  • mysql和sql server一样吗

    mysql和sql server一样吗mysql和sql server一样吗mysql和sql server一样吗mysql和sql server一样吗

    否,MySQL 和 SQL Server 并非相同。它们是两种不同的关系型数据库管理系统(RDBMS),尽管共享 SQL 兼容性和关系数据模型,但存在以下关键差异:所有权:MySQL 为开源,SQL Server 为专有。许可:MySQL 为免费,SQL Server 为商业许可。架构:MySQL …

    2026年9月24日 • 用户投稿
    100
  • Java字符串处理:高效移除末尾逗号与空格的教程

    Java字符串处理:高效移除末尾逗号与空格的教程Java字符串处理:高效移除末尾逗号与空格的教程Java字符串处理:高效移除末尾逗号与空格的教程Java字符串处理:高效移除末尾逗号与空格的教程

    本教程将详细介绍如何在Java中高效、精确地移除字符串末尾的逗号、空格或其他指定分隔符。我们将探讨使用String.replaceAll()方法结合正则表达式的强大功能,以解决传统replace()方法无法精准定位末尾字符的问题,并提供多种场景下的示例代码与注意事项。 1. 引言:字符串清理的常见挑…

    2026年9月24日 • 用户投稿
    100
  • swoole如何实现协程

    swoole如何实现协程swoole如何实现协程swoole如何实现协程swoole如何实现协程

    swoole在2.0开始内置协程(coroutine)的能力,提供了具备协程能力io接口(统一在命名空间swoolecoroutine*)。 开启协程时请在编译时加入–enable-coroutine编译选项。 协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换。相对于进程或者…

    2026年9月24日 • 用户投稿
    000
  • 抖音视频如何优化封面_抖音视频封面优化的详细技巧

    抖音视频如何优化封面_抖音视频封面优化的详细技巧抖音视频如何优化封面_抖音视频封面优化的详细技巧抖音视频如何优化封面_抖音视频封面优化的详细技巧抖音视频如何优化封面_抖音视频封面优化的详细技巧

    优化抖音封面可显著提升点击率,需选用高清画面、添加醒目文字、统一风格、突出人物表情或关键动作,并通过A/B测试持续优化。 如果您希望提升抖音视频的点击率和曝光量,优化封面是至关重要的一步。一个吸引眼球的封面能够在信息流中脱颖而出,吸引更多用户点击观看。以下是优化抖音视频封面的具体方法: 一、选择高清…

    2026年9月24日 • 用户投稿
    000
  • UC浏览器阅读模式怎么开启_UC浏览器网页小说阅读模式使用教程

    UC浏览器阅读模式怎么开启_UC浏览器网页小说阅读模式使用教程UC浏览器阅读模式怎么开启_UC浏览器网页小说阅读模式使用教程UC浏览器阅读模式怎么开启_UC浏览器网页小说阅读模式使用教程UC浏览器阅读模式怎么开启_UC浏览器网页小说阅读模式使用教程

    开启UC浏览器阅读模式可提升网页小说阅读体验,去除广告并优化排版。2. 可通过菜单按钮手动开启,或等待浏览器自动识别提示进入。3. 对未识别页面可用“readpage://”前缀强制启用阅读模式。 如果您在浏览网页小说时希望获得更清晰、无广告的阅读体验,可以通过开启UC浏览器的阅读模式来优化页面显示…

    2026年9月24日 • 用户投稿
    000
  • 夸克浏览器如何快速清理浏览数据_夸克浏览器数据清理的实用技巧

    夸克浏览器如何快速清理浏览数据_夸克浏览器数据清理的实用技巧夸克浏览器如何快速清理浏览数据_夸克浏览器数据清理的实用技巧夸克浏览器如何快速清理浏览数据_夸克浏览器数据清理的实用技巧夸克浏览器如何快速清理浏览数据_夸克浏览器数据清理的实用技巧

    首先通过设置菜单全面清理浏览数据,包括历史记录、缓存和Cookie;其次使用一键清理工具快速释放空间;还可单独清除特定数据类型;最后启用自动清理机制减少手动操作,保持设备流畅。 如果您在使用夸克浏览器时发现设备存储空间不足或浏览速度变慢,很可能是由于累积了过多的浏览数据。以下是几种快速清理夸克浏览器…

    2026年9月24日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信