本文目录导读:

我来为你编写几个有趣的Python案例来分析预测角球数量!
基于历史数据的统计分析
import random
import statistics
from collections import Counter
class CornerKickPredictor:
def __init__(self):
# 历史比赛数据模拟
self.match_data = {
'英超': [8, 12, 6, 10, 9, 11, 7, 13, 8, 10, 5, 12, 9, 8, 10],
'西甲': [9, 11, 7, 8, 10, 6, 12, 9, 8, 11, 7, 10, 9, 12, 8],
'欧冠': [10, 8, 12, 9, 7, 11, 13, 8, 9, 10, 6, 12, 8, 9, 11]
}
def basic_statistics(self, league):
"""基础统计分析"""
if league not in self.match_data:
return "不支持的联赛"
data = self.match_data[league]
return {
'平均角球数': round(statistics.mean(data), 2),
'中位数': statistics.median(data),
'标准差': round(statistics.stdev(data), 2),
'最少': min(data),
'最多': max(data),
'常见数量': Counter(data).most_common(3)
}
def probability_distribution(self, league):
"""计算各角球数量的概率"""
if league not in self.match_data:
return {}
data = self.match_data[league]
total = len(data)
distribution = {}
for corners in range(0, 16):
count = data.count(corners)
distribution[corners] = round(count / total, 3)
return distribution
# 使用示例
predictor = CornerKickPredictor()
stats = predictor.basic_statistics('英超')
print("英超角球数据分析:")
for key, value in stats.items():
print(f" {key}: {value}")
蒙特卡洛模拟预测
import random
import matplotlib.pyplot as plt
class MonteCarloCornerPredictor:
def __init__(self, home_strength=50, away_strength=50):
self.home_attack = home_strength
self.away_defense = away_strength
def simulate_single_match(self):
"""模拟单场比赛角球"""
# 基础角球范围
base_corners = random.uniform(8, 12)
# 球队实力影响
home_advantage = random.uniform(0.9, 1.1)
strength_effect = (self.home_attack - self.away_defense) / 100
# 比赛风格影响(进攻型球队角球多)
style_factor = random.choice([0.8, 0.9, 1.0, 1.0, 1.1, 1.2])
# 随机因素
random_factor = random.uniform(0.7, 1.5)
total_corners = base_corners * home_advantage * (1 + strength_effect) * style_factor * random_factor
return round(total_corners, 0)
def monte_carlo_predict(self, simulations=10000):
"""蒙特卡洛模拟多次比赛"""
results = []
for _ in range(simulations):
corners = self.simulate_single_match()
results.append(corners)
return {
'平均预测': round(sum(results) / len(results), 2),
'最可能范围': f"{sorted(results)[len(results)//4]} - {sorted(results)[3*len(results)//4]}",
'超过10个概率': round(sum(1 for r in results if r >= 10) / len(results) * 100, 2)
}
# 使用示例
simulator = MonteCarloCornerPredictor(home_strength=65, away_strength=55)
prediction = simulator.monte_carlo_predict(10000)
print("\n蒙特卡洛模拟预测结果:")
for key, value in prediction.items():
print(f" {key}: {value}")
机器学习简单预测模型
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
class CornerRegressionPredictor:
def __init__(self):
# 特征:控球率%, 射门次数, 射正次数, 威胁进攻次数
self.X = np.array([
[55, 12, 5, 30],
[48, 10, 3, 25],
[60, 15, 7, 40],
[45, 8, 2, 18],
[52, 11, 4, 28],
[63, 14, 6, 35],
[40, 6, 1, 12],
[58, 13, 5, 32],
[50, 9, 3, 22],
[62, 16, 8, 38]
])
# 实际角球数(目标变量)
self.y = np.array([9, 7, 12, 5, 8, 11, 4, 10, 7, 13])
# 训练模型
self.model = LinearRegression()
self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(
self.X, self.y, test_size=0.2, random_state=42
)
self.model.fit(self.X_train, self.y_train)
def predict(self, possession, shots, on_target, dangerous_attacks):
"""预测角球数量"""
features = np.array([[possession, shots, on_target, dangerous_attacks]])
prediction = self.model.predict(features)
return round(prediction[0], 1)
def model_accuracy(self):
"""评估模型精度"""
score = self.model.score(self.X_test, self.y_test)
return score
# 使用示例
predictor_ml = CornerRegressionPredictor()
features = [58, 14, 6, 35] # 控球率58%, 14次射门, 6次射正, 35次威胁进攻
prediction = predictor_ml.predict(*features)
print(f"\n机器学习预测结果:")
print(f" 预测角球数: {prediction}")
基于比赛状态的动态预测
class DynamicCornerPredictor:
def predict_during_match(self, minute, current_corners, game_state):
"""
根据比赛进程动态预测
minute: 比赛分钟(1-90)
current_corners: 当前角球数
game_state: 'neutral', 'home_leading', 'away_leading', 'draw'
"""
# 计算剩余时间中的角球基础概率
remaining_time = 90 - minute
time_factor = remaining_time / 90
# 根据比赛状态调整
state_multipliers = {
'neutral': 1.0,
'home_leading': 0.8, # 领先方可能控球多但角球可能少
'away_leading': 1.2, # 落后方积极进攻
'draw': 1.0
}
# 基础角球速率(每分钟)
base_rate = 0.15
if minute < 15: # 开场阶段角球较少
base_rate *= 0.8
elif minute > 80: # 最后阶段进攻激烈
base_rate *= 1.3
# 预测剩余时间角球数
expected_remaining = (remaining_time * base_rate *
state_multipliers[game_state])
# 动态预测
final_prediction = current_corners + expected_remaining
# 比赛状态下限(至少追加2个角球在领先情况下)
if game_state in ['home_leading', 'away_leading']:
final_prediction = max(final_prediction, current_corners + 2)
return {
'半场预测': round(current_corners + expected_remaining * 0.5, 1),
'全场预测': round(final_prediction, 1),
'置信度': round(min(90, minute + expected_remaining * 10) / 100, 2)
}
# 动态预测示例
dynamic_predictor = DynamicCornerPredictor()
mid_match_prediction = dynamic_predictor.predict_during_match(
minute=60,
current_corners=7,
game_state='draw'
)
print(f"\n比赛进行到60分钟,当前角球数7个:")
print(f" 半场预测: {mid_match_prediction['半场预测']} 个")
print(f" 全场预测: {mid_match_prediction['全场预测']} 个")
使用建议
这些案例展示了几种不同的预测思路:
- 统计方法:基于历史数据,通过平均值、分布来预测
- 模拟方法:蒙特卡洛模拟多次可能情况
- 机器学习:考虑多维度特征
- 动态调整:结合比赛实时状态
实际角球数量一般会在:
- 英超、西甲等主流联赛:平均 9-12个
- 防守为主的比赛:6-8个
- 进攻性强的比赛:12-15个
这些都是基于一般规律,实际比赛中会有很大变数,建议可以参考历史数据,但也要关注两队具体的战术风格和比赛状态!