python案例统计扑救次数门将谁更忙?

wen python案例 4

本文目录导读:

python案例统计扑救次数门将谁更忙?

  1. 方案一:基础版(适合入门)
  2. 方案二:进阶版(包含更多统计)
  3. 方案三:可视化版(最直观)
  4. 方案四:模拟比赛数据(最实用)
  5. 运行效果示例
  6. 扩展建议

我来为你设计一个有趣的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 次扑救

扩展建议

  1. 添加更多数据维度:扑救难度、关键扑救、点球扑救等
  2. 实现实时统计:爬取比赛数据或接入API
  3. 机器学习预测:预测门将未来表现
  4. 可视化仪表盘:制作实时更新的数据仪表盘

这些代码可以根据你的需求选择使用,你更倾向于哪种类型?我可以针对性地优化某个方案。

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