本文目录导读:

我将为您创建一个门球短传配合成功率的统计系统,这个案例会包含数据模型、统计分析函数和可视化展示。
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文件导入功能 - 分析维度:可根据需要添加更多分析维度(如场地位置、球员位置等)
- 实时监控:可扩展为实时数据输入和监控系统
- 预测功能:可加入机器学习模型预测成功率
这个系统有助于教练团队分析短传配合的效率,发现需要改进的环节,优化战术安排。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播