实用脚本统计扑救次数门将谁更忙?

wen 实用脚本 5

谁是最忙的门将?

下面给你一个可直接运行的 Python 脚本,用模拟数据演示如何统计并比较各位门将的扑救次数("忙碌程度"),你可以把 data 换成真实的比赛数据。

实用脚本统计扑救次数门将谁更忙?

完整脚本

import pandas as pd
from collections import defaultdict
# ============ 1. 模拟数据(替换为真实数据) ============
# 每行代表一次对方射正球门的事件
# goalkeeper: 门将名, saved: 是否扑救成功(1=扑出, 0=丢球)
data = [
    {"goalkeeper": "Alisson",   "saved": 1},
    {"goalkeeper": "Alisson",   "saved": 1},
    {"goalkeeper": "Alisson",   "saved": 0},
    {"goalkeeper": "Alisson",   "saved": 1},
    {"goalkeeper": "Ederson",   "saved": 1},
    {"goalkeeper": "Ederson",   "saved": 0},
    {"goalkeeper": "Ederson",   "saved": 0},
    {"goalkeeper": "Courtois",  "saved": 1},
    {"goalkeeper": "Courtois",  "saved": 1},
    {"goalkeeper": "Courtois",  "saved": 1},
    {"goalkeeper": "Courtois",  "saved": 1},
    {"goalkeeper": "Courtois",  "saved": 1},
    {"goalkeeper": "Neuer",     "saved": 1},
    {"goalkeeper": "Neuer",     "saved": 0},
    {"goalkeeper": "Neuer",     "saved": 1},
]
df = pd.DataFrame(data)
# ============ 2. 统计每位门将 ============
# 面对射正次数 = 忙碌程度的核心指标
stats = df.groupby("goalkeeper").agg(
    shots_faced=("saved", "count"),   # 面对射正次数(越忙越大)
    saves=("saved", "sum"),           # 成功扑救次数
).reset_index()
# 计算扑救成功率
stats["save_rate"] = (stats["saves"] / stats["shots_faced"] * 100).round(1)
# 按"忙碌程度"(面对射正次数)排序
stats = stats.sort_values("shots_faced", ascending=False).reset_index(drop=True)
# ============ 3. 输出结果 ============
print("=" * 55)
print(f"{'门将':<12}{'面对射正':>10}{'扑救':>8}{'扑救率%':>10}")
print("=" * 55)
for _, row in stats.iterrows():
    print(f"{row['goalkeeper']:<12}{row['shots_faced']:>10}{row['saves']:>8}{row['save_rate']:>10}")
# 最忙的门将
busiest = stats.iloc[0]
print("=" * 55)
print(f"🔥 最忙的门将:{busiest['goalkeeper']}(面对 {busiest['shots_faced']} 次射正)")
# 扑救最多的门将
best = stats.loc[stats["saves"].idxmax()]
print(f"🧤 扑救最多:{best['goalkeeper']}({best['saves']} 次扑救)")
# 效率最高(面对≥3次射正的门将中)
qualified = stats[stats["shots_faced"] >= 3]
if not qualified.empty:
    eff = qualified.loc[qualified["save_rate"].idxmax()]
    print(f"🎯 扑救效率最高:{eff['goalkeeper']}(成功率 {eff['save_rate']}%)")
print("=" * 55)

运行结果示例

=======================================================
门将             面对射正      扑救    扑救率%
=======================================================
Courtois              5       5     100.0
Alisson               4       3      75.0
Neuer                 3       2      66.7
Ederson               3       1      33.3
=======================================================
🔥 最忙的门将:Courtois(面对 5 次射正)
🧤 扑救最多:Courtois(5 次扑救)
🎯 扑救效率最高:Courtois(成功率 100.0%)
=======================================================

关键指标说明

指标 含义 说明"忙"的程度
面对射正次数 (shots_faced) 门将被射正的总次数 ✅ 最能反映"忙碌程度"
扑救次数 (saves) 成功扑出的次数 忙且表现好
扑救成功率 (save_rate) saves / shots_faced 衡量效率

💡 "谁更忙"最直接的答案是看 shots_faced(面对射正次数),而不是扑救次数——因为扑救多可能只是因为对方射正多,真正的"忙"= 防线给他制造了多少工作。

扩展建议

  • 按比赛/半场拆分:加 match_id 列做分组,看单场最忙的门将。
  • 区分射门类型:加 shot_type 列(远射/禁区内/点球),加权计算"忙碌指数"。
  • 真实数据源:可从 FBref、Understat 或 StatsBomb 开放数据导入,替换脚本中的 data 即可。

需要我帮你改成从 CSV 读取或对接某个数据 API 的版本吗?

抱歉,评论功能暂时关闭!