我来为您设计一个统计门前抢点射门次数的Python案例,这个案例将模拟足球比赛中两名前锋的抢点射门数据对比。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from datetime import datetime
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
class 抢点射门分析器:
def __init__(self):
"""初始化数据分析器"""
self.射门数据 = []
self.球员名单 = []
def 添加射门数据(self, 球员名, 比赛时间, 射门区域, 射门方式, 是否进球, 射门距离):
"""
添加单个射门数据
参数:
- 球员名: 球员姓名
- 比赛时间: 比赛时间(分钟)
- 射门区域: 禁区外/小禁区/大禁区/点球点
- 射门方式: 抢点/起脚/头球/点球
- 是否进球: 是/否
- 射门距离: 距离球门距离(米)
"""
数据 = {
'球员': 球员名,
'比赛时间': 比赛时间,
'射门区域': 射门区域,
'射门方式': 射门方式,
'得分': 是否进球,
'距离': 射门距离
}
self.射门数据.append(数据)
if 球员名 not in self.球员名单:
self.球员名单.append(球员名)
def 生成模拟数据(self, 球员名, 场次=30, 平均射门=5):
"""
生成模拟射门数据
参数:
- 球员名: 球员列表
- 场次: 比赛场次数
- 平均射门: 每场平均射门数
"""
np.random.seed(42) # 设置随机种子确保结果可复现
for player in 球员名:
# 生成基础射门数据
总射门数 = int(平均射门 * 场次 * np.random.uniform(0.8, 1.2))
for i in range(总射门数):
# 随机生成比赛时间
比赛时间 = np.random.randint(1, 95)
# 根据抢点特点设置概率分布
区域概率 = np.random.choice(['小禁区', '大禁区', '禁区外'], p=[0.35, 0.45, 0.2])
# 设置射门方式概率
if 区域概率 == '小禁区':
方式概率 = np.random.choice(['抢点', '头球', '起脚'], p=[0.6, 0.2, 0.2])
elif 区域概率 == '大禁区':
方式概率 = np.random.choice(['抢点', '起脚', '头球'], p=[0.3, 0.5, 0.2])
else:
方式概率 = np.random.choice(['远射', '抢点'], p=[0.7, 0.3])
# 进球概率与射门区域相关
if 区域概率 == '小禁区':
进球概率 = 0.35
elif 区域概率 == '大禁区':
进球概率 = 0.15
else:
进球概率 = 0.05
是否进球 = '是' if np.random.random() < 进球概率 else '否'
# 设置射门距离
if 区域概率 == '小禁区':
距离 = np.random.uniform(1, 8)
elif 区域概率 == '大禁区':
距离 = np.random.uniform(8, 16)
else:
距离 = np.random.uniform(16, 30)
self.添加射门数据(
player, 比赛时间, 区域概率, 方式概率,
是否进球, round(距离, 1)
)
def 统计抢点射门(self, 球员列表):
"""
统计指定球员的抢点射门数据
"""
统计结果 = {}
for 球员 in 球员列表:
球员数据 = [d for d in self.射门数据 if d['球员'] == 球员]
抢点数据 = [d for d in 球员数据 if d['射门方式'] == '抢点']
统计结果[球员] = {
'总射门': len(球员数据),
'抢点射门': len(抢点数据),
'抢点进球': sum(1 for d in 抢点数据 if d['得分'] == '是'),
'抢点率': len(抢点数据) / max(len(球员数据), 1) * 100,
'抢点命中率': sum(1 for d in 抢点数据 if d['得分'] == '是') / max(len(抢点数据), 1) * 100
}
return 统计结果
def 对比分析(self, 球员A, 球员B):
"""
对比两个球员的抢点射门数据
"""
# 获取统计数据
stats = self.统计抢点射门([球员A, 球员B])
# 获取抢点射门详情
球员A抢点 = [d for d in self.射门数据 if d['球员'] == 球员A and d['射门方式'] == '抢点']
球员B抢点 = [d for d in self.射门数据 if d['球员'] == 球员B and d['射门方式'] == '抢点']
# 按照比赛时间段统计
def 时间段统计(抢点数据):
时间段 = {
'0-15分钟': 0, '15-30分钟': 0,
'30-45分钟': 0, '45-60分钟': 0,
'60-75分钟': 0, '75-90分钟': 0
}
for d in 抢点数据:
time = d['比赛时间']
if time < 15:
时间段['0-15分钟'] += 1
elif time < 30:
时间段['15-30分钟'] += 1
elif time < 45:
时间段['30-45分钟'] += 1
elif time < 60:
时间段['45-60分钟'] += 1
elif time < 75:
时间段['60-75分钟'] += 1
else:
时间段['75-90分钟'] += 1
return 时间段
# 创建对比表格
对比数据 = {
'指标': ['总射门数', '抢点射门数', '抢点进球数', '抢点占比(%)', '抢点命中率(%)'],
球员A: [stats[球员A]['总射门'], stats[球员A]['抢点射门'],
stats[球员A]['抢点进球'], f"{stats[球员A]['抢点率']:.2f}",
f"{stats[球员A]['抢点命中率']:.2f}"],
球员B: [stats[球员B]['总射门'], stats[球员B]['抢点射门'],
stats[球员B]['抢点进球'], f"{stats[球员B]['抢点率']:.2f}",
f"{stats[球员B]['抢点命中率']:.2f}"]
}
df_对比 = pd.DataFrame(对比数据)
# 可视化
self.绘制对比图(stats, 球员A, 球员B, 球员A抢点, 球员B抢点)
return df_对比, stats
def 绘制对比图(self, stats, 球员A, 球员B, 抢点数据A, 抢点数据B):
"""
绘制对比图表
"""
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. 射门类型对比饼图
ax1 = axes[0, 0]
球员A方式 = {'抢点': 抢点数据A.__len__(),
'其他': stats[球员A]['总射门'] - len(抢点数据A)}
球员B方式 = {'抢点': 抢点数据B.__len__(),
'其他': stats[球员B]['总射门'] - len(抢点数据B)}
# 绘制球员A抢点比例
sizes_A = [球员A方式['抢点'], 球员A方式['其他']]
sizes_B = [球员B方式['抢点'], 球员B方式['其他']]
labels = ['抢点射门', '其他射门']
colors = ['#ff9999','#66b3ff']
# 主饼图
wedges_A, texts_A, autotexts_A = ax1.pie(sizes_A, labels=[球员A] + [''],
autopct='%1.1f%%', colors=colors,
startangle=90, explode=(0.1, 0))
wedges_B, texts_B, autotexts_B = ax1.pie(sizes_B, labels=[球员B] + [''],
autopct='%1.1f%%', colors=['#99ff99','#ffcc99'],
startangle=90, explode=(0.1, 0))
# 添加中心圆实现环图效果
centre_circle = plt.Circle((0,0),0.70,fc='white')
fig.gca().add_artist(centre_circle)
ax1.set_title(f'射门类型构成对比')
ax1.legend([球员A, 球员B], loc='upper right')
# 2. 抢点区域分布柱状图
ax2 = axes[0, 1]
def 抢点区域分布(抢点数据):
区域分布 = {'小禁区': 0, '大禁区': 0, '禁区外': 0}
for d in 抢点数据:
if d['射门区域'] in 区域分布:
区域分布[d['射门区域']] += 1
return region_分布
# 简化区域分布
区域A = {}
区域B = {}
for d in 抢点数据A:
区域A[d['射门区域']] = 区域A.get(d['射门区域'], 0) + 1
for d in 抢点数据B:
区域B[d['射门区域']] = 区域B.get(d['射门区域'], 0) + 1
categories = ['小禁区', '大禁区', '禁区外']
values_A = [区域A.get(cat, 0) for cat in categories]
values_B = [区域B.get(cat, 0) for cat in categories]
x_pos = np.arange(len(categories))
width = 0.35
bars1 = ax2.bar(x_pos - width/2, values_A, width, label=球员A, color='#ff8c00')
bars2 = ax2.bar(x_pos + width/2, values_B, width, label=球员B, color='#4169e1')
ax2.set_xlabel('射门区域')
ax2.set_ylabel('次数')
ax2.set_title('抢点射门区域分布')
ax2.set_xticks(x_pos)
ax2.set_xticklabels(categories)
ax2.legend()
for bars in [bars1, bars2]:
for bar in bars:
height = bar.get_height()
ax2 text = ax2.text(bar.get_x() + bar.get_width()/2., height,
f'{int(height)}', ha='center', va='bottom')
# 3. 比赛时间段抢点分布
ax3 = axes[1, 0]
def 比分段时间统计(数据):
时间段 = {'0-15': 0, '15-30': 0, '30-45': 0,
'45-60': 0, '60-75': 0, '75-90': 0}
for d in 数据:
time = d['比赛时间']
if time < 15:
时间段['0-15'] += 1
elif time < 30:
时间段['15-30'] += 1
elif time < 45:
时间段['30-45'] += 1
elif time < 60:
时间段['45-60'] += 1
elif time < 75:
时间段['60-75'] += 1
else:
时间段['75-90'] += 1
return 时间段
时间A = 比分段时间统计(抢点数据A)
时间B = 比分段时间统计(抢点数据B)
time_categories = list(时间A.keys())
values_A_time = list(时间A.values())
values_B_time = list(时间B.values())
ax3.plot(time_categories, values_A_time, marker='o', label=球员A, linewidth=2, color='#ff8c00')
ax3.plot(time_categories, values_B_time, marker='s', label=球员B, linewidth=2, color='#4169e1')
ax3.set_xlabel('比赛时间段(分钟)')
ax3.set_ylabel('抢点射门次数')
ax3.set_title('比赛不同时间段抢点对比')
ax3.legend()
ax3.grid(True, alpha=0.3)
# 4. 抢点射门效率对比
ax4 = axes[1, 1]
metrics = ['抢点率(%)', '抢点命中率(%)']
values_A_metric = [stats[球员A]['抢点率'], stats[球员A]['抢点命中率']]
values_B_metric = [stats[球员B]['抢点率'], stats[球员B]['抢点命中率']]
x_pos = np.arange(len(metrics))
width = 0.35
bars1 = ax4.bar(x_pos - width/2, values_A_metric, width, label=球员A, color='#ff8c00')
bars2 = ax4.bar(x_pos + width/2, values_B_metric, width, label=球员B, color='#4169e1')
ax4.set_xlabel('指标')
ax4.set_ylabel('百分比(%)')
ax4.set_title('抢点效率对比')
ax4.set_xticks(x_pos)
ax4.set_xticklabels(metrics)
ax4.legend()
ax4.set_ylim(0, 100)
for bars in [bars1, bars2]:
for bar in bars:
height = bar.get_height()
ax4.text(bar.get_x() + bar.get_width()/2., height,
f'{height:.1f}%', ha='center', va='bottom')
plt.suptitle(f'抢点射门深度分析:{球员A} vs {球员B}', fontsize=16, y=1.02)
plt.tight_layout()
plt.show()
def 生成报告(self, 球员A, 球员B):
"""
生成详细的文本分析报告
"""
对比表格, stats = self.对比分析(球员A, 球员B)
print("=" * 60)
print(f"抢点射门分析报告:{球员A} vs {球员B}")
print("=" * 60)
print("\n【统计概览】")
print(对比表格.to_string(index=False))
print("\n【关键发现】")
# 找出更有优势的球员
if stats[球员A]['抢点率'] > stats[球员B]['抢点率']:
print(f"1. {球员A}的抢点射门占比更高({stats[球员A]['抢点率']:.1f}% vs {stats[球员B]['抢点率']:.1f}%)")
else:
print(f"1. {球员B}的抢点射门占比更高({stats[球员B]['抢点率']:.1f}% vs {stats[球员A]['抢点率']:.1f}%)")
if stats[球员A]['抢点命中率'] > stats[球员B]['抢点命中率']:
print(f"2. {球员A}的抢点射门效率更高({stats[球员A]['抢点命中率']:.1f}% vs {stats[球员B]['抢点命中率']:.1f}%)")
else:
print(f"2. {球员B}的抢点射门效率更高({stats[球员B]['抢点命中率']:.1f}% vs {stats[球员A]['抢点命中率']:.1f}%)")
print("\n【建议】")
total_A = stats[球员A]['抢点射门'] + stats[球员B]['抢点射门']
优势_球员 = 球员A if stats[球员A]['抢点命中率'] > stats[球员B]['抢点命中率'] else 球员B
print(f"3. 建议战术策略:{'加强抢点进攻机会获取' if 优势_球员 == 球员A else '优化抢点射门时机和位置'}")
return 对比表格
# 使用示例
if __name__ == "__main__":
# 创建分析器实例
分析器 = 抢点射门分析器()
# 生成模拟数据
print("正在生成模拟射门数据...")
分析器.生成模拟数据(['A-射门王', 'B-抢点机器'], 场次=25, 平均射门=4)
# 执行对比分析
print("\n开始对比分析...\n")
报告 = 分析器.生成报告('A-射门王', 'B-抢点机器')
print("\n分析完成!")
这个程序提供了全面的抢点射门对比分析功能:
主要功能:
- 数据模拟 - 生成符合真实规律的射门数据
- 统计对比 - 计算总射门、抢点射门、进球率等指标
- 可视化图表 - 4个子图展示不同维度的对比
- 智能报告 - 自动生成文本总结和战术建议
输出特点:
- 饼图对比射门类型构成
- 柱状图对比射门区域分布
- 折线图分析比赛时间段趋势
- 柱状图对比效率指标
您可以根据实际需要调整模拟数据的参数,或者添加真实的比赛数据进行分析,程序会生成完整的HTML图表和文本报告。