如何按客户需求变化频率对产品排序?附Pandas数据集
解决方法
步骤1:数据重塑(宽表转长表)
先把横向的月度需求列转为纵向结构,方便按产品、预测日期、需求月份维度分析变化。假设月度需求列命名类似demand_202401、demand_202402:
import pandas as pd # 假设原数据集存储在df中 # 筛选所有月度需求列 demand_cols = [col for col in df.columns if 'demand_' in col] # 转换为长表格式 long_df = df.melt( id_vars=['Products', 'customer_demand_date'], value_vars=demand_cols, var_name='demand_month', value_name='demand_quantity' ) # 提取纯月份数字(比如从'demand_202401'提取202401) long_df['demand_month'] = long_df['demand_month'].str.extract(r'(\d{6})').astype(int) # 按产品、需求月份、预测日期排序,保证后续对比逻辑正确 long_df = long_df.sort_values(['Products', 'demand_month', 'customer_demand_date']).reset_index(drop=True)
步骤2:统计产品需求变化频率
对每个产品的每个需求月份,对比相邻两次预测日期的需求数值,统计变化次数与占比:
# 标记同一产品-需求月份组内,相邻预测日期的需求是否变化 long_df['is_changed'] = long_df.groupby(['Products', 'demand_month'])['demand_quantity'].diff().ne(0).astype(int) # 按产品汇总变化统计指标 change_stats = long_df.groupby('Products').agg( total_change_times=('is_changed', 'sum'), total_observation_times=('is_changed', 'count') ).reset_index() # 计算变化占比(排除第一次无对比的观测) change_stats['change_ratio'] = change_stats['total_change_times'] / (change_stats['total_observation_times'] - 1) # 处理仅1次预测日期的产品(无对比数据,占比设为0) change_stats['change_ratio'] = change_stats['change_ratio'].fillna(0)
步骤3:排序并生成排名
按变化占比(相对频率)降序排序,相同占比则按总变化次数排序,添加排名列:
# 排序规则:先看变化占比,再看总变化次数 change_stats = change_stats.sort_values(by=['change_ratio', 'total_change_times'], ascending=False).reset_index(drop=True) # 添加排名 change_stats['rank'] = change_stats.index + 1 # 输出最终结果(保留核心列) final_result = change_stats[['rank', 'Products', 'total_change_times', 'total_observation_times', 'change_ratio']] print(final_result)
关键说明
- 总变化次数:统计产品所有需求月份中,相邻预测日期需求数值发生变动的总次数。
- 变化占比:变化次数除以有效对比次数(总观测次数-1),避免不同产品预测次数差异导致的频率偏差,更能体现真实变化频率。
- 如果月度需求列命名规则不同,只需调整
demand_cols的筛选逻辑和demand_month的提取代码即可适配。
内容的提问来源于stack exchange,提问作者Sascha
相关产品推荐
相关产品推荐

