在 python 中模拟足球联赛

Simulating a football league in python

我需要一些帮助。我想在 python 中为任意数量的球队模拟一个足球联赛,并在 table 中计算一个赛季的积分。规则很简单:

  1. 联盟中的每支球队都交手两次。所以每队打 2*(Nteams_in_league -1)
  2. 球队有 50% 的获胜机会。
  3. 只有两种可能的结果,赢或输。
  4. 赢一场积3分,输一场积0分。

这是我在 11 个赛季的 8 支球队联赛中寻找的输出示例。它基于我所做的一次尝试,但并不完全正确,因为它没有正确地在赢家和输家之间分配分数。

列 = 季节, 行 = 团队, 观察结果是积分。

1 2 3 4 5 6 7 8 9 10 11
1 57 51 66 54 60 51 57 54 45 72
2 51 51 42 51 66 60 63 60 81 63
3 51 69 51 48 36 48 57 54 48 60
4 54 57 66 54 75 60 60 66 69 42
5 72 57 63 57 60 54 48 66 54 42
6 54 45 54 45 60 57 51 60 66 51
7 51 63 72 63 63 54 60 63 54 66
8 66 57 42 57 51 57 51 75 72 60

这是一种方法。这会独立模拟每个季节。对于每个赛季和每对球队,我们模拟两场比赛的两种结果,假设每支球队有 50% 的获胜机会。

import numpy as np
import pandas as pd
from itertools import combinations

def simulate_naive(n_teams):
  'Simulate a single season'
  scores = np.zeros(n_teams, dtype=int)
  for i, j in combinations(range(n_teams), 2):
      # each pair of teams play twice, each time with 50/50 chance of 
      # either team winning; the winning team gets three points
      scores[i if np.random.rand() < 0.5 else j] += 3
      scores[i if np.random.rand() < 0.5 else j] += 3
      
  return scores

n_teams = 8
n_seasons = 10
df = pd.DataFrame({season: simulate_naive(n_teams) for season in range(n_seasons)})
print(df)
#     0   1   2   3   4   5   6   7   8   9
# 0  15  30  21  12  24  24   9  21  18  33
# 1  21  18  24  24  15  21  12  30  18  21
# 2  21  27  21  18  21  27  27  15  12  24
# 3  27  12   9  36  18  12  30  15  24  21
# 4  24  24  27  24  18  18  33  18  30  15
# 5  18  15  21  15  15  27  15  24  24  15
# 6  18  18  30  21  33  21  24  27  18  21
# 7  24  24  15  18  24  18  18  18  24  18

我想知道是否有更好的统计方法可以避免模拟每场比赛。