geografías, sistemas y más

Etiqueta: R

Sale Counter!

ACLARACIÓN 2023  Por un problema de migración se perdieron las imágenes.

Lo importante: link a la app , link al código


Marzo 2020, empieza la pandemía, incertidumbre, confinamiento y Counter Strike…. Resulta que pocos días de dictarse el confinamiento en Argentina, se organizaron unas partidas de Counter Strike Global Offensive. Lo que empezó con un rato de distracción derivo en un nivel de manija importante. Jugamos casi todos los días a las 19hs durante 7 meses seguidos de dos a tres horas sumando miles de mensaje en el grupo de wasap discutiendo las partidas (Estudio Counter se llamó off the record).

El punto es que en algún momento se investigo sobre la posibilidad de obtener estadísticas de cada partida, se armaron tablas para completar manual pero nada de eso prospero.

library(CSGo)

Julio 2021, en una de tantas noches de insonmio veo que existe una API de CSGO para utilizar con R Studio (Gracias Adson Costanzi Filho). A partir de eso, la manija se apoderó de mi y decidí armar una shiny app… un poco para fogonear en el grupo, otro poco para practicar un poco de shiny y no oxidarme.

Por si no les interesa, el código, el link a la app está acá. Sino acá va un poco del esqueleto de la APP…

 

Tres cosas importantes:

  • necesitamos credenciales para usar la api . Si escribimos en r vignette("auth", package = "CSGo")nos aparece el paso a paso para conseguir la credencial de la api
  • necesitamos nuestro user id, o el user id de algún amigo. Para ésto debemos ir a nuestro perfil de steam y desde ahí vamos a ver que la url tiene un formato similar a este: ‘https://steamcommunity.com/profiles/76561198263364899/’ En este caso, el user id son todos esos números que aparecen en la URL

 

  • Por último tenemos que poner la configuración de nuestro perfil en “público” de lo contrario no vamos a obtener ningún dato cuando utilicemos la API. Para eso último debemos ir a Editar Perfil dentro de Steam y dejar configurado el perfil cómo aparece en la imagen

Luego de todo ésto arrancamos en R. La idea de la APP era tener una parte de gráficos comparativos (siempre jugamos los mismos y esto servía para picantear quienes eran los mejores rankeados o los peores) y otra parte con estadísticas individuales utilizando un filtro reactivo con los jugadores.

 

# Instalamos el paquete y lo cargamos
install.packages("CSGo")
library(tidyverse) #para no perder la costumbre
library(CSGo)

 

Con el código get_stats_friends

csgo_stats <- get_stats_friends(api_key = 'tuAPI, user_id = 'tuID')  #el resultado es una lista
df <- as.data.frame(csgo_stats$friends_stats) #lo pasamos a df para trabajar más cómodo
view(df)

Vamos a ver que el data frame que creamos tiene un formato long. En name podemos ver algunos de los indicadores que arroja la API. Realmente es muy variada la info que da y puede llegar a marear. En mi caso, creo que me costo más sintetizar lo que quería mostrar que armar el código. El formato long lo cambie con pivot_wider.

stat <- df %>%  
filter(type=='stat' & category=='stats') %>% select(c(1,2,7)) 
%>% pivot_wider(names_from = name, values_from = value)

Indicadores

Para el dashboard arme dos tabItems: “Estadísticas individuales” y “Comparativo”.

Dentro de estadísticas individuales use:

  • hits_efficiency, hits_to_kill, kills_efficiency (éstos tres fueron copiados textual del blog de Adson ) visualizados con highcharter

UI SIDE

        fluidRow(
        box(
            title = "Efectividad según arma", status = "primary", solidHeader = TRUE,
            collapsible = FALSE,
            width = 12,
            height = 8,
            highchartOutput("plot1", height = 600)
        )
        )
SERVER SIDE
output$plot1 <- 
renderHighchart({
      eficiencia %>% filter(player_name==input$nombresset) %>% 
hchart( "line", hcaes(name_match, valores, group = estadisticas))
      
    })

Si bien el gráfico lo hice crudo, sin personalizar nada en la línea de código podemos ver que hay un filtro por player filter(player_name==input$nombresset) y por otro lado, si van a utilizar gráficos de ésta librería hay que usar la función renderHighchart.

 

Por otro lado, el resto de los indicadores de esa slide los hice con renderInfoBox tambien utilizando el filtro por player filter(player_name == input$nombresset)

  • Matchs jugados (total_matches_played)
  • Headshots (total_kills_headshot)
  • Ganados (total_wins)
  • Defuse (total_defused_bombs)
  • Kills (total_kills)
  • Muertes (total_deaths)
  • MVPs (total_mvps)
  • Kills con faca (total_kills_knife)

Un ejemplo de esto:

UI SIDE

        fluidRow(
            
            infoBoxOutput("kills", width = 3),
            infoBoxOutput("muertes", width = 3),
            infoBoxOutput("mvp", width = 3),
            infoBoxOutput("facas", width = 3)
            
        ),

SERVER SIDE

      #FACAS 
        output$facas <- renderInfoBox({
          a <- df %>%
            filter(player_name == input$nombresset)
          a <- a %>% filter(name=='total_kills_knife')  
          a<- sum(a$value)
        infoBox(
            "Kills con Faca", a, icon = icon("list"),
            color = "purple", fill = TRUE
        )
    })

Para el otro tabItem use:

  • Tiempo jugado
  • Ganados/Jugados
  • Kills/Shots
  • Headshot/Kills
  • Kills/Rounds
  • MVP/Matches
  • Deads por match
  • Puntos contribuidos por match

UI SIDE

              fluidRow(
                box(
                  title = "Deads por match", status = "primary", solidHeader = TRUE,
                  collapsible = TRUE, width = 6,
                  highchartOutput("plot8")
                ),

SERVER SIDE

    #DEADS/MATCHS
    output$plot8 <- renderHighchart({
      stat %>%  mutate(dead=as.integer(total_deaths)/as.integer(total_matches_played)) %>% arrange(dead) %>% 
              hchart("column", hcaes(x = player_name, y = round(dead,2)))%>% 
        hc_xAxis(title = NULL) %>% hc_yAxis(title= NA)
          })

Acá el código completo aquí

Links útiles:

 

 

FOSS4G 2021 + Ruteo en R

Que es la FOSS4G?

La FOSS4G es el evento de software open source y software libre geoespacial más grande del mundo. Es un encuentro organizado por la fundación OSGEO (Open Source Geospatial Foundation) y las comunidades locales de cada parte del planeta en la que participan desde programadores, investigadores, estudiantes, organismos no gubernamentales, empresas, docentes, etc. Dentro de la conferencia hay talleres, charlas, mapatones, stands y lo más importante el encuentro con personas.

Ésta vez fue la primera vez que participé y si bien no tenía mucha expectativa dado el formato virtual el nivel de la conferencia es INCREIBLE en cuanto a la calidad de las ponencias, talleres y también de la organización (desde la plataforma hasta la comunicación). En este sentido, hay que remarcar el trabajo que hicieron los Geoinquietos Argentina y la Asociación GeoLibres para poder llevar a cabo menuda conferencia poniendole el cuerpo a situaciones realmente dificiles y dolorosas.

De las cosas que más rescato de mi experiencia en la FOSS es la posibilidad de escuchar en primera persona las experiencias y trabajos de gente que uno admira. En mi caso, participe de un taller de Vector Tiles llevado a cabo por Map Tiler. Además de escuchar a los “viejos conocidos” el encuentro da la posibilidad de escuchar otras voces que son parte de la comunidad pero no son tan conocidas o activas en las redes y llevan a cabo un trabajo espectacular.

Otra de las cosas que más me gusto del encuentro – y pese a que el formato fue virtual – fue la posibilidad de poder hablar con gente. La plataforma tenía una interfaz en donde cada participante podía ser un personaje y a través de diferentes representaciones de la Ciudad uno se podía cruzar con gente y generar una video llamada. Ésto hizo que uno pueda seguir intercambiando data o conociendo gente más allá de las charlas o talleres.

 

Mi primer FOSS

Cómo suele pasar en la mayoría de los eventos en los que participo, primero me anoto y a partir de eso me obligo a presentar algún trabajo. En esta ocasión la charla que dí se basó en un indicador que construimos para el Ministerio de Cultura sobre accesibilidad física a espacios y actividades culturales en la Ciudad de Buenos Aires.

El trabajo se basa en calcular para cada una de las esquinas de la Ciudad la distancia peatonal a una serie de espacios culturales (Cines, Teatros, Clubes de Música, Bibliotecas, Museos, Espacios de Formación). Ésto implico, por un lado utilizar alguna herramienta de ruteo – en este caso fue OSRM – y poder programar un script que lupee las esquinas y además que disminuya el tiempo de procesamiento lo máximo posible.

Más allá del contexto del trabajo, éste fue una buena oportunidad para poner en práctica algunas cosas que vengo haciendo en R. Empece a estudiar éste lenguaje en diciembre 2019 y en estos dos años me obligue a usarlo literalmente casi todos los días ya sea para manejo de tablas, escrapeo, data wrangling, geoprocesos, desarrollo de dashboards etc.

Otro dato no menor es que la charla la hice 100% en ingles. Si bien estaba la posibilidad de hablar en castellano, la mayoría del público hablaba ingles (y las relaciones sur-sur no se van hacer solas) y eso también implicó un lindo desafio.

 

 

Para terminar el posteo, ojala que la FOSS4G2021 sea la primera de muchas otras (la próxima se hace en Florencia, Italia) . Y a modo personal, queda pendiente empezar a ver algunos videos de lo que fueron las presentaciones. Realmente hay material de estudio muy interesante para indagar.

Descarga de diapositivas

Descarga del código