本文目录导读:

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