Pandas特定模式列排序及实际值与预测值绝对误差计算方案
Pandas 实现方案
import pandas as pd def process_hierarchy_df(df): # 固定商品层级列 fixed_cols = ["HIERARCHY 1", "HIERARCHY 2", "HIERARCHY 3", "ITEM NUMBER"] # 提取所有指标类列 metric_cols = [col for col in df.columns if col not in fixed_cols] # 拆分列名生成排序规则 col_sort_info = [] for col in metric_cols: metric_type, dt_str = col.split("|", 1) dt = pd.to_datetime(dt_str) # 定义指标排序权重,数值越小优先级越高 type_weight = {"ACTUAL":0, "FORECAST T-1":1, "FORECAST T-3":2}[metric_type] col_sort_info.append((type_weight, dt, col)) # 按指标优先级>日期升序排列指标列 col_sort_info.sort() sorted_metric_cols = [item[2] for item in col_sort_info] # 完成第一步列重排 res_df = df[fixed_cols + sorted_metric_cols].copy() # 第二步计算绝对误差列 all_dates = sorted({item[1] for item in col_sort_info}) error_cols = [] for dt in all_dates: dt_str = dt.strftime("%Y-%m-%d") actual_col = f"ACTUAL|{dt_str}" # 无实际值的日期直接跳过 if actual_col not in res_df.columns: continue # 计算T-1误差 t1_col = f"FORECAST T-1|{dt_str}" if t1_col in res_df.columns: err_col = f"ABS ERROR T-1 | {dt_str}" res_df[err_col] = (res_df[actual_col] - res_df[t1_col]).abs() error_cols.append(err_col) # 计算T-3误差 t3_col = f"FORECAST T-3|{dt_str}" if t3_col in res_df.columns: err_col = f"ABS ERROR T-3 | {dt_str}" res_df[err_col] = (res_df[actual_col] - res_df[t3_col]).abs() error_cols.append(err_col) # 误差列放到末尾输出 final_cols = fixed_cols + sorted_metric_cols + error_cols return res_df[final_cols] # 调用方法 # processed_df = process_hierarchy_df(你的原始DataFrame)
逻辑说明
- 列排序通过指标权重+日期双重规则实现,自动适配任意数量的指标列
- 误差计算自动校验对应日期的实际值、预测值列是否存在,不存在直接跳过,兼容列不齐的场景
- 所有固定列名、指标类型、排序规则都放在函数开头,可根据实际需求快速调整
内容的提问来源于stack exchange,提问作者matt.aurelio
相关产品推荐
相关产品推荐

