本文目录导读:

我来帮你写一个计算主队胜率的Python案例,这里提供一个完整的示例,包括模拟数据和真实数据分析的方法。
案例1:基于历史数据的胜率计算
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# ============ 方式一:手动构造模拟数据 ============
np.random.seed(42)
# 模拟1000场比赛结果 (1=主胜, 0=平局, -1=客胜)
# 真实足球中主胜概率通常约45%,平局约25%,客胜约30%
results = np.random.choice([1, 0, -1], size=1000, p=[0.45, 0.25, 0.30])
df = pd.DataFrame({'result': results})
# 计算胜率
home_win_rate = (df['result'] == 1).mean()
draw_rate = (df['result'] == 0).mean()
away_win_rate = (df['result'] == -1).mean()
print("=" * 40)
print(f"总场次: {len(df)}")
print(f"主队胜率: {home_win_rate:.2%}")
print(f"平局率: {draw_rate:.2%}")
print(f"客队胜率: {away_win_rate:.2%}")
print("=" * 40)
# 可视化
labels = ['主胜', '平局', '客胜']
sizes = [home_win_rate, draw_rate, away_win_rate]
colors = ['#ff6b6b', '#ffd93d', '#6bcB77']
plt.figure(figsize=(8, 5))
plt.bar(labels, [s*100 for s in sizes], color=colors, edgecolor='black')
for i, v in enumerate(sizes):
plt.text(i, v*100 + 1, f'{v:.1%}', ha='center', fontsize=12, fontweight='bold')
plt.ylabel('百分比 (%)')'主队/平局/客队 胜率分布')
plt.ylim(0, 60)
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
案例2:读取真实CSV数据计算
假设你有 matches.csv 包含 home_team、away_team、home_goals、away_goals 列:
import pandas as pd
# 读取数据
df = pd.read_csv('matches.csv')
# 判断比赛结果
def get_result(row):
if row['home_goals'] > row['away_goals']:
return '主胜'
elif row['home_goals'] == row['away_goals']:
return '平局'
else:
return '客胜'
df['result'] = df.apply(get_result, axis=1)
# 总体胜率
total = len(df)
stats = df['result'].value_counts(normalize=True)
print(f"总场次: {total}")
print(f"主胜率: {stats.get('主胜', 0):.2%}")
print(f"平局率: {stats.get('平局', 0):.2%}")
print(f"客胜率: {stats.get('客胜', 0):.2%}")
# 分主队统计(找出主场优势最强的球队)
home_stats = df.groupby('home_team')['result'].apply(
lambda x: (x == '主胜').mean()
).sort_values(ascending=False)
print("\n各队主场胜率Top5:")
print(home_stats.head(5).apply(lambda x: f"{x:.2%}"))
案例3:按联赛/赛季分组分析
# 假设 df 有 'league' 和 'season' 列
analysis = df.groupby(['league', 'season']).apply(
lambda g: pd.Series({
'场次': len(g),
'主胜率': (g['result'] == '主胜').mean(),
'平局率': (g['result'] == '平局').mean(),
'客胜率': (g['result'] == '客胜').mean(),
})
).round(3)
print(analysis)
📊 实际参考数据(主流足球联赛经验值)
| 联赛 | 主胜率 | 平局率 | 客胜率 |
|---|---|---|---|
| 英超 | ~45% | ~24% | ~31% |
| 西甲 | ~46% | ~24% | ~30% |
| 德甲 | ~44% | ~25% | ~31% |
| 意甲 | ~44% | ~27% | ~29% |
| 中超 | ~42% | ~26% | ~32% |
| NBA(含加时) | ~55% | ~45% |
主队胜率一般在 42%~48% 之间,篮球(NBA)因无平局,主胜率约 55%~60%。
主场优势的来源:
- 球迷支持(心理加成)
- 熟悉场地
- 免去旅途疲劳
- 裁判误判倾向(研究表明主队获点球概率略高)
如果你想用具体联赛/赛季的真实数据分析,可以把数据源告诉我(如 football-data.co.uk 的CSV格式),我可以帮你写针对性的读取和分析代码。