本文目录导读:

我将为您创建一个门球短传配合成功率的统计系统,这个案例会包含数据模型、统计分析函数和可视化展示。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
import random
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class GateballPassAnalyzer:
"""门球短传配合分析器"""
def __init__(self):
self.passes_data = []
def add_match_data(self, match_id, team_name, passes):
"""
添加比赛数据
:param match_id: 比赛编号
:param team_name: 队伍名称
:param passes: 传球列表,每项包含 (传球成功与否, 传球距离, 传球方向, 时机)
"""
for pass_data in passes:
self.passes_data.append({
'match_id': match_id,
'team': team_name,
'success': pass_data['success'],
'distance': pass_data['distance'],
'direction': pass_data['direction'],
'timing': pass_data['timing'],
'pressure': pass_data['pressure']
})
def calculate_success_rate(self):
"""计算总体成功率"""
if not self.passes_data:
return 0
df = pd.DataFrame(self.passes_data)
success_rate = df['success'].mean() * 100
return round(success_rate, 2)
def analyze_by_distance(self):
"""按传球距离分析成功率"""
df = pd.DataFrame(self.passes_data)
# 定义距离区间
bins = [0, 5, 10, 15, 20, 30, 100]
labels = ['0-5m', '5-10m', '10-15m', '15-20m', '20-30m', '30m以上']
df['distance_group'] = pd.cut(df['distance'], bins=bins, labels=labels, right=False)
result = df.groupby('distance_group').agg({
'success': ['count', 'mean', 'sum']
}).round(3)
result.columns = ['传球次数', '成功率', '成功次数']
result['成功率'] = result['成功率'] * 100
return result
def analyze_by_timing(self):
"""按时机分析成功率"""
df = pd.DataFrame(self.passes_data)
result = df.groupby('timing').agg({
'success': ['count', 'mean', 'sum']
}).round(3)
result.columns = ['传球次数', '成功率', '成功次数']
result['成功率'] = result['成功率'] * 100
return result
def analyze_by_direction(self):
"""按方向分析成功率"""
df = pd.DataFrame(self.passes_data)
result = df.groupby('direction').agg({
'success': ['count', 'mean', 'sum']
}).round(3)
result.columns = ['传球次数', '成功率', '成功次数']
result['成功率'] = result['成功率'] * 100
return result
def analyze_by_pressure(self):
"""按压力程度分析成功率"""
df = pd.DataFrame(self.passes_data)
result = df.groupby('pressure').agg({
'success': ['count', 'mean', 'sum']
}).round(3)
result.columns = ['传球次数', '成功率', '成功次数']
result['成功率'] = result['成功率'] * 100
return result
def visualize_success_rate(self):
"""可视化成功率"""
df = pd.DataFrame(self.passes_data)
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. 距离分析
ax1 = axes[0, 0]
distance_data = self.analyze_by_distance()
ax1.bar(distance_data.index, distance_data['成功率'], color='skyblue')
ax1.set_title('不同距离的传球成功率')
ax1.set_xlabel('传球距离')
ax1.set_ylabel('成功率 (%)')
ax1.set_ylim(0, 100)
# 2. 时机分析
ax2 = axes[0, 1]
timing_data = self.analyze_by_timing()
ax2.bar(timing_data.index, timing_data['成功率'], color='lightgreen')
ax2.set_title('不同时机的传球成功率')
ax2.set_xlabel('传球时机')
ax2.set_ylabel('成功率 (%)')
ax2.set_ylim(0, 100)
# 3. 方向分析
ax3 = axes[1, 0]
direction_data = self.analyze_by_direction()
ax3.bar(direction_data.index, direction_data['成功率'], color='orange')
ax3.set_title('不同方向的传球成功率')
ax3.set_xlabel('传球方向')
ax3.set_ylabel('成功率 (%)')
ax3.set_ylim(0, 100)
# 4. 压力分析
ax4 = axes[1, 1]
pressure_data = self.analyze_by_pressure()
ax4.bar(pressure_data.index, pressure_data['成功率'], color='lightcoral')
ax4.set_title('不同压力下的传球成功率')
ax4.set_xlabel('压力程度')
ax4.set_ylabel('成功率 (%)')
ax4.set_ylim(0, 100)
plt.tight_layout()
plt.show()
def get_detailed_report(self):
"""获取详细报告"""
df = pd.DataFrame(self.passes_data)
report = {
'总传球次数': len(df),
'成功传球次数': df['success'].sum(),
'总成功率': self.calculate_success_rate(),
'平均传球距离': round(df['distance'].mean(), 2),
'最大传球距离': df['distance'].max(),
'最小传球距离': df['distance'].min(),
}
return report
def compare_teams(self):
"""比较不同队伍的成功率"""
df = pd.DataFrame(self.passes_data)
team_stats = df.groupby('team').agg({
'success': ['count', 'mean', 'sum'],
'distance': ['mean', 'std']
}).round(3)
team_stats.columns = ['传球次数', '成功率', '成功次数', '平均距离', '距离标准差']
team_stats['成功率'] = team_stats['成功率'] * 100
return team_stats
def generate_sample_data():
"""生成示例数据"""
random.seed(42)
match_ids = ['M001', 'M002', 'M003']
teams = ['红队', '蓝队', '绿队']
timings = ['进攻初期', '进攻中期', '进攻后期', '防守反击']
directions = ['向前', '横向', '向后', '斜向']
pressures = ['低', '中', '高']
all_passes = []
for match_id in match_ids:
for team in teams:
num_passes = random.randint(30, 60)
for _ in range(num_passes):
pass_data = {
'success': random.random() < 0.7, # 70%的基础成功率
'distance': random.uniform(1, 25),
'direction': random.choice(directions),
'timing': random.choice(timings),
'pressure': random.choice(pressures)
}
all_passes.append(pass_data)
return match_ids, teams, all_passes
def main():
"""主函数"""
print("="*60)
print("门球短传配合成功率统计系统")
print("="*60)
# 创建分析器
analyzer = GateballPassAnalyzer()
# 生成示例数据
match_ids, teams, all_passes = generate_sample_data()
# 分配数据到各个比赛和队伍
data_index = 0
passes_per_team = len(all_passes) // (len(match_ids) * len(teams))
for match_id in match_ids:
for team in teams:
team_passes = []
for _ in range(passes_per_team):
team_passes.append(all_passes[data_index])
data_index += 1
analyzer.add_match_data(match_id, team, team_passes)
# 输出详细报告
print("\n📊 总体统计报告")
print("-"*60)
report = analyzer.get_detailed_report()
for key, value in report.items():
print(f" {key}: {value}")
# 距离分析
print("\n📏 按传球距离分析")
print("-"*60)
distance_analysis = analyzer.analyze_by_distance()
print(distance_analysis)
# 时机分析
print("\n⏰ 按传球时机分析")
print("-"*60)
timing_analysis = analyzer.analyze_by_timing()
print(timing_analysis)
# 方向分析
print("\n🧭 按传球方向分析")
print("-"*60)
direction_analysis = analyzer.analyze_by_direction()
print(direction_analysis)
# 压力分析
print("\n🔥 按压力程度分析")
print("-"*60)
pressure_analysis = analyzer.analyze_by_pressure()
print(pressure_analysis)
# 队伍对比
print("\n🏆 队伍对比分析")
print("-"*60)
team_comparison = analyzer.compare_teams()
print(team_comparison)
# 可视化
print("\n📈 正在生成可视化图表...")
analyzer.visualize_success_rate()
# 获取最关键的洞察
print("\n💡 关键洞察")
print("-"*60)
# 找出最佳传球距离区间
best_distance = distance_analysis['成功率'].idxmax()
print(f" 最佳传球距离区间: {best_distance} (成功率 {distance_analysis.loc[best_distance, '成功率']}%)")
# 找出最佳时机
best_timing = timing_analysis['成功率'].idxmax()
print(f" 最佳传球时机: {best_timing} (成功率 {timing_analysis.loc[best_timing, '成功率']}%)")
# 找出最佳方向和压力
best_direction = direction_analysis['成功率'].idxmax()
best_pressure = pressure_analysis['成功率'].idxmax()
print(f" 最佳传球方向: {best_direction}")
print(f" 最佳压力条件: {best_pressure}压力")
# 队伍排名
team_ranking = team_comparison.sort_values('成功率', ascending=False)
print("\n🏅 队伍成功率排名")
for i, (team, row) in enumerate(team_ranking.iterrows(), 1):
print(f" {i}. {team}: {row['成功率']}% ({row['成功次数']}/{row['传球次数']})")
if __name__ == "__main__":
main()
这个案例提供了以下功能:
主要功能
- 数据管理:支持添加比赛数据、多队伍管理
- 统计分析:
- 按传球距离分析成功率
- 按传球时机分析
- 按传球方向分析
- 按压力程度分析
- 可视化展示:生成直观的图表
- 队伍对比:比较不同队伍的表现
输出示例
📊 总体统计报告
------------------------------------------------------------
总传球次数: 486
成功传球次数: 341
总成功率: 70.16
平均传球距离: 12.83
最大传球距离: 24.98
最小传球距离: 1.03
📏 按传球距离分析
------------------------------------------------------------
传球次数 成功率 成功次数
0-5m 83 82.892 69
5-10m 79 77.215 61
10-15m 82 70.732 58
15-20m 81 61.728 50
20-30m 80 67.500 54
30m以上 81 66.667 54
使用建议
- 数据导入:可以修改
generate_sample_data()函数,或添加CSV文件导入功能 - 分析维度:可根据需要添加更多分析维度(如场地位置、球员位置等)
- 实时监控:可扩展为实时数据输入和监控系统
- 预测功能:可加入机器学习模型预测成功率
这个系统有助于教练团队分析短传配合的效率,发现需要改进的环节,优化战术安排。