Могу ли я сделать цикл / функцию для этого в R? (и как бы я это сделал?) - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время я использую 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.

1 Ответ

1 голос
/ 20 апреля 2020

Кажется, что много кода не используется в том, что вы пытаетесь выполнить sh. Кажется, у вас также есть проблема с несколькими играми, которые не в правильном порядке, что может быть проблематично c.

Ниже я расскажу о том, как выполнить это немного более эффективно - если я правильно понял, что Вы собирались:

library(dplyr)
library(rvest)
library(tidyverse)
library(data.table)
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 <- setnames(as.data.table(tbls_ls)[, 1:2], c("Fixture","Score"))
Results[, Round:=NA_integer_]
Results[grep("Round", Results$Fixture)]$Round <- as.numeric(gsub("\\..*", "", grep("Round", Results$Fixture, value = TRUE)))
setnafill(Results, type="locf", cols="Round")
Results[, c("HomeTeam", "AwayTeam") := tstrsplit(Fixture, " - ", 2)]
Results[, c("FTHG","FTAG") := tstrsplit(Score, ":", 2)]
Results <- Results[, `:=`(Fixture=NULL, Score=NULL)][!is.na(FTAG)]
Results[, c("FTHG", "FTAG"):=lapply(.SD, as.numeric), .SDcols=c("FTHG", "FTAG")]
setorder(Results, -Round)
setcolorder(Results, c(2:5,1))
library("vcd")
source("http://www.maths.leeds.ac.uk/~voss/projects/2010-sports/Football.R")
resultsList0 <- lapply(rev(sapply(2:30, function(x) head(seq_len(x), -1))), function(x) Results[Round %in% x])

getProbs <- function(y){
  FixEdit <- as.data.frame(y[Round==max(Round), c(1:2)])
  TeamParameters <- Parameters(setDF(y[,1:4]))
  run_probs <- function(h_team, a_team) {
    Probabilities <- ProbTable(TeamParameters, h_team, a_team)
    return(ResultProbs(Probabilities))
  }
  res <- Map(run_probs, FixEdit$HomeTeam, FixEdit$AwayTeam)
  data.table(FixEdit, 100/rbindlist(res))
}

out <- setNames(lapply(resultsList0, getProbs), paste0("Up_to_Wk_", rev(2:30)))
# to export to csv:
# lapply(seq_along(out), function(x) fwrite(out[[x]], file=paste0(names(out)[x], ".csv")))

Создано в 2020-04-19 с помощью пакета представительства (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...