如何计算Query_ID在不同Position下Impressions总和的百分比变化?
解决方案
数据样本
import pandas as pd df_dict = pd.DataFrame({'Query_ID': {692260: 24055, 887923: 9730, 10803: 24055, 885373: 9730, 675813: 9730, 238990: 24055, 930097: 33748, 796353: 9730, 296925: 653, 521574: 24055, 760389: 653, 57514: 23674, 512747: 653, 681778: 9730, 143410: 24055, 824324: 40359, 653270: 9730, 820505: 24055, 178048: 40759, 390705: 9730}, 'Position': {692260: 7.0, 887923: 9.5, 10803: 1.0, 885373: 9.5, 675813: 7.0, 238990: 2.0, 930097: 10.0, 796353: 8.571428571428571, 296925: 3.0, 521574: 5.0, 760389: 8.0, 57514: 1.0, 512747: 5.0, 681778: 7.0, 143410: 1.0, 824324: 9.0, 653270: 7.0, 820505: 9.0, 178048: 2.0, 390705: 4.0}, 'Impressions': {692260: 1, 887923: 2, 10803: 1, 885373: 2, 675813: 1, 238990: 1, 930097: 1, 796353: 21, 296925: 1, 521574: 1, 760389: 1, 57514: 1, 512747: 1, 681778: 2, 143410: 1, 824324: 1, 653270: 6, 820505: 1, 178048: 1, 390705: 1}})

预处理优化(针对百万级数据)
先对数据进行分组聚合,提前计算每个Query_ID+Position组合的Impressions总和,将结果存入字典实现快速查询,避免每次查询遍历全表:
# 分组计算每个Query_ID在对应Position的总曝光 aggregated_data = df_dict.groupby(['Query_ID', 'Position'])['Impressions'].sum() # 转换为字典映射,查询时间复杂度O(1) impression_lookup = aggregated_data.to_dict()
实现目标函数
def calculate_impression_change(query_id, pos1, pos2): # 获取两个位置的总曝光量 sum_pos1 = impression_lookup.get((query_id, pos1), 0) sum_pos2 = impression_lookup.get((query_id, pos2), 0) # 处理边界情况 if sum_pos1 == 0: return "Position_1无曝光数据" if sum_pos2 == 0 else "无法计算(Position_1曝光为0)" # 计算百分比变化:(Position2总曝光/Position1总曝光 - 1) * 100 change_percent = ((sum_pos2 / sum_pos1) - 1) * 100 # 格式化输出为带百分号的整数 return f"{round(change_percent)}%"
逻辑说明
- 聚合预处理:通过
groupby一次性完成所有组合的曝光总和计算,后续查询直接从字典取值,大幅提升百万级数据的查询效率 - 百分比计算:基于你提供的思路转换为增减百分比(原思路中的x是相对倍数,减去100%得到实际变化率)
- 边界处理:覆盖了Position无数据或曝光为0的场景,避免程序报错
示例验证
假设完整数据中Query_ID=9730、Position=7的总曝光为13,Position=4的总曝光为10,调用函数:
calculate_impression_change(9730, 7, 4)
输出:-23%(与你给出的示例匹配)
内容的提问来源于stack exchange,提问作者Mystic
相关产品推荐
相关产品推荐

