本文目录导读:

我将为您创建一个统计足球比赛中高球传中争顶成功率的Python案例,这个案例会模拟处理比赛数据并计算相关统计指标。
import pandas as pd
import numpy as np
from datetime import datetime
class CrossSuccessAnalyzer:
"""
高球传中争顶成功率分析器
"""
def __init__(self):
# 初始化统计数据结构
self.all_crosses = []
self.player_stats = {}
self.team_stats = {}
def add_cross_event(self, match_id, player_name, team_name,
cross_type, is_successful, defender_count=0,
is_set_piece=False, cross_zone=''):
"""
添加一个传中事件
参数:
- match_id: 比赛ID
- player_name: 球员姓名
- team_name: 球队名称
- cross_type: 传中类型 (高球/低平球/地面球)
- is_successful: 是否成功争顶
- defender_count: 防守球员数量
- is_set_piece: 是否定位球
- cross_zone: 传中区域
"""
event = {
'match_id': match_id,
'player_name': player_name,
'team_name': team_name,
'cross_type': cross_type,
'is_successful': is_successful,
'defender_count': defender_count,
'is_set_piece': is_set_piece,
'cross_zone': cross_zone,
'timestamp': datetime.now()
}
self.all_crosses.append(event)
# 更新球员统计
if player_name not in self.player_stats:
self.player_stats[player_name] = {
'total': 0, 'successful': 0, 'team': team_name
}
self.player_stats[player_name]['total'] += 1
if is_successful:
self.player_stats[player_name]['successful'] += 1
# 更新球队统计
if team_name not in self.team_stats:
self.team_stats[team_name] = {
'total': 0, 'successful': 0, 'high_ball': 0, 'high_success': 0
}
self.team_stats[team_name]['total'] += 1
if cross_type == '高球':
self.team_stats[team_name]['high_ball'] += 1
if is_successful:
self.team_stats[team_name]['high_success'] += 1
def generate_sample_data(self):
"""
生成示例数据用于测试
"""
sample_players = [
('梅西', '巴萨'), ('C罗', '皇马'), ('内马尔', '巴萨'),
('姆巴佩', '巴黎'), ('哈兰德', '曼城'), ('凯恩', '热刺')
]
# 模拟一场比赛的数据
for player, team in sample_players:
# 每个球员进行3-8次传中
for _ in range(np.random.randint(3, 9)):
cross_type = np.random.choice(['高球', '低平球', '地面球'],
p=[0.4, 0.35, 0.25])
is_successful = np.random.choice([True, False],
p=[0.4, 0.6])
self.add_cross_event(
match_id='MATCH001',
player_name=player,
team_name=team,
cross_type=cross_type,
is_successful=is_successful,
defender_count=np.random.randint(0, 5),
is_set_piece=np.random.choice([True, False], p=[0.2, 0.8])
)
def calculate_success_rate(self, data=None):
"""
计算成功率
返回: DataFrame包含各项统计指标
"""
if data is None:
data = self.all_crosses
df = pd.DataFrame(data)
if df.empty:
return pd.DataFrame()
# 计算总体统计
stats = []
# 1. 总体传中成功率
total = len(df)
successful = df['is_successful'].sum()
overall_rate = (successful / total * 100) if total > 0 else 0
stats.append({
'统计维度': '总传中',
'总次数': total,
'成功次数': successful,
'成功率(%)': round(overall_rate, 2)
})
# 2. 高球传中成功率
high_balls = df[df['cross_type'] == '高球']
if not high_balls.empty:
high_total = len(high_balls)
high_success = high_balls['is_successful'].sum()
high_rate = (high_success / high_total * 100) if high_total > 0 else 0
stats.append({
'统计维度': '高球传中',
'总次数': high_total,
'成功次数': high_success,
'成功率(%)': round(high_rate, 2)
})
# 3. 按传中类型统计
for cross_type in df['cross_type'].unique():
type_df = df[df['cross_type'] == cross_type]
type_total = len(type_df)
type_success = type_df['is_successful'].sum()
type_rate = (type_success / type_total * 100) if type_total > 0 else 0
stats.append({
'统计维度': f'{cross_type}传中',
'总次数': type_total,
'成功次数': type_success,
'成功率(%)': round(type_rate, 2)
})
return pd.DataFrame(stats)
def player_analysis(self, min_crosses=3):
"""
球员分析
参数:
- min_crosses: 最少传中次数(筛选标准)
返回: 球员排名DataFrame
"""
player_list = []
for player, stats in self.player_stats.items():
if stats['total'] >= min_crosses:
rate = (stats['successful'] / stats['total'] * 100)
player_list.append({
'球员': player,
'球队': stats['team'],
'总传中': stats['total'],
'成功争顶': stats['successful'],
'成功率(%)': round(rate, 2)
})
df = pd.DataFrame(player_list)
if not df.empty:
df = df.sort_values('成功率(%)', ascending=False).reset_index(drop=True)
return df
def team_high_ball_analysis(self):
"""
球队高球传中分析
"""
team_list = []
for team, stats in self.team_stats.items():
if stats['high_ball'] > 0:
high_rate = (stats['high_success'] / stats['high_ball'] * 100)
else:
high_rate = 0
total_rate = (stats['successful'] / stats['total'] * 100) if stats['total'] > 0 else 0
team_list.append({
'球队': team,
'总传中': stats['total'],
'总成功': stats['successful'],
'总成功率(%)': round(total_rate, 2),
'高球传中': stats['high_ball'],
'高球成功': stats['high_success'],
'高球成功率(%)': round(high_rate, 2)
})
df = pd.DataFrame(team_list)
if not df.empty:
df = df.sort_values('高球成功率(%)', ascending=False).reset_index(drop=True)
return df
def advanced_analysis(self):
"""
高级分析:考虑多种因素
"""
df = pd.DataFrame(self.all_crosses)
if df.empty:
return {}
# 1. 防守压力分析
def pressure_analysis():
pressure_groups = df.groupby(pd.cut(df['defender_count'],
bins=[0, 1, 3, 10],
labels=['低压力(0-1人)', '中等压力(2-3人)', '高压(4+人)']))
return pressure_groups['is_successful'].agg(['count', 'sum', 'mean']).assign(
success_rate=lambda x: round(x['mean'] * 100, 2)
)
# 2. 定位球vs运动战分析
def set_piece_analysis():
set_piece_stats = df.groupby('is_set_piece')['is_successful'].agg(['count', 'sum', 'mean'])
set_piece_stats.index = ['运动战', '定位球']
set_piece_stats['success_rate'] = round(set_piece_stats['mean'] * 100, 2)
return set_piece_stats
# 3. 区域分析(如果有区域数据)
def zone_analysis():
if 'cross_zone' in df.columns and df['cross_zone'].notna().any():
zone_stats = df.groupby('cross_zone')['is_successful'].agg(['count', 'sum', 'mean'])
zone_stats['success_rate'] = round(zone_stats['mean'] * 100, 2)
return zone_stats
return None
return {
'防守压力分析': pressure_analysis(),
'定位球分析': set_piece_analysis(),
'区域分析': zone_analysis()
}
def generate_report(self):
"""
生成完整报告
"""
print("=" * 60)
print("高球传中争顶成功率分析报告")
print("=" * 60)
# 1. 总体统计
print("\n【总体统计】")
overall_stats = self.calculate_success_rate()
print(overall_stats.to_string(index=False))
# 2. 球员排名
print("\n【球员排名(最少3次传中)】")
player_rank = self.player_analysis()
if not player_rank.empty:
print(player_rank.to_string(index=False))
else:
print("暂无足够数据")
# 3. 球队分析
print("\n【球队高球传中分析】")
team_analysis = self.team_high_ball_analysis()
if not team_analysis.empty:
print(team_analysis.to_string(index=False))
else:
print("暂无球队数据")
# 4. 高级分析
print("\n【高级分析】")
advanced = self.advanced_analysis()
print("\n防守压力对成功率的影响:")
print(advanced['防守压力分析'])
print("\n定位球vs运动战:")
print(advanced['定位球分析'])
if advanced['区域分析'] is not None:
print("\n传中区域分析:")
print(advanced['区域分析'])
def export_to_excel(self, filename='传中争顶分析.xlsx'):
"""
导出数据到Excel
"""
with pd.ExcelWriter(filename, engine='openpyxl') as writer:
# 原始数据
df = pd.DataFrame(self.all_crosses)
df.to_excel(writer, sheet_name='原始数据', index=False)
# 总体统计
self.calculate_success_rate().to_excel(writer, sheet_name='总体统计', index=False)
# 球员排名
self.player_analysis().to_excel(writer, sheet_name='球员排名', index=False)
# 球队分析
self.team_high_ball_analysis().to_excel(writer, sheet_name='球队分析', index=False)
# 高级分析
advanced = self.advanced_analysis()
advanced['防守压力分析'].to_excel(writer, sheet_name='防守压力分析')
advanced['定位球分析'].to_excel(writer, sheet_name='定位球分析')
print(f"\n数据已导出到 {filename}")
# 使用示例
if __name__ == "__main__":
# 创建分析器
analyzer = CrossSuccessAnalyzer()
# 生成示例数据
analyzer.generate_sample_data()
# 生成报告
analyzer.generate_report()
# 可选:导出到Excel
# analyzer.export_to_excel()
# 或者手动添加数据
# analyzer.add_cross_event(
# match_id='MATCH002',
# player_name='测试球员',
# team_name='测试队',
# cross_type='高球',
# is_successful=True,
# defender_count=2,
# is_set_piece=False,
# cross_zone='右路'
# )
这个案例包含以下功能:
主要功能:
- 数据收集 - 记录每次传中事件的详细信息
- 成功率计算 - 按不同维度统计成功率
- 球员分析 - 个人表现排名
- 球队分析 - 球队级别的统计
- 高级分析 - 考虑防守压力、定位球等因素
统计维度包括:
- 总体传中成功率
- 按传中类型(高球/低平球/地面球)分别统计
- 球员个人成功率排名
- 球队高球传中成功率
- 防守压力对成功率的影响
- 定位球vs运动战的对比
使用方法:
# 1. 创建分析器
analyzer = CrossSuccessAnalyzer()
# 2. 添加数据(可以手动添加)
analyzer.add_cross_event(
match_id='MATCH001',
player_name='球员A',
team_name='球队X',
cross_type='高球',
is_successful=True
)
# 3. 或生成示例数据
analyzer.generate_sample_data()
# 4. 生成分析报告
analyzer.generate_report()
你可以根据实际需求修改:
- 添加更多数据维度(如跑动距离、起跳高度等)
- 修改筛选条件
- 调整统计方法
- 扩展分析功能(如时间序列分析、趋势分析等)
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播