Vi ser på en aoestats.io som kilde til Age of Empires 2-statistikk.
For ca. to år siden lagde jeg et lite dashboard for Age of Empires 2-spilling gjennom pandemien. Datakildene var imidlertid temmelig spredte, noe som gjorde det tidkrevende å oppdatere dashboardet med nye data. Nå har jeg funnet en ny kilde i aoestats.io, og vil ta en kikk på den for å se om jeg kan bruke den.
Datasettet funker slik at det er laget et API-endepunkt til en tabell som lister opp alle tilgjengelige filer på aoestats.io/api/db_dumps. Datasettene er laget som Parquet-filer som kan lastes direkte.
Først skaffer jeg ei liste over hvilke data-dumper som er tilgjengelige:
req = request("https://aoestats.io/api/db_dumps")
req
resp = req_perform(req)
#hvilket innhold er dette?
resp |>
resp_content_type()
[1] "application/json"
#gikk spørringa i orden?
resp |>
resp_status_desc()
[1] "OK"
#henter ut dataene
data = resp |>
resp_body_json()
Her får jeg ut ei liste med totalt antall matcher som er registert, totalt antall spillere, og p.t. en liste med 87 lister med 8 elementer. Disse pakker jeg ut. Overraskende nok funker dplyr::bind_rows som utpakker.
Rows: 88
Columns: 8
$ start_date <date> 2024-04-28, 2024-04-21, 2024-04-14, 2024-04…
$ end_date <date> 2024-05-04, 2024-04-27, 2024-04-20, 2024-04…
$ num_matches <int> 242093, 240980, 236195, 231065, 243354, 2538…
$ num_players <int> 856808, 839611, 824722, 808570, 854899, 8824…
$ matches_url <chr> "/media/db_dumps/date_range%3D2024-04-28_202…
$ players_url <chr> "/media/db_dumps/date_range%3D2024-04-28_202…
$ match_checksum <chr> "e70006668edacd84dee5b6a71c41a0b4", "0178bb0…
$ player_checksum <chr> "29af052af41098b92a7bb75634e4dd4c", "b4bd1bc…
Her vises ukentlige datadumper fra 28. august 2022 til skrivende stund (7. april 2024).Innholdet i dumpene øker betraktelig i mars/april 2023, så det kan være noe annerledes med dataene fra de første periodene.
Så ser jeg på hvordan filene ser ut. Dette er parquet-filer, som kan leses med arrow::read_parquet()
Det er veldig mye data her, slik at en uthenting av flere data-dumps må slette ting fra minnet mellom hver nedlasting. For å hente alle tilgjengelige data og lagre disse lokalt, lager jeg en for-loop.
#lager en for-looop
# df_players = data.frame()
# df_matches = data.frame()
#
# for(i in 1:nrow(df_dumps)){
# #players
# url_players = paste0("https://aoestats.io", df_dumps[i, 6])
# temp = read_parquet(url_players) |>
# filter(profile_id %in% player_id)
#
# df_players = bind_rows(df_players, temp)
#
# #matches
# url_matches = paste0("https://aoestats.io", df_dumps[i, 5])
#
# temp = read_parquet(url_matches) |>
# filter(game_id %in% df_players$game_id)
#
# df_matches = bind_rows(df_matches, temp)
#
# Sys.sleep(10)
# }
Denne failer litt her og der, og for å unngå å laste ned disse filene hver gang, men heller kunne oppdatere datasettet med nye matcher, lagrer jeg en lokal fil som jeg kan sjekke om trenger oppdateringer.
matches <- read_delim("data/matches.csv", delim = ";", escape_double = FALSE, trim_ws = TRUE,
col_types = cols(started_timestamp = col_datetime(format = "%Y/%m/%d %H:%M:%S"))) |>
arrange(desc(started_timestamp))
players <- read_delim("data/players.csv", delim = ";", escape_double = FALSE, trim_ws = TRUE)
#sjekken kan f.eks. se slik ut:
#last_match_played = date(slice_head(matches, n = 1)$started_timestamp)
#last_match_in_dump = max(df_dumps$end_date)
#if(last_match_played < last_match_in_dump){
# df_dumps_new = filter(end_date > last_match_played)
#legg til uthenting her hvis behov
#}
Her sitter jeg da med to filer, en med spiller-informasjon og en med match-informasjon. Jeg har filtrert vekk alleobservasjoner for spillere som ikke er meg og mine to med-spillere.
Dataene er dokumentert hos aoestats.io.
antall_matcher | antall_vunnet | vinnnprosent |
---|---|---|
114 | 58 | 51 |
profile_id | mean_castle_age_uptime | mean_feudal_age_uptime | mean_imperial_age_uptime | median_castle_age_uptime | median_feudal_age_uptime | median_imperial_age_uptime |
---|---|---|---|---|---|---|
2176509 | 22.8 | 12.0 | 42.6 | 22.2 | 11.2 | 42.6 |
4250835 | 27.2 | 11.9 | 43.1 | 25.7 | 11.3 | 42.8 |
4361967 | 22.3 | 13.0 | 44.4 | 22.9 | 12.2 | 44.6 |