DataFrame实例计数、网格分桶及方格获胜概率预测实现方法
NFL得分网格分桶与获胜概率计算实现方案
核心步骤1:提取得分个位数字匹配网格编号
不需要写逐行遍历的提取逻辑,直接用数值取模运算就能批量拿到所有记录的得分个位,结果刚好对应0-9的行列编号规则:
- 假设你的DataFrame里存储主队最终得分的列名为
home_score,存储客队最终得分的列名为away_score,对应预测得分列名为pred_home_score、pred_away_score - 对所有得分列统一做模10运算,直接得到个位数字:
# 提取真实得分个位 df['home_row_id'] = df['home_score'] % 10 df['away_col_id'] = df['away_score'] % 10 # 提取预测得分个位,逻辑完全一致 df['pred_home_row_id'] = df['pred_home_score'] % 10 df['pred_away_col_id'] = df['pred_away_col_id'] % 10
注:不管得分是1位数、2位数还是更高(比如加时赛爆分的情况),模10运算都能准确取到最后一位,不需要额外做数值长度判断。
核心步骤2:逐方格统计实例数量
直接用pandas内置的交叉表函数生成10*10的计数矩阵,不需要手动初始化100个格子的计数器逐行累加:
# 定义完整的0-9网格索引,保证没有计数的格子也能出现在最终矩阵里 full_grid_idx = list(range(10)) # 统计真实赛事每个方格的落子数 real_count_matrix = pd.crosstab( index=df['home_row_id'], columns=df['away_col_id'] ).reindex(index=full_grid_idx, columns=full_grid_idx, fill_value=0) # 统计预测得分每个方格的落子数,逻辑完全复用 pred_count_matrix = pd.crosstab( index=df['pred_home_row_id'], columns=df['pred_away_col_id'] ).reindex(index=full_grid_idx, columns=full_grid_idx, fill_value=0)
不要使用iterrows、itertuples逐行遍历计数,向量化运算的处理效率比逐行循环高100倍以上,赛事数据量越大效率差异越明显。
核心步骤3:计算每个方格的获胜概率
如果需要统计历史赛事中每个方格对应的主队获胜概率,先标记每场比赛的主队胜负结果,再按同样的分桶逻辑统计胜场数,最后除以对应方格的总实例数即可:
# 标记每场比赛主队是否获胜 df['home_is_win'] = (df['home_score'] > df['away_score']).astype(int) # 统计每个方格内的主队胜场数 win_count_matrix = pd.crosstab( index=df['home_row_id'], columns=df['away_col_id'], values=df['home_is_win'], aggfunc='sum' ).reindex(index=full_grid_idx, columns=full_grid_idx, fill_value=0) # 计算获胜概率,对总计数为0的格子填充0避免除0报错 win_prob_matrix = win_count_matrix.div(real_count_matrix).fillna(0)
最终输出的win_prob_matrix就是10行10列的矩阵,行号对应主队得分个位、列号对应客队得分个位,每个单元格的值就是对应方格的主队获胜概率。如果要融合预测得分的结果,只需要把预测分桶的计数矩阵按你的权重规则和历史计数矩阵做融合,再重复概率计算步骤即可。
内容的提问来源于stack exchange,提问作者johndoe1839
相关产品推荐
相关产品推荐

