篮球球队月度得分与失分均值计算代码异常排查
代码问题排查与修正
问题核心
你当前输出原始数据集而非统计结果,主要是代码中数据匹配逻辑错误、缺少返回语句,以及统计方式存在偏差导致的,以下分R和Python代码逐一说明:
R代码问题及修正
现存问题
- 数据错位匹配:直接用
monthly_averages_a$AORTG给monthly_averages赋值,完全依赖两个数据集的行顺序一致,但分组后的球队顺序不一定相同,会导致球队的主客场数据对应错误。 - 缺少球队名称统一:仅用
home_team作为分组键,合并后没有将客场球队名称与主场统一,无法形成完整的球队列表。 - 简单平均未加权:直接取主客场均值的平均,没有考虑球队主客场的比赛场次差异,若某队主场打了5场、客场打了3场,简单平均会拉低结果准确性。
修正后的代码
library(dplyr) # 转换数据格式:将每场比赛拆分为两条记录(主队一条、客队一条) team_stats <- ott_10 %>% pivot_longer( cols = c(home_team, away_team), names_to = "home_away", values_to = "Team" ) %>% mutate( Scored = ifelse(home_away == "home_team", home_score, away_score), Allowed = ifelse(home_away == "home_team", away_score, home_score) ) %>% select(Team, Scored, Allowed) # 计算每个球队的总得分、总失分、总场次,再求均值 monthly_averages <- team_stats %>% group_by(Team) %>% summarize( Average_Scored = mean(Scored), Average_Allowed = mean(Allowed), Net_RTG = Average_Scored - Average_Allowed ) %>% ungroup() # 查看目标球队结果 filter(monthly_averages, Team == "Dinamo Basket Sassari")
Python代码问题及修正
现存问题
- 函数无返回值:你的
avg_scored_allowed函数最后没有return output语句,调用函数时不会返回统计结果,导致你看到的是原始数据集。 - 索引对齐风险:
home_score_avg + away_score_avg依赖索引(球队名)完全对齐,若有球队只打了主场或客场,会产生NaN值;且简单平均未考虑场次权重。 - 缺少差值计算:没有添加得分与失分的差值列。
修正后的代码
import pandas as pd def avg_scored_allowed(df): # 转换数据格式:拆分主客场记录 home_records = df.rename(columns={ "home_team": "Team", "home_score": "Scored", "away_score": "Allowed" })[["Team", "Scored", "Allowed"]] away_records = df.rename(columns={ "away_team": "Team", "away_score": "Scored", "home_score": "Allowed" })[["Team", "Scored", "Allowed"]] # 合并所有记录 all_records = pd.concat([home_records, away_records], ignore_index=True) # 按球队分组计算均值与差值 monthly_averages = all_records.groupby("Team").agg( Average_Scored=("Scored", "mean"), Average_Allowed=("Allowed", "mean") ).reset_index() monthly_averages["Net_RTG"] = monthly_averages["Average_Scored"] - monthly_averages["Average_Allowed"] return monthly_averages # 调用函数并查看目标球队 result = avg_scored_allowed(ott_10) print(result[result["Team"] == "Dinamo Basket Sassari"])
关键说明
修正后的代码采用拆分每条比赛记录为球队独立条目的方式,确保主客场数据都被正确统计,同时直接计算所有场次的均值,比简单平均主客场均值更准确,能匹配你期望的Dinamo Basket Sassari平均得分82.3、失分84.0、差值-1.7的结果。
内容的提问来源于stack exchange,提问作者Cecic
相关产品推荐
相关产品推荐

