Age of Empires 2 - en ny kikk på statistikken

Vi ser på en aoestats.io som kilde til Age of Empires 2-statistikk.


Author

Affiliation

Eivind Hageberg

 

Published

April 19, 2024

DOI


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.

Aoestats.io som datakilde

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()

Hvordan ser dataene ut?

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.

Litt om våre matcher

Hvor mange matcher har vi spilt, og har vi vunnet?

antall_matcher antall_vunnet vinnnprosent
114 58 51

Når har vi spilt?

Hvilke baner har vi spilt - og hvor vinner vi?

Hvilke sivilisasjoner liker vi å spille?

Hvilke sivilisasjoner har vi ikke spilt?

Hvor lenge varer spillene?

Når går vi opp i age?

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

Blir vi bedre over tid?