本文目录导读:

我来帮你创建一个统计足球比赛中脚后跟传球成功次数的Python案例。
基础版本
def count_heel_passes(events):
"""
统计脚后跟传球成功次数
events: 比赛事件列表,每个事件是一个字典
"""
heel_pass_count = 0
for event in events:
# 判断是否为脚后跟传球且成功
if (event.get('event_type') == 'pass' and
event.get('pass_type') == 'heel' and
event.get('outcome') == 'success'):
heel_pass_count += 1
return heel_pass_count
# 示例数据
match_events = [
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 'player': '梅西'},
{'event_type': 'pass', 'pass_type': 'normal', 'outcome': 'success', 'player': 'C罗'},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'fail', 'player': '内马尔'},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 'player': '本泽马'},
{'event_type': 'pass', 'pass_type': 'long', 'outcome': 'success', 'player': '德布劳内'},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 'player': '梅西'},
{'event_type': 'shot', 'pass_type': None, 'outcome': 'goal', 'player': '姆巴佩'},
]
result = count_heel_passes(match_events)
print(f"脚后跟传球成功次数: {result}")
进阶版本(更详细的统计)
class HeelPassAnalyzer:
"""脚后跟传球分析器"""
def __init__(self):
self.passes = []
self.success_count = 0
self.fail_count = 0
self.total_count = 0
self.player_stats = {} # 球员统计
self.equipment_stats = {} # 场地/比赛阶段统计
def add_event(self, event):
"""添加一个比赛事件"""
if event.get('event_type') != 'pass':
return
if event.get('pass_type') != 'heel':
return
self.passes.append(event)
self.total_count += 1
outcome = event.get('outcome')
if outcome == 'success':
self.success_count += 1
elif outcome == 'fail':
self.fail_count += 1
# 统计球员数据
player = event.get('player', 'unknown')
if player not in self.player_stats:
self.player_stats[player] = {'success': 0, 'fail': 0}
if outcome == 'success':
self.player_stats[player]['success'] += 1
elif outcome == 'fail':
self.player_stats[player]['fail'] += 1
# 统计比赛阶段
period = event.get('period', 'unknown')
if period not in self.equipment_stats:
self.equipment_stats[period] = {'success': 0, 'fail': 0}
if outcome == 'success':
self.equipment_stats[period]['success'] += 1
elif outcome == 'fail':
self.equipment_stats[period]['fail'] += 1
def get_success_rate(self):
"""获取成功率"""
if self.total_count == 0:
return 0
return (self.success_count / self.total_count) * 100
def get_player_ranking(self):
"""获取球员排名"""
ranking = []
for player, stats in self.player_stats.items():
total = stats['success'] + stats['fail']
if total > 0:
rate = (stats['success'] / total) * 100
ranking.append({
'player': player,
'total': total,
'success': stats['success'],
'success_rate': round(rate, 1)
})
return sorted(ranking, key=lambda x: x['success_rate'], reverse=True)
def get_summary(self):
"""获取汇总信息"""
return {
'total_pass': self.total_count,
'success_count': self.success_count,
'fail_count': self.fail_count,
'success_rate': round(self.get_success_rate(), 1),
'players_used': len(self.player_stats),
'periods_analyzed': len(self.equipment_stats)
}
def load_match_data():
"""加载比赛数据(模拟)"""
# 这里可以替换为从文件或API加载真实数据
return [
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success',
'player': '梅西', 'period': '上半场', 'minute': 12},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success',
'player': 'C罗', 'period': '上半场', 'minute': 15},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'fail',
'player': '内马尔', 'period': '上半场', 'minute': 23},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success',
'player': '梅西', 'period': '上半场', 'minute': 45},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success',
'player': '本泽马', 'period': '下半场', 'minute': 55},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'fail',
'player': '姆巴佩', 'period': '下半场', 'minute': 67},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success',
'player': '德布劳内', 'period': '下半场', 'minute': 78},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success',
'player': 'C罗', 'period': '下半场', 'minute': 85},
{'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success',
'player': '梅西', 'period': '下半场', 'minute': 90},
]
def main():
"""主函数"""
analyzer = HeelPassAnalyzer()
# 加载数据
match_events = load_match_data()
# 分析所有事件
for event in match_events:
analyzer.add_event(event)
# 输出结果
print("=" * 50)
print("脚后跟传球统计分析")
print("=" * 50)
# 基本统计
summary = analyzer.get_summary()
print(f"\n📊 基本统计:")
print(f" 总传球次数: {summary['total_pass']}")
print(f" 成功次数: {summary['success_count']}")
print(f" 失败次数: {summary['fail_count']}")
print(f" 成功率: {summary['success_rate']}%")
print(f" 参与球员数: {summary['players_used']}")
# 球员排名
print(f"\n🏆 球员排名(按成功率):")
player_ranking = analyzer.get_player_ranking()
for i, player in enumerate(player_ranking, 1):
print(f" {i}. {player['player']}: {player['success']}/{player['total']} "
f"({player['success_rate']}%)")
# 场地/时期统计
print(f"\n⏱️ 比赛阶段统计:")
for period, stats in analyzer.equipment_stats.items():
success_rate = 0
total = stats['success'] + stats['fail']
if total > 0:
success_rate = (stats['success'] / total) * 100
print(f" {period}: 成功 {stats['success']} 次, "
f"失败 {stats['fail']} 次, 成功率 {success_rate:.1f}%")
# 运行主程序
if __name__ == "__main__":
main()
进阶版本(数据可视化)
import matplotlib.pyplot as plt
import pandas as pd
from collections import Counter
def visualize_heel_passes():
"""可视化脚后跟传球数据"""
# 模拟数据
data = {
'player': ['梅西', 'C罗', '内马尔', '本泽马', '姆巴佩', '德布劳内', '哈兰德'],
'success': [8, 6, 5, 4, 3, 7, 2],
'fail': [2, 3, 4, 2, 1, 2, 1]
}
df = pd.DataFrame(data)
df['total'] = df['success'] + df['fail']
df['success_rate'] = (df['success'] / df['total'] * 100).round(1)
# 创建图表
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# 柱状图显示成功/失败次数
x = np.arange(len(df))
width = 0.35
ax1.bar(x - width/2, df['success'], width, label='成功', color='green')
ax1.bar(x + width/2, df['fail'], width, label='失败', color='red')
ax1.set_xlabel('球员')
ax1.set_ylabel('次数')
ax1.set_title('脚后跟传球成功/失败次数')
ax1.set_xticks(x)
ax1.set_xticklabels(df['player'])
ax1.legend()
# 饼图显示成功率
colors = plt.cm.Set3(range(len(df)))
ax2.pie(df['success'], labels=df['player'], autopct='%1.1f%%',
colors=colors, startangle=90)
ax2.set_title('脚后跟传球成功分布')
plt.tight_layout()
plt.show()
使用CSV文件版本
import csv
def analyze_from_csv(file_path):
"""从CSV文件读取数据并分析"""
heel_pass_success = 0
heel_pass_total = 0
with open(file_path, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
if (row['event_type'] == 'pass' and row['pass_type'] == 'heel'):
heel_pass_total += 1
if row['outcome'] == 'success':
heel_pass_success += 1
return {
'total': heel_pass_total,
'success': heel_pass_success,
'fail': heel_pass_total - heel_pass_success,
'success_rate': (heel_pass_success / heel_pass_total * 100) if heel_pass_total > 0 else 0
}
# 示例:创建CSV文件
def create_example_csv():
"""创建示例CSV文件"""
headers = ['event_type', 'pass_type', 'outcome', 'player', 'minute']
data = [
['pass', 'heel', 'success', '梅西', 12],
['pass', 'heel', 'success', 'C罗', 15],
['pass', 'normal', 'success', '内马尔', 20],
['pass', 'heel', 'fail', '本泽马', 25],
['pass', 'heel', 'success', '姆巴佩', 45],
['pass', 'long', 'success', '德布劳内', 60],
['pass', 'heel', 'success', '哈兰德', 75],
['pass', 'heel', 'success', '梅西', 85],
]
with open('match_data.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(headers)
writer.writerows(data)
if __name__ == "__main__":
# 创建示例文件并分析
create_example_csv()
result = analyze_from_csv('match_data.csv')
print(f"脚后跟传球总数: {result['total']}")
print(f"成功次数: {result['success']}")
print(f"失败次数: {result['fail']}")
print(f"成功率: {result['success_rate']:.1f}%")
主要功能说明
- 基础版本:简单统计成功次数
- 进阶版本:支持按球员、时间段等维度详细统计
- 可视化版本:生成图表展示结果
- CSV版本:从文件读取真实比赛数据
这些代码可以直接运行,你也可以根据自己的数据结构进行调整,需要我解释某个部分或者添加特定功能吗?