在pandas中按累计周维度应用自定义函数计算AUC的实现问题
实现方案
你的需求是按周滚动计算累计AUC,即每一周的结果都使用截止到该周的全量历史数据计算,可通过以下步骤实现:
前置说明
你的原始数据需要包含3个核心字段:
week:周标识,支持按时间先后排序expected:模型预测值actual:真实标签
注:每一周需要对应多条样本,单样本无法计算AUC
完整代码实现
- 先对原始数据按周排序,保证时间顺序正确:
import pandas as pd import numpy as np from sklearn.metrics import roc_auc_score # 按周升序排序,重置索引保证顺序正确 df = df.sort_values('week', ascending=True).reset_index(drop=True)
- 封装AUC计算函数,处理边界异常:
你原本定义的auc_group函数可以直接复用,补充边界判断即可,避免累计数据只有一类标签时的报错:
def auc_group(df): y_hat = df.expected y = df.actual # 边界处理:只有一类标签时返回空值,可按需替换为默认值 if len(y.unique()) < 2: return np.nan return roc_auc_score(y, y_hat)
- 遍历周次计算累计AUC:
# 获取按时间排序的去重周列表 sorted_weeks = df['week'].unique() result = [] for idx, current_week in enumerate(sorted_weeks): # 取截止到当前周的所有历史数据 cur_subset = df[df['week'].isin(sorted_weeks[:idx+1])] # 计算累计AUC cur_auc = auc_group(cur_subset) result.append({'week': current_week, 'cumulative_auc': cur_auc}) # 转为数据框即为最终输出 result_df = pd.DataFrame(result)
补充说明
如果你的周次数量不多,上述遍历方案性能完全够用,逻辑清晰易调试。若需要更高性能的实现,也可以给样本打上周的顺序编号后用pandas的expanding扩展窗口实现,新手优先推荐上述遍历方案。
内容的提问来源于stack exchange,提问作者jorge
相关产品推荐
相关产品推荐

