本文目录导读:

要查看“让球胜平负”(通常指亚洲盘口或让球盘)的分布,核心是统计在特定让球数下,主队胜、平、负三种结果的出现频率,Python 可以通过 pandas 处理历史比赛数据,用 matplotlib 或 plotly 进行可视化。
以下是一个完整的 Python 案例,分为数据准备、计算分布、可视化三个步骤。
准备示例数据
假设你有一个 CSV 文件 matches.csv,包含以下列:
home_team: 主队away_team: 客队home_score: 主队实际进球away_score: 客队实际进球handicap: 让球数(正数表示主队让球,如5、1;负数表示主队受让,如-0.5)
示例数据(手动构造):
import pandas as pd
data = {
'home_team': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
'away_team': ['K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'],
'home_score': [2, 1, 0, 3, 1, 2, 0, 1, 2, 0],
'away_score': [1, 1, 0, 0, 2, 0, 2, 1, 1, 3],
'handicap': [0.5, -0.5, 0, 1, -1, 0.5, 0, -0.5, 1, -1]
}
df = pd.DataFrame(data)
print(df)
计算让球后的结果(让球胜平负)
核心逻辑:让球后主队净胜球 = 主队实际进球 - 客队实际进球 + 让球数(因为让球数是从主队角度出发的)。
- 如果让球后净胜球 > 0:主胜
- = 0:平局
- < 0:客胜
# 计算让球后的净胜球(让球数直接加在进球差上,因为让球是主队让给客队的优势)
df['handicap_diff'] = (df['home_score'] - df['away_score']) + df['handicap']
# 定义结果分类函数
def classify_handicap_result(x):
if x > 0:
return 'H' # Home Win
elif x == 0:
return 'D' # Draw
else:
return 'A' # Away Win
df['handicap_result'] = df['handicap_diff'].apply(classify_handicap_result)
print(df[['home_team', 'away_team', 'handicap', 'handicap_result']])
按让球数分组统计分布
假设你想看让球数为 0.5 时的胜平负分布,或者整体分布。
# 统计每种让球数下,H/D/A 的数量
distribution = df.groupby(['handicap', 'handicap_result']).size().unstack(fill_value=0)
print("分布表(行:让球数,列:结果):")
print(distribution)
可视化分布(堆叠柱状图)
使用 matplotlib 或 plotly 更直观地展示。
import matplotlib.pyplot as plt
import numpy as np
# 准备绘图数据
handicaps = sorted(distribution.index)
results = ['H', 'D', 'A']
colors = ['green', 'gray', 'red']
# 计算比例(或者数量)
data_plot = []
for h in handicaps:
row = distribution.loc[h]
total = row.sum()
# 计算百分比
percentages = [row.get(r, 0) / total * 100 for r in results]
data_plot.append(percentages)
# 转换为 numpy 数组方便堆叠
data_plot = np.array(data_plot)
# 画堆叠柱状图
fig, ax = plt.subplots(figsize=(10, 6))
bottom = np.zeros(len(handicaps))
for i, result in enumerate(results):
ax.bar(handicaps, data_plot[:, i], bottom=bottom, label=result, color=colors[i])
bottom += data_plot[:, i]
ax.set_xlabel('Handicap (让球数)')
ax.set_ylabel('Percentage (%)')
ax.set_title('让球胜平负分布 (Handicap Result Distribution)')
ax.legend(title='Result')
ax.set_xticks(handicaps)
plt.tight_layout()
plt.show()
扩展:动态过滤(按联赛/时间范围)
如果你有更多列(如 league, date),可以增加过滤:
# 只分析英超 2023年数据 df_filtered = df[(df['league'] == 'EPL') & (df['date'] >= '2023-01-01')] # 然后重复上面的分组统计代码
- 让球数方向:
handicap为正表示主队让球(需获胜更多才算赢);为负表示主队受让(不败即可)。 - 结果计算:
实际净胜球 + 让球数(注意:如果数据中让球数是客队让球,需做符号反转)。 - 可视化技巧:堆叠柱状图最适合展示各类让球下的比例分布。
如果你实际数据中让球数是“客队让球”的表示方式(-0.5 表示主队让 0.5 球,但大多数数据用正数表示主队让球),请根据数据提供方调整符号。Brasil、Soccerway 等数据源使用主队让球为正。