python案例统计直塞球成功率是多少?

wen python案例 10

本文目录导读:

python案例统计直塞球成功率是多少?

  1. 场景一:使用字典/列表模拟数据(适合新手教学)
  2. 场景二:使用Pandas处理CSV文件(真实数据场景)
  3. 场景三:加入基础数学函数与自定义函数(面向对象逻辑)
  4. 真实世界概念(关键点)

在足球数据分析中,直塞球(Through Ball) 的成功率通常定义为:成功直塞球次数 ÷ 总直塞球尝试次数

由于Python本身不直接包含足球数据,我们需要模拟数据或者读取CSV文件来演示如何计算。

以下是一个完整的Python案例,包含三种常见场景:


使用字典/列表模拟数据(适合新手教学)

# 模拟一名球员的5场比赛直塞球数据
# 格式:[比赛场次, 尝试直塞次数, 成功直塞次数]
data = [
    ["第1轮", 5, 3],
    ["第2轮", 2, 1],
    ["第3轮", 6, 4],
    ["第4轮", 3, 0],
    ["第5轮", 4, 2]
]
# 计算总计
total_attempts = sum(game[1] for game in data)
successful_attempts = sum(game[2] for game in data)
# 计算成功率(保留两位小数)
success_rate = (successful_attempts / total_attempts) * 100
print("=== 球员直塞球统计 ===")
print(f"总尝试次数: {total_attempts}")
print(f"总成功次数: {successful_attempts}")
print(f"直塞球成功率: {success_rate:.2f}%")
# 额外计算:场均成功直塞
avg_per_game = successful_attempts / len(data)
print(f"场均成功直塞: {avg_per_game:.2f}次")

使用Pandas处理CSV文件(真实数据场景)

假设你有一个CSV文件 through_balls.csv如下:

match_id,player,try_count,success_count
202401, 梅西, 5, 3
202402, 梅西, 4, 2
202403, 梅西, 6, 5

代码实现:

import pandas as pd
# 读取数据
df = pd.read_csv('through_balls.csv')
# 查看数据概览
print("原始数据:")
print(df)
# 计算总体成功率
total_try = df['try_count'].sum()
total_success = df['success_count'].sum()
success_rate = (total_success / total_try) * 100
print("\n=== 总体统计 ===")
print(f"总尝试: {total_try}, 总成功: {total_success}")
print(f"总体直塞成功率: {success_rate:.2f}%")
# 按球员分组统计
print("\n=== 按照球员统计 ===")
grouped = df.groupby('player').sum()
grouped['success_rate'] = (grouped['success_count'] / grouped['try_count']) * 100
print(grouped.round(2))
# 按比赛统计(每场单独成功率)
df['match_success_rate'] = (df['success_count'] / df['try_count']) * 100
print("\n=== 每场比赛单独成功率 ===")
print(df[['match_id', 'player', 'match_success_rate']])

加入基础数学函数与自定义函数(面向对象逻辑)

class ThroughBallAnalyzer:
    def __init__(self, player_name):
        self.player = player_name
        self.match_records = []  # 存储每场(尝试, 成功)
    def add_match(self, attempts, successes):
        """添加一场比赛的数据"""
        self.match_records.append((attempts, successes))
    def success_rate(self, match_index=None):
        """计算成功率,不指定参数则计算全部"""
        if match_index is not None:
            attempts, successes = self.match_records[match_index]
            return (successes / attempts) * 100
        else:
            total_attempts = sum([a for a, s in self.match_records])
            total_successes = sum([s for a, s in self.match_records])
            if total_attempts == 0:
                return 0.0
            return (total_successes / total_attempts) * 100
    def display_summary(self):
        """打印汇总"""
        print(f"球员: {self.player}")
        for i, (attempts, successes) in enumerate(self.match_records, 1):
            rate = self.success_rate(i-1)
            print(f"  - 第{i}场: {successes}/{attempts} ({rate:.1f}%)")
        print(f"  - 整体效率: {self.success_rate():.1f}%")
# 使用示例
if __name__ == "__main__":
    de_bruyne = ThroughBallAnalyzer("德布劳内")
    de_bruyne.add_match(5, 3)
    de_bruyne.add_match(8, 5)
    de_bruyne.add_match(6, 2)
    de_bruyne.display_summary()

真实世界概念(关键点)

在实际足球数据分析中(如StatsBomb或Opta),成功直塞球的定义非常严格:

  • 必须是传球穿透防守线(通常指后卫线)找到队友。
  • 队友必须接到球(如果被防守方拦截,即使传球传出并被队友碰到也不算成功)。
  • 通常只计算向前传递,横传或回传一般不叫直塞。

如果数据源标注不准确,成功率会失真,通常顶尖中场(如梅西、德布劳内)的真实直塞成功率在 40% ~ 60% 之间。


如果你有具体的CSV文件(包含球员、尝试次数、成功次数),可以把文件格式发出来,我可以帮你直接写出计算代码。

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