本文目录导读:

我来帮你分析这个Python案例:统计反击次数,看哪队更高效。
问题理解
"反击次数"通常指在体育比赛(如足球、篮球)中,一方由防守转为进攻的次数,我们需要统计两队各自的反击次数,并比较哪队更高效。
完整案例代码
import pandas as pd
from collections import defaultdict
# ========== 1. 模拟比赛事件数据 ==========
# 假设数据:每个事件包含 时间、队伍、事件类型、是否形成射门、是否进球
match_events = [
# (时间, 队伍, 事件类型, 是否射门, 是否进球)
(5, "A队", "抢断", True, False),
(8, "A队", "反击", True, True), # A队反击进球
(15, "B队", "抢断", True, False),
(18, "B队", "反击", True, False), # B队反击未进球
(25, "A队", "抢断", True, False),
(27, "A队", "反击", True, False),
(35, "B队", "抢断", True, False),
(38, "B队", "反击", True, True), # B队反击进球
(45, "A队", "抢断", True, False),
(47, "A队", "反击", False, False), # A队反击失败
(55, "B队", "抢断", True, False),
(58, "B队", "反击", True, False),
(65, "A队", "抢断", True, False),
(67, "A队", "反击", True, True), # A队反击进球
(75, "B队", "抢断", True, False),
(78, "B队", "反击", True, False),
(85, "A队", "抢断", True, False),
(87, "A队", "反击", True, False),
]
df = pd.DataFrame(match_events,
columns=["时间", "队伍", "事件类型", "是否射门", "是否进球"])
# ========== 2. 只保留反击事件 ==========
counter_attacks = df[df["事件类型"] == "反击"].copy()
print("=== 反击事件明细 ===")
print(counter_attacks)
print()
# ========== 3. 统计每队的反击数据 ==========
def analyze_counter_attacks(data):
stats = {}
for team in data["队伍"].unique():
team_data = data[data["队伍"] == team]
total = len(team_data)
shots = team_data["是否射门"].sum()
goals = team_data["是否进球"].sum()
stats[team] = {
"反击次数": total,
"形成射门": shots,
"进球数": goals,
"射门率": f"{shots/total*100:.1f}%",
"进球率": f"{goals/total*100:.1f}%",
"反击效率": round(goals / total * 100, 1) if total > 0 else 0
}
return stats
result = analyze_counter_attacks(counter_attacks)
print("=== 各队反击统计 ===")
for team, s in result.items():
print(f"\n{team}:")
for k, v in s.items():
print(f" {k}: {v}")
# ========== 4. 对比哪队更高效 ==========
print("\n=== 效率对比 ===")
teams = list(result.keys())
if result[teams[0]]["反击效率"] > result[teams[1]]["反击效率"]:
print(f"🏆 {teams[0]} 反击效率更高!")
elif result[teams[0]]["反击效率"] < result[teams[1]]["反击效率"]:
print(f"🏆 {teams[1]} 反击效率更高!")
else:
print("两队反击效率相同!")
输出结果
=== 反击事件明细 ===
时间 队伍 事件类型 是否射门 是否进球
1 8 A队 反击 True True
3 18 B队 反击 True False
5 27 A队 反击 True False
7 38 B队 反击 True True
9 47 A队 反击 False False
11 58 B队 反击 True False
13 67 A队 反击 True True
15 78 B队 反击 True False
17 87 A队 反击 True False
=== 各队反击统计 ===
A队:
反击次数: 5
形成射门: 4
进球数: 2
射门率: 80.0%
进球率: 40.0%
反击效率: 40.0
B队:
反击次数: 4
形成射门: 4
进球数: 1
射门率: 100.0%
进球率: 25.0%
反击效率: 25.0
=== 效率对比 ===
🏆 A队 反击效率更高!
多维度高效性分析
效率不能只看进球率,建议从多角度评估:
def comprehensive_efficiency(stats):
"""综合效率评分"""
scores = {}
for team, s in stats.items():
total = s["反击次数"]
shots = s["形成射门"]
goals = s["进球数"]
# 权重:射门率40% + 进球率60%
shot_rate = shots / total if total else 0
goal_rate = goals / total if total else 0
score = shot_rate * 0.4 + goal_rate * 0.6
scores[team] = {
"射门率": f"{shot_rate*100:.1f}%",
"进球率": f"{goal_rate*100:.1f}%",
"综合得分": round(score, 3)
}
return scores
print("\n=== 综合效率评分 ===")
for team, s in comprehensive_efficiency(result).items():
print(f"{team}: {s}")
关键指标说明
| 指标 | 含义 | 说明 |
|---|---|---|
| 反击次数 | 总反击发起数 | 反映反击频率 |
| 射门率 | 形成射门/反击次数 | 反映推进质量 |
| 进球率 | 进球/反击次数 | 反映终结能力 |
| 综合效率 | 加权得分 | 平衡射门和进球 |
在本案例中:
- A队:反击5次,进2球,效率 40% → 更高效
- B队:反击4次,进1球,效率 25%
- 虽然B队射门率100%,但转化率低,综合来看 A队反击更高效 🏆
扩展建议
- 加入时间维度:分析不同时间段的效率
- 反击耗时:从抢断到射门的时间,越短越高效
- 对手强度:考虑对阵强弱队的差异
- 可视化:用 matplotlib 绘制对比柱状图
需要我补充可视化图表或真实足球数据接口的版本吗?