基于check-ins签到数据高效计算用户共同到访场馆数的实现方法
统计用户对共同到访场馆数量的高效实现方案
原有代码性能瓶颈
- 第一层遍历场馆时反复对全量DataFrame做条件筛选,时间复杂度为O(场馆数*总签到数),数据量大时损耗极高
- 第二层遍历用户对时又对全量组合DataFrame做全局模糊匹配,时间复杂度达到O(组合数²),是运行耗时上百小时的核心原因
优化实现方案
核心思路是利用pandas底层优化的关联和分组能力,完全避免Python层面的循环操作,代码整体只有3个核心步骤:
- 先对签到数据去重,同一个用户在同一场馆的多次签到只保留1条记录,避免重复计数
import pandas as pd # 去重:同一用户同一场馆只保留一条记录 checkins_unique = checkins_2.drop_duplicates(subset=['user_id', 'venue_id'])
- 按场馆ID自连接得到同场馆的所有用户对,直接过滤掉自配对和反向重复配对
# 自连接获取同场馆的所有用户组合 merged_df = checkins_unique.merge(checkins_unique, on='venue_id', suffixes=('_u1', '_u2')) # 过滤:仅保留u1_id < u2_id的组合,同时排除自己和自己配对的情况,避免(A,B)和(B,A)重复计数 merged_df = merged_df[merged_df['user_id_u1'] < merged_df['user_id_u2']]
- 按用户对分组统计共同到访的场馆数量
# 分组计数得到最终结果,venue_id的计数就是两个用户共同到访的场馆数 common_venue_count = merged_df.groupby(['user_id_u1', 'user_id_u2'], as_index=False).agg(共同到访场馆数=('venue_id', 'count'))
性能说明
该方案所有运算均走pandas底层C实现,同等数据量下运行效率是原有循环实现的千倍以上,万级签到记录的场景下通常几秒即可出结果。如果是千万级以上超大规模签到数据,可进一步配合Dask等分布式计算框架实现并行运算。
内容的提问来源于stack exchange,提问作者Mohammad Reza
相关产品推荐
相关产品推荐

