R-script til håndtering af xg-events i #sldk 2024

Author:

Værktøj: Rstudio
Scriptet gør flg.:
– Downloader xg-events fra samtlige kampe i grundspillet i #SLDK i 23/24-sæsonen via https://api.superliga.dk/opta-stats/event/“INDSÆTIDHER”/detail-expected-goals appName=superligadk&access_token=5b6ab6f5eb84c60031bbbd24&env=production&locale=da

– Eksporterer alt data til en tabel.
– Henter listen ”SpillerID”
– Kombinerer listen spillerID med tabellens id-numre og får sat klubnavn på alle spillerne i tabellen.

library(httr)
library(jsonlite)
# Eksempel data
event_ids <- extracted_event_ids$EventID

# Opret mappen hvis den ikke allerede findes
if (!dir.exists("exp_goals")) {
  dir.create("exp_goals")
}

#kør Url igennem og download filerne
access_token <- "5b6ab6f5eb84c60031bbbd24" # Sørg for at din access_token er gyldig
appName <- "superligadk"
env <- "production"
locale <- "da"

for (event_id in event_ids) {
  url <- paste0("https://api.superliga.dk/opta-stats/event/", event_id, 
                "/detail-expected-goals?appName=", appName, 
                "&access_token=", access_token, 
                "&env=", env, 
                "&locale=", locale)
  
  response <- GET(url)
  
  if (status_code(response) == 200) {
    data <- content(response, "text", encoding = "UTF-8")
    file_name <- paste0("exp_goals/exp_goals_", event_id, ".json")
    write(data, file = file_name)
  } else {
    cat("Failed to download data for event_id:", event_id, "\n")
  }
}
Scriptet downloader alle events for 23/24 i #SLDK grundspillet. 

Nu kan man så samkøre denne nye tabel, med basisspillerID-listen, der har SpillerID, TeamID og TeamName som kolonner.

library(jsonlite)
library(dplyr)

# Vælg mappen hvor dine JSON filer er gemt
folder_path <- "exp_goals" # Erstat med den faktiske sti til din mappe

# Find alle JSON filer i mappen
file_paths <- list.files(path = folder_path, pattern = "\\.json$", full.names = TRUE)

# Initialiser en tom DataFrame
final_df <- data.frame()

# Funktion til at indlæse og forberede data fra en enkelt fil
prepare_data <- function(file_path) {
  json_data <- fromJSON(file_path)
  home_data <- as.data.frame(json_data$expectedGoalsData$home)
  away_data <- as.data.frame(json_data$expectedGoalsData$away)
  
  if (!is.null(home_data)) {
    home_data$Team <- 'Home'
  }
  if (!is.null(away_data)) {
    away_data$Team <- 'Away'
  }
  
  combined_df <- rbind(home_data, away_data)
  
  # Konverter alle kolonner til character for at undgå datatypekonflikter
  combined_df[] <- lapply(combined_df, as.character)
  
  return(combined_df)
}

# Loop igennem filerne og saml data
for (file_path in file_paths) {
  combined_df <- prepare_data(file_path)
  final_df <- rbind(final_df, combined_df, fill = TRUE)
}

# Eftersom alle kolonner blev konverteret til character for at undgå konflikter, konverter relevante kolonner tilbage
final_df$min <- as.integer(final_df$min)
final_df$sec <- as.integer(final_df$sec)
final_df$x <- as.numeric(final_df$x)
final_df$y <- as.numeric(final_df$y)
final_df$expectedGoalsValue <- as.numeric(final_df$expectedGoalsValue)

# Vis de første rækker af den endelige DataFrame
head(final_df)

library(dplyr)

# Antag at sldk_spillerid er din anden DataFrame, som ser sådan ud:
# sldk_spillerid <- data.frame(
#   id = c(1016093, 1026781), # eksempel ID'er
#   teamname = c("FC Midtjylland", "AGF") # eksempel team navne
# )

# Konverter 'enetPlayerId' i 'final_df' til integer
final_df$enetPlayerId <- as.integer(final_df$enetPlayerId)

# Eller konverter 'id' i 'sldk_spillerid' til character, hvis det passer bedre til din situation
sldk_spillerid$id <- as.character(sldk_spillerid$id)

# Udfør derefter sammenkøringen
final_df <- left_join(final_df, Sldk_spillerID, by = c("enetPlayerId" = "id"))

# Tjek resultatet
head(final_df)


Hvis man ønsker at visualisere dele af data eller alt data, kan man f.eks. vælge at indplotte samtlige 3200 events via “ggplot2” i R.
Mere om det i indlægget her!