本文目录导读:

我来为您设计一个统计门球短传配合成功率的Python案例,这个案例会包含数据模拟、统计分析、可视化和报告输出。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
import random
from collections import defaultdict
class 门球短传配合分析系统:
def __init__(self):
"""初始化分析系统"""
self.data = None
self.success_rate = 0
def generate_match_data(self, num_passes=100):
"""
生成模拟的门球比赛传球数据
"""
print("正在生成模拟数据...")
# 可能的传球区域
areas = ['前场左路', '前场中路', '前场右路',
'中场左路', '中场中路', '中场右路',
'后场左路', '后场中路', '后场右路']
# 球员编号
players = [f'球员{i:02d}' for i in range(1, 11)]
# 生成传球数据
passes_data = []
for i in range(num_passes):
# 随机生成传球记录
pass_record = {
'传球编号': i + 1,
'传球时间': f'{random.randint(0, 2):02d}:{random.randint(0, 59):02d}:{random.randint(0, 59):02d}',
'传球球员': random.choice(players),
'接球球员': random.choice(players),
'传球区域': random.choice(areas),
'传球距离': round(random.uniform(5, 25), 1), # 5-25米的短传
'接球区域': random.choice(areas),
'是否成功': random.choice([0, 1]), # 0=失败,1=成功
'比赛节次': random.randint(1, 4), # 四节比赛
'进攻方向': random.choice(['左路进攻', '中路进攻', '右路进攻'])
}
# 确保传球球员和接球球员不同
while pass_record['传球球员'] == pass_record['接球球员']:
pass_record['接球球员'] = random.choice(players)
# 根据距离调整成功率(距离越近成功率越高)
if pass_record['传球距离'] < 8:
success_rate = 0.7
elif pass_record['传球距离'] < 15:
success_rate = 0.55
else:
success_rate = 0.4
pass_record['是否成功'] = np.random.choice([1, 0], p=[success_rate, 1-success_rate])
passes_data.append(pass_record)
self.data = pd.DataFrame(passes_data)
return self.data
def calculate_success_rate(self):
"""
计算总体成功率
"""
total_passes = len(self.data)
successful_passes = self.data['是否成功'].sum()
self.success_rate = (successful_passes / total_passes) * 100
print(f"总传球数: {total_passes}")
print(f"成功传球数: {successful_passes}")
print(f"总体成功率: {self.success_rate:.2f}%")
return self.success_rate
def analyze_by_area(self):
"""
按区域分析传球成功率
"""
print("\n=== 按区域分析传球成功率 ===")
area_analysis = self.data.groupby('传球区域').agg({
'是否成功': ['count', 'sum', 'mean']
}).round(3)
area_analysis.columns = ['传球总数', '成功次数', '成功率']
area_analysis['成功率百分比'] = area_analysis['成功率'] * 100
print(area_analysis.to_string())
return area_analysis
def analyze_by_player(self):
"""
按球员分析传球成功率
"""
print("\n=== 按球员分析传球成功率 ===")
player_analysis = self.data.groupby('传球球员').agg({
'是否成功': ['count', 'sum', 'mean']
}).round(3)
player_analysis.columns = ['传球总数', '成功次数', '成功率']
player_analysis['成功率百分比'] = player_analysis['成功率'] * 100
player_analysis = player_analysis.sort_values('成功率百分比', ascending=False)
print(player_analysis.to_string())
return player_analysis
def analyze_by_distance(self):
"""
按距离段分析传球成功率
"""
print("\n=== 按距离段分析传球成功率 ===")
# 划分距离段
bins = [0, 7, 10, 13, 16, 20, 25]
labels = ['5-7m', '7-10m', '10-13m', '13-16m', '16-20m', '20m以上']
self.data['距离段'] = pd.cut(self.data['传球距离'], bins=bins, labels=labels, right=False)
distance_analysis = self.data.groupby('距离段').agg({
'是否成功': ['count', 'sum', 'mean']
}).round(3)
distance_analysis.columns = ['传球总数', '成功次数', '成功率']
distance_analysis['成功率百分比'] = distance_analysis['成功率'] * 100
print(distance_analysis.to_string())
return distance_analysis
def visualize_results(self):
"""
可视化分析结果
"""
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
fig.suptitle('门球短传配合分析报告', fontsize=16, fontweight='bold')
# 1. 各区域传球成功率
area_analysis = self.analyze_by_area()
ax1 = axes[0, 0]
area_analysis['成功率百分比'].plot(kind='bar', ax=ax1, color='skyblue')
ax1.set_title('各区域传球成功率')
ax1.set_xlabel('传球区域')
ax1.set_ylabel('成功率 (%)')
ax1.set_ylim(0, 100)
for i, v in enumerate(area_analysis['成功率百分比']):
ax1.text(i, v + 3, f'{v:.1f}%', ha='center', fontsize=9)
# 2. 球员传球成功率
player_analysis = self.analyze_by_player()
ax2 = axes[0, 1]
player_analysis['成功率百分比'].plot(kind='bar', ax=ax2, color='lightcoral')
ax2.set_title('球员传球成功率')
ax2.set_xlabel('球员')
ax2.set_ylabel('成功率 (%)')
ax2.set_ylim(0, 100)
for i, v in enumerate(player_analysis['成功率百分比']):
ax2.text(i, v + 2, f'{v:.1f}%', ha='center', fontsize=9, rotation=45)
# 3. 距离与成功率关系
distance_analysis = self.analyze_by_distance()
ax3 = axes[1, 0]
ax3.plot(distance_analysis.index, distance_analysis['成功率百分比'],
marker='o', linewidth=2, color='green')
ax3.set_title('传球距离与成功率关系')
ax3.set_xlabel('传球距离')
ax3.set_ylabel('成功率 (%)')
ax3.set_ylim(0, 100)
ax3.grid(True)
# 4. 成功/失败饼图
ax4 = axes[1, 1]
success_count = self.data['是否成功'].sum()
fail_count = len(self.data) - success_count
ax4.pie([success_count, fail_count],
labels=['成功', '失败'],
autopct='%1.1f%%',
colors=['lightgreen', 'lightcoral'],
explode=(0.05, 0))
ax4.set_title('成功/失败比例')
plt.tight_layout()
plt.show()
def generate_report(self):
"""
生成详细的文字报告
"""
print("\n" + "="*60)
print("门球短传配合分析报告")
print("="*60)
# 总体统计
print(f"\n【总体概况】")
print(f"总传球次数: {len(self.data)}")
print(f"平均传球距离: {self.data['传球距离'].mean():.2f}米")
print(f"最大传球距离: {self.data['传球距离'].max()}米")
print(f"最小传球距离: {self.data['传球距离'].min()}米")
# 各节比赛成功率
print(f"\n【各节比赛分析】")
for section in range(1, 5):
section_data = self.data[self.data['比赛节次'] == section]
if len(section_data) > 0:
success_rate = section_data['是否成功'].mean() * 100
print(f"第{section}节: 传球{len(section_data)}次, 成功率{success_rate:.1f}%")
# 进攻方向分析
print(f"\n【进攻方向分析】")
direction_analysis = self.data.groupby('进攻方向').agg({
'是否成功': ['count', 'mean']
}).round(3)
direction_analysis.columns = ['传球总数', '成功率']
direction_analysis['成功率百分比'] = direction_analysis['成功率'] * 100
print(direction_analysis.to_string())
# 找出表现最好的球员
player_analysis = self.analyze_by_player()
top_players = player_analysis[player_analysis['传球总数'] >= 5].head(3)
print(f"\n【最佳传球手】")
for player in top_players.index:
row = top_players.loc[player]
print(f"{player}: {row['成功率百分比']:.1f}%成功率 ({int(row['成功次数'])}次成功/{int(row['传球总数'])}次传球)")
def export_data(self, filename='门球传球数据.csv'):
"""
导出数据到CSV文件
"""
self.data.to_csv(filename, index=False, encoding='utf-8-sig')
print(f"数据已导出到 {filename}")
def run_full_analysis(self, num_passes=100):
"""
运行完整分析流程
"""
# 生成数据
self.generate_match_data(num_passes)
# 计算总体成功率
print("\n" + "="*60)
print("基本统计")
print("="*60)
self.calculate_success_rate()
# 详细分析
area_analysis = self.analyze_by_area()
player_analysis = self.analyze_by_player()
distance_analysis = self.analyze_by_distance()
# 可视化
self.visualize_results()
# 生成报告
self.generate_report()
# 导出数据
self.export_data()
return self.data
# 使用示例
if __name__ == "__main__":
# 创建分析系统实例
analyzer = 门球短传配合分析系统()
# 运行完整分析
data = analyzer.run_full_analysis(num_passes=200)
# 可以直接查看数据
print("\n" + "="*60)
print("数据预览(前10行)")
print("="*60)
print(data.head(10).to_string())
这个案例提供了以下功能:
主要功能
-
数据模拟:自动生成模拟的门球传球数据
-
成功率统计:计算总体成功率和各维度成功率
-
多维度分析:
- 按区域分析(前场、中场、后场)
- 按球员分析
- 按传球距离分析
- 按比赛节次分析
- 按进攻方向分析
-
可视化:生成直观的图表展示分析结果
-
报告生成:输出详细的分析报告
-
数据导出:支持CSV格式导出
分析维度
- 传球区域成功率
- 球员个人成功率
- 距离与成功率关系
- 不同比赛节次的成功率变化
- 进攻方向的成功率
使用说明
运行程序后会自动:
- 生成200次模拟传球数据
- 计算总体成功率
- 分析各维度数据
- 显示可视化图表
- 生成详细报告
您可以根据实际需求调整传球数据数量和分析参数,这个框架可以直接用于实际的比赛数据统计分析。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播