在 python 中模拟足球联赛
Simulating a football league in python
我需要一些帮助。我想在 python 中为任意数量的球队模拟一个足球联赛,并在 table 中计算一个赛季的积分。规则很简单:
- 联盟中的每支球队都交手两次。所以每队打 2*(Nteams_in_league -1)
- 球队有 50% 的获胜机会。
- 只有两种可能的结果,赢或输。
- 赢一场积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
我想知道是否有更好的统计方法可以避免模拟每场比赛。
我需要一些帮助。我想在 python 中为任意数量的球队模拟一个足球联赛,并在 table 中计算一个赛季的积分。规则很简单:
- 联盟中的每支球队都交手两次。所以每队打 2*(Nteams_in_league -1)
- 球队有 50% 的获胜机会。
- 只有两种可能的结果,赢或输。
- 赢一场积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
我想知道是否有更好的统计方法可以避免模拟每场比赛。