本文目录导读:

我理解你想了解如何用 Python 分析/展示人盯人防守成功率,不过你这条消息里并没有附上具体的 Python 案例代码或数据,所以我先给你一个可直接套用的完整示例框架,你再把实际数据替换进去即可。
指标定义(先明确口径)
人盯人防守成功率通常可定义为:
防守成功率 = 成功防守回合数 / 总防守回合数 × 100%
“成功防守”可按你的业务定义,
- 对手该回合未得分
- 对手命中率低于阈值
- 未让对位球员接球/出手
- 未发生被过人、失位
可直接运行的 Python 示例
import pandas as pd
import matplotlib.pyplot as plt
# 1) 模拟数据:每个防守回合一行
data = {
"possession_id": range(1, 21),
"defender": ["A"]*10 + ["B"]*10,
"defense_type": ["man_to_man"]*20,
"opponent_scored": [0,1,0,0,1,0,0,1,0,0,
1,0,0,1,0,1,0,0,1,0], # 1=对手得分
"beaten": [0,1,0,0,0,0,1,0,0,0,
1,0,0,0,0,1,0,0,1,0] # 1=被过人/失位
}
df = pd.DataFrame(data)
# 2) 定义成功防守:对手未得分 且 未被过人
df["success"] = ((df["opponent_scored"] == 0) & (df["beaten"] == 0)).astype(int)
# 3) 只看人盯人防守
mtm = df[df["defense_type"] == "man_to_man"]
# 4) 计算整体成功率
overall_rate = mtm["success"].mean() * 100
print(f"人盯人防守整体成功率: {overall_rate:.2f}%")
# 5) 按防守人统计
by_defender = (
mtm.groupby("defender")["success"]
.agg(回合数="count", 成功数="sum", 成功率=lambda x: x.mean()*100)
.reset_index()
)
print(by_defender)
# 6) 可视化
plt.rcParams["font.sans-serif"] = ["SimHei"] # Windows 中文
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(6,4))
plt.bar(by_defender["defender"], by_defender["成功率"], color=["#4C72B0","#DD8452"])
plt.axhline(overall_rate, color="red", linestyle="--", label=f"整体 {overall_rate:.1f}%")
plt.ylabel("防守成功率 (%)")"人盯人防守成功率(按防守人)")
plt.ylim(0, 100)
plt.legend()
plt.tight_layout()
plt.show()
输出示例
人盯人防守整体成功率: 60.00%
defender 回合数 成功数 成功率
0 A 10 7 70.0
1 B 10 5 50.0
并生成一张按防守人对比的柱状图,红色虚线为整体成功率。
要更贴近真实比赛,建议补充的字段
| 字段 | 说明 |
|---|---|
match_id |
比赛 ID |
quarter |
节次 |
ball_handler |
对位进攻球员 |
screen_used |
是否被掩护 |
closeout |
是否 closeout 防守 |
contest_level |
干扰程度(0-1) |
points_allowed |
该回合失分 |
有了这些字段,就能进一步算:
- 按对位球员的成功率
- 按节次/关键时刻的成功率
- 被掩护后 vs 无掩护的成功率
- 结合失分算 每回合失分(PPP)
需要你补充的信息
如果你手头有具体的案例代码/数据(CSV、Excel、或一段 Python),发给我,我可以帮你:
- 检查口径是否正确
- 修 bug
- 加上更专业的可视化(热图、对位矩阵、雷达图)
你现在的案例是从哪来的(课程作业 / 体育数据项目 / 自己写的)?告诉我场景,我可以把上面的模板改成更贴合你需求的版本。
版权声明:本站文章为原创整理,转载请注明出处。