В настоящее время я использую R для тестирования некоторых коэффициентов футбола / футбола, используя модель для создания своих собственных коэффициентов.
В настоящий момент это довольно длительный процесс, и мне любопытно, что цикл / функция, которую я могу сделать, чтобы ускорить процесс.
Этот фрагмент кода собирает результаты за весь сезон.
library(dplyr)
library(rvest)
library(tidyverse)
options(max.print = 9999)
Res <- read_html("https://www.betexplorer.com/soccer/england/premier-league/results/?month=all")
tbls_ls <- Res %>%
html_nodes("table") %>%
.[1] %>%
html_table(fill = TRUE)
Results <- as.data.frame(tbls_ls)
Results <- Results[,c(1:2)]
names(Results) <- c("Fixture","Score")
Results <- tidyr::separate(Results, Fixture, into =c("HomeTeam","AwayTeam"), sep = " - ")
Results <- tidyr::separate(Results, Score, into = c("FTHG","FTAG"), sep = ":")
Results <- Results %>% tidyr::drop_na()
Results <- Results[,c(1:4)]
write.csv(Results, file = "Results.csv")
rownames(Results) <- 1:nrow(Results)
Я тестирую коэффициенты по игровой неделе, и для Лиги, которую я тестирую, в неделю на игру приходится 10 игр. Этот код удаляет предыдущую игровую неделю и настраивает эти недели так, как если бы они еще не были сыграны. Это удаляет игровую неделю 29 (последнюю в этой лиге)
ResultsEdit <- Results #[-(1:10),]
FixEdit <- ResultsEdit[,c(1:2)]
ResultsEditE <- Results [-(1:10),]
ResultsEditE %>% tidyr::drop_na()
write.csv(Results, file="ResultsEditE")
Если бы я хотел удалить игровую неделю 29 и 28 и использовать игровую неделю 28 в качестве приспособлений, которые еще предстоит сыграть, я бы изменил код на
ResultsEdit <- Results [-(1:10),]
ResultsEditE <- Results [-(1:20),]
Так далее и так далее, как я go возвращаюсь.
Это код Пуассона для прогнозирования шансов
library("vcd")
source("http://www.maths.leeds.ac.uk/~voss/projects/2010-sports/Football.R")
results0 <- read.csv("ResultsEditE",stringsAsFactors = F)
results0$X <- NULL
countres <- results0$FTHG + results0$FTAG
tg <- countres
fretabtg<-table(tg)
gf <- goodfit(fretabtg, type="poisson", method="ML")
Table0 <- Table(results0)
games <- results0
g <- nrow(games)
Y <- matrix(0,2*g,1)
for (i in 1:g) {
Y[((2*i)-1)] <- games[i,3]
Y[(2*i)] <- games[i,4]
}
teams <- sort(unique(c(games[,1], games[,2])), decreasing = FALSE)
n <- length(teams)
X <- matrix(0,2*g,((2*n)+1))
for (i in 1:g) {
M <- which(teams == games[i,1])
N <- which(teams == games[i,2])
X[((2*i)-1),M] <- 1
X[((2*i)-1),N+n] <- -1
X[(2*i),N] <- 1
X[(2*i),M+n] <- -1
X[((2*i)-1),((2*n)+1)] <- 1
}
x <- qr(X)
x$rank
XX <- X[,-1]
TeamParameters <- Parameters(results0)
SimSeason <- Games(TeamParameters)
SimSeason <- SimSeason %>% tidyr::drop_na()
SimTable <- Table(SimSeason)
Simulations <- Sim(TeamParameters,3)
Probabilities <- ProbTable(TeamParameters,"", "")
ResultProbabilities<- ResultProbs(Probabilities)
cat("\nHome Win True Odds:", 100/ResultProbabilities$HomeWin)
cat("\nDraw True Odds:", 100/ResultProbabilities$Draw)
cat("\nAway Win True Odds:", 100/ResultProbabilities$AwayWin)
И этот код дает мне шансы на ту игровую неделю, которую я хочу.
run_probs <- function(h_team, a_team) {
Probabilities <- ProbTable(TeamParameters, h_team, a_team)
ResultProbabilities <- ResultProbs(Probabilities)
cat(paste("\n", h_team, "VS", a_team))
cat("\nHome Win:", 100/ResultProbabilities$HomeWin)
cat("\nDraw:", 100/ResultProbabilities$Draw)
cat("\nAway Win:", 100/ResultProbabilities$AwayWin)
return(ResultProbabilities)
}
FixEdit <- head(FixEdit, n=10)
prob_list <- Map(run_probs, FixEdit$HomeTeam,FixEdit$AwayTeam)
Что я отчаянно пытаюсь сделать, так это сократить количество времени, которое уходит у меня на прохождение сезона. Используя код, который я привел в качестве примера, возможно ли для этого сделать что-то вроде l oop?
Run the game week 29 removal code, run the poisson code, run the code for giving me the odds for the game week - save the results in a CSV
Run the game week 28 removal code, run the poisson code, run the code for giving me the odds for the game week - save the results in a CSV
et c et c.
Надеюсь возвращать что-то подобное на каждой игровой неделе.
Home Away Home Win Draw Away Win
1 Leicester Aston Villa 1.209044 9.009009 16.18123
2 Chelsea Everton 1.634788 5.09165 5.216484
3 Manchester Utd Manchester City 3.125 4.199916 2.265006
4 Arsenal West Ham 1.786352 4.52284 4.56621
5 Burnley Tottenham 3.08642 3.904725 2.379819
6 Crystal Palace Watford 2.309469 3.079766 4.128819
7 Liverpool Bournemouth 1.160362 10.04016 25.97403
8 Sheffield Utd Norwich 1.637465 3.868472 7.639419
9 Southampton Newcastle 2.198769 3.687316 3.654971
10 Wolves Brighton 1.785714 4.016064 5.230126
Извините за длинный пост и извините, если я не имел никакого смысла. Не стесняйтесь блокировать / удалять сообщения, если они кажутся просто gibberi sh.