总结在 R 或 Python 中赢得最后 N 场比赛的 X 场的所有方式
Sum all ways to win X of last N games in R or Python
我一直在 Excel 中手动执行此操作,但想要一种缩放它的方法,我认为 R 或 Python 是我最好的选择。也就是说,我不知道从哪里开始。这是 Excel 中 table 的示例:
PROB_WIN 和 PROB_LOSE 是球队在该场比赛中获胜或失败的概率。 T_WINZERO 列是球队在前三场比赛中获胜的概率 none,T_WINONE 是他们在前三场比赛中获胜的概率,依此类推。例如,[中的第五行=26=] 就是 .493 * .466 * .484(等于 .111)。可以想象,一旦他们变成了几乎无数的获胜方式,例如,一支球队在过去 15 场比赛中有 7 场获胜(准确地说是 6,435 种方式),那么这将是多么困难。
我想做的是能够使用这些新概率为球队的最后 N 场比赛自动创建列(例如,最后 3 场中的 0 场、最后 3 场中的 1 场、最后 3 场中的 2 场、最后 3 场中的 3 场3 如上所示,但对于任意数量的游戏)使用列 PROB_WIN 和 PROB_LOSE 来这样做。
在 Excel 中,我将最近 N 场比赛中 X 场获胜的所有方式的所有概率相加,然后将公式向下拖动,以便我在 R 或 Python.
在此先感谢您的帮助!
这是一种方法。
我没有转录你的图片,而是创建了一组相似但可重现的获胜概率(请注意,我们不需要一列失败概率,因为这些只是获胜概率的补充)
set.seed(2)
df <- data.frame(GAME = 1:10, PROB_WIN = runif(10, 0.45, 0.55))
df
#> GAME PROB_WIN
#> 1 1 0.4684882
#> 2 2 0.5202374
#> 3 3 0.5073326
#> 4 4 0.4668052
#> 5 5 0.5443839
#> 6 6 0.5443475
#> 7 7 0.4629159
#> 8 8 0.5333449
#> 9 9 0.4968019
#> 10 10 0.5049984
我们可以编写一个函数,它采用获胜概率向量和 returns n 获胜的概率,同时考虑所有可能的游戏顺序,如下所示:
won_n_games <- function(probs, n_wins) {
wins <- asplit(combn(length(probs), n_wins), 2)
losses <- lapply(wins, function(x) setdiff(seq_along(probs), x))
sum(unlist(Map(function(wins, losses) {
prod(probs[wins]) * prod(1 - probs[losses])
},
wins = wins, losses = losses)))
}
我们可以在另一个函数中使用它,该函数将创建一列赢得最后 n
场比赛的给定数量的概率,如下所示:
make_column <- function(probs, n, wins) {
result <- rep(NA_real_, length(probs))
for(i in (n + 1):length(probs)) {
result[i] <- won_n_games(probs[(i - n):(i - 1)], wins)
}
result
}
因此,要在您的数据框中创建列,我们可以这样做:
df$WIN_0_3 <- make_column(df$PROB_WIN, n = 3, wins = 0)
df$WIN_1_3 <- make_column(df$PROB_WIN, n = 3, wins = 1)
df$WIN_2_3 <- make_column(df$PROB_WIN, n = 3, wins = 2)
df$WIN_3_3 <- make_column(df$PROB_WIN, n = 3, wins = 3)
导致
df
#> GAME PROB_WIN WIN_0_3 WIN_1_3 WIN_2_3 WIN_3_3
#> 1 1 0.4684882 NA NA NA NA
#> 2 2 0.5202374 NA NA NA NA
#> 3 3 0.5073326 NA NA NA NA
#> 4 4 0.4668052 0.1256299 0.3763316 0.3743888 0.1236497
#> 5 5 0.5443839 0.1260277 0.3767748 0.3739920 0.1232055
#> 6 6 0.5443475 0.1196847 0.3710328 0.3803585 0.1289240
#> 7 7 0.4629159 0.1106926 0.3614084 0.3895687 0.1383303
#> 8 8 0.5333449 0.1115001 0.3625303 0.3887919 0.1371777
#> 9 9 0.4968019 0.1142016 0.3653846 0.3860178 0.1343960
#> 10 10 0.5049984 0.1261181 0.3773585 0.3738661 0.1226573
由 reprex package (v2.0.1)
于 2022-03-19 创建
我一直在 Excel 中手动执行此操作,但想要一种缩放它的方法,我认为 R 或 Python 是我最好的选择。也就是说,我不知道从哪里开始。这是 Excel 中 table 的示例:
PROB_WIN 和 PROB_LOSE 是球队在该场比赛中获胜或失败的概率。 T_WINZERO 列是球队在前三场比赛中获胜的概率 none,T_WINONE 是他们在前三场比赛中获胜的概率,依此类推。例如,[中的第五行=26=] 就是 .493 * .466 * .484(等于 .111)。可以想象,一旦他们变成了几乎无数的获胜方式,例如,一支球队在过去 15 场比赛中有 7 场获胜(准确地说是 6,435 种方式),那么这将是多么困难。
我想做的是能够使用这些新概率为球队的最后 N 场比赛自动创建列(例如,最后 3 场中的 0 场、最后 3 场中的 1 场、最后 3 场中的 2 场、最后 3 场中的 3 场3 如上所示,但对于任意数量的游戏)使用列 PROB_WIN 和 PROB_LOSE 来这样做。
在 Excel 中,我将最近 N 场比赛中 X 场获胜的所有方式的所有概率相加,然后将公式向下拖动,以便我在 R 或 Python.
在此先感谢您的帮助!
这是一种方法。
我没有转录你的图片,而是创建了一组相似但可重现的获胜概率(请注意,我们不需要一列失败概率,因为这些只是获胜概率的补充)
set.seed(2)
df <- data.frame(GAME = 1:10, PROB_WIN = runif(10, 0.45, 0.55))
df
#> GAME PROB_WIN
#> 1 1 0.4684882
#> 2 2 0.5202374
#> 3 3 0.5073326
#> 4 4 0.4668052
#> 5 5 0.5443839
#> 6 6 0.5443475
#> 7 7 0.4629159
#> 8 8 0.5333449
#> 9 9 0.4968019
#> 10 10 0.5049984
我们可以编写一个函数,它采用获胜概率向量和 returns n 获胜的概率,同时考虑所有可能的游戏顺序,如下所示:
won_n_games <- function(probs, n_wins) {
wins <- asplit(combn(length(probs), n_wins), 2)
losses <- lapply(wins, function(x) setdiff(seq_along(probs), x))
sum(unlist(Map(function(wins, losses) {
prod(probs[wins]) * prod(1 - probs[losses])
},
wins = wins, losses = losses)))
}
我们可以在另一个函数中使用它,该函数将创建一列赢得最后 n
场比赛的给定数量的概率,如下所示:
make_column <- function(probs, n, wins) {
result <- rep(NA_real_, length(probs))
for(i in (n + 1):length(probs)) {
result[i] <- won_n_games(probs[(i - n):(i - 1)], wins)
}
result
}
因此,要在您的数据框中创建列,我们可以这样做:
df$WIN_0_3 <- make_column(df$PROB_WIN, n = 3, wins = 0)
df$WIN_1_3 <- make_column(df$PROB_WIN, n = 3, wins = 1)
df$WIN_2_3 <- make_column(df$PROB_WIN, n = 3, wins = 2)
df$WIN_3_3 <- make_column(df$PROB_WIN, n = 3, wins = 3)
导致
df
#> GAME PROB_WIN WIN_0_3 WIN_1_3 WIN_2_3 WIN_3_3
#> 1 1 0.4684882 NA NA NA NA
#> 2 2 0.5202374 NA NA NA NA
#> 3 3 0.5073326 NA NA NA NA
#> 4 4 0.4668052 0.1256299 0.3763316 0.3743888 0.1236497
#> 5 5 0.5443839 0.1260277 0.3767748 0.3739920 0.1232055
#> 6 6 0.5443475 0.1196847 0.3710328 0.3803585 0.1289240
#> 7 7 0.4629159 0.1106926 0.3614084 0.3895687 0.1383303
#> 8 8 0.5333449 0.1115001 0.3625303 0.3887919 0.1371777
#> 9 9 0.4968019 0.1142016 0.3653846 0.3860178 0.1343960
#> 10 10 0.5049984 0.1261181 0.3773585 0.3738661 0.1226573
由 reprex package (v2.0.1)
于 2022-03-19 创建