本文目录导读:

我来为你设计一个有趣的Python案例,统计门将扑救次数来判断谁更"忙"!
基础版(适合入门)
# 门将扑救数据
goalkeepers = {
'诺伊尔': 5,
'特尔施特根': 8,
'库尔图瓦': 6,
'阿利松': 9,
'埃德森': 3
}
# 找出最忙的门将
busiest_goalkeeper = max(goalkeepers, key=goalkeepers.get)
max_saves = goalkeepers[busiest_goalkeeper]
print("=== 门将扑救统计 ===")
for name, saves in goalkeepers.items():
print(f"{name}: {saves}次扑救")
print(f"\n🏆 最忙的门将是: {busiest_goalkeeper}")
print(f"共完成 {max_saves} 次扑救")
进阶版(包含更多统计)
import pandas as pd
import matplotlib.pyplot as plt
# 模拟一个月的数据
import random
random.seed(42)
# 创建数据
data = {
'门将': ['诺伊尔', '特尔施特根', '库尔图瓦', '阿利松', '埃德森'] * 30,
'比赛日': [f'第{day}天' for day in range(1, 31) for _ in range(5)],
'扑救次数': [random.randint(0, 8) for _ in range(150)]
}
# 转换为DataFrame
df = pd.DataFrame(data)
# 按门将分组统计
stats = df.groupby('门将').agg({
'扑救次数': ['sum', 'mean', 'max', 'min', 'std']
}).round(2)
stats.columns = ['总扑救', '场均扑救', '单场最高', '单场最低', '标准差']
stats = stats.sort_values('总扑救', ascending=False)
print("=== 门将扑救统计报告 ===\n")
print(stats)
# 找出最忙门将
busiest = stats.index[0]
print(f"\n🏆 最忙的门将: {busiest}")
print(f"📊 总扑救: {stats.iloc[0]['总扑救']}次")
print(f"📈 场均扑救: {stats.iloc[0]['场均扑救']}次")
可视化版(最直观)
import matplotlib.pyplot as plt
import numpy as np
# 数据
goalkeepers = ['诺伊尔', '特尔施特根', '库尔图瓦', '阿利松', '埃德森']
saves = [45, 62, 51, 78, 35]
games_played = [30, 28, 29, 30, 27]
# 计算场均
avg_saves = [s/g for s, g in zip(saves, games_played)]
# 创建图表
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 1. 总扑救柱状图
axes[0, 0].bar(goalkeepers, saves, color=['blue', 'green', 'red', 'orange', 'purple'])
axes[0, 0].set_title('总扑救次数')
axes[0, 0].set_ylabel('扑救次数')
axes[0, 0].grid(True, alpha=0.3)
# 2. 场均扑救折线图
axes[0, 1].plot(goalkeepers, avg_saves, marker='o', linewidth=2, markersize=8)
axes[0, 1].set_title('场均扑救次数')
axes[0, 1].set_ylabel('扑救次数/场')
axes[0, 1].grid(True, alpha=0.3)
# 3. 扑救效率分析(模拟数据)
efficiency = np.random.randint(60, 95, 5)
axes[1, 0].pie(efficiency, labels=goalkeepers, autopct='%1.1f%%')
axes[1, 0].set_title('扑救成功率占比')
# 4. 数据表格
column_labels = ['门将', '总扑救', '场均']
table_data = list(zip(goalkeepers, saves, [f'{x:.2f}' for x in avg_saves]))
axes[1, 1].axis('off')
table = axes[1, 1].table(cellText=table_data, colLabels=column_labels, loc='center')
table.auto_set_font_size(False)
table.set_fontsize(10)
plt.tight_layout()
plt.show()
#
busiest = goalkeepers[saves.index(max(saves))]
print(f"🏆 最忙的门将是: {busiest},共扑救 {max(saves)} 次!")
模拟比赛数据(最实用)
class Goalkeeper:
def __init__(self, name):
self.name = name
self.saves = 0
self.games = 0
self.shots_faced = 0
def record_game(self, shots_faced, saves):
"""记录一场比赛数据"""
self.saves += saves
self.shots_faced += shots_faced
self.games += 1
def save_rate(self):
"""扑救成功率"""
return self.saves / self.shots_faced * 100 if self.shots_faced > 0 else 0
# 模拟赛季数据
import random
def simulate_season():
goalkeepers = {
'诺伊尔': Goalkeeper('诺伊尔'),
'特尔施特根': Goalkeeper('特尔施特根'),
'库尔图瓦': Goalkeeper('库尔图瓦')
}
# 模拟34轮联赛
for round_num in range(1, 35):
for gk in goalkeepers.values():
shots = random.randint(3, 15) # 对手射门次数
saves = random.randint(0, shots) # 扑救次数
gk.record_game(shots, saves)
return goalkeepers
# 运行模拟
results = simulate_season()
print("=== 赛季扑救统计 ===")
print(f"{'门将':<15} {'出场':<5} {'扑救':<5} {'扑救率':<10}")
print("-" * 40)
for gk in results.values():
rate = gk.save_rate()
print(f"{gk.name:<15} {gk.games:<5} {gk.saves:<5} {rate:.1f}%")
# 找出最忙门将
busiest = max(results.values(), key=lambda gk: gk.saves)
print(f"\n🏆 本赛季最忙门将: {busiest.name}")
print(f"共完成 {busiest.saves} 次扑救")
运行效果示例
=== 门将扑救统计 ===
诺伊尔: 5次扑救
特尔施特根: 8次扑救
库尔图瓦: 6次扑救
阿利松: 9次扑救
埃德森: 3次扑救
🏆 最忙的门将是: 阿利松
共完成 9 次扑救
扩展建议
- 添加更多数据维度:扑救难度、关键扑救、点球扑救等
- 实现实时统计:爬取比赛数据或接入API
- 机器学习预测:预测门将未来表现
- 可视化仪表盘:制作实时更新的数据仪表盘
这些代码可以根据你的需求选择使用,你更倾向于哪种类型?我可以针对性地优化某个方案。