本文目录导读:

在足球数据分析中,直塞球(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文件(包含球员、尝试次数、成功次数),可以把文件格式发出来,我可以帮你直接写出计算代码。