Python实现DataFrame唯一值对计数、小时热销品统计及可视化
销售数据统计与可视化实现方案
1. 各小时热销产品表生成
你目前通过res = reshaped.groupby(['Product', 'Hour']).size()得到的是多层索引的Series,索引为(Product, Hour),值为对应产品在对应小时的销量,后续按以下步骤处理即可得到按小时汇总的热销结果表:
- 第一步:将分组计数结果转换为普通DataFrame,给计数列设置明确别名
import pandas as pd # 重置索引,将销量计数转为普通列 count_df = res.reset_index(name='sales_count')
- 第二步:按小时分组,提取每个小时下销量最高的产品记录
# 先按销量倒序排序,再按小时分组取每组第一条,即每个小时销量最高的记录 hour_top_product = count_df.sort_values('sales_count', ascending=False)\ .groupby('Hour', as_index=False)\ .first() # 补全0-23点全小时维度,无销售的小时填充默认值 full_hour_range = pd.DataFrame({'Hour': range(24)}) hour_top_product = full_hour_range.merge( hour_top_product, on='Hour', how='left' ).fillna({'sales_count': 0, 'Product': '无有效销售'})
处理完成后,hour_top_product即为目标结果表,包含三列:Hour(0-23点自然小时)、Product(对应小时销量最高的产品ID)、sales_count(对应产品在该小时的销量)。
注:如果某小时存在多个产品销量并列第一的情况,上述代码默认取排序后第一条记录,可根据业务规则自定义筛选逻辑,比如优先取历史总销量更高的产品。
2. 指定小时销冠产品全时段销量可视化
实现逻辑为:先提取目标小时对应的销冠产品ID,再从全量产品小时销量表中筛选该产品在0-23点的所有销量数据,通过柱状图展示分布即可,参考实现代码如下:
import matplotlib.pyplot as plt # 中文环境下取消注释以下两行解决中文显示异常问题 # plt.rcParams['font.sans-serif'] = ['SimHei'] # plt.rcParams['axes.unicode_minus'] = False def plot_top_prod_hourly_sales(target_hour, count_df, hour_top_product): # 获取目标小时的销冠产品ID top_prod_id = hour_top_product.query("Hour == @target_hour")['Product'].iloc[0] # 提取该产品全时段销量,补全0-23点缺失值 prod_hourly_sales = count_df.query("Product == @top_prod_id")[['Hour', 'sales_count']] prod_hourly_sales = pd.DataFrame({'Hour': range(24)}).merge( prod_hourly_sales, on='Hour', how='left' ).fillna(0) # 绘制柱状图 plt.figure(figsize=(12, 5)) plt.bar(prod_hourly_sales['Hour'], prod_hourly_sales['sales_count'], color='#1f77b4') # 高亮标记目标小时的销量点 target_sales = prod_hourly_sales.query("Hour == @target_hour")['sales_count'].iloc[0] plt.scatter( target_hour, target_sales, color='#d62728', s=150, zorder=6, label=f'{target_hour}点销冠:销量{int(target_sales)}' ) plt.xticks(range(24)) plt.xlabel('自然小时(0-23点)') plt.ylabel('产品销量') plt.title(f'{target_hour}点销冠产品【{top_prod_id}】全时段销量分布') plt.legend() plt.grid(axis='y', alpha=0.3) plt.show() # 调用示例:查看20点销冠产品的全时段销量分布 plot_top_prod_hourly_sales(20, count_df, hour_top_product)
内容的提问来源于stack exchange,提问作者Armaan Kumar Srivastava
相关产品推荐
相关产品推荐

