class: center, middle, inverse, title-slide .title[ # Creando tablas en {gt} con Spotify API & Bad Bunny ] .subtitle[ ## ︿
R-Ladies Buenos Aires ] .author[ ### Andrea Gómez Vargas & Karina Bartolomé ] .date[ ### 2022-11-23 ] --- class: center, middle, big-font # RLadies
<style type="text/css"> /* Table width = 100% max-width */ .remark-slide table{ width: 100%; } /* background-color blanco siempre */ .remark-slide thead, .remark-slide tr:nth-child(2n) { background-color: white; } /* Incremento en transparencia del color de highlight del código ya que lo uso mucho y así se lee mejor */ .remark-code-line-highlighted { background-color: rgba(136, 57, 138, 0.1); } /* Big font size */ .big-font h1 { font-size: 100pt; } /* Tamaño letra contenido */ .remark-slide-content { font-size: 20pt; } h1, h2, h3 { font-weight: normal; color: #562457; } </style> --- ## RLadies Global .pull-left[ <img src="https://rladies.org/wp-content/uploads/2016/12/R-LadiesGlobal.png" width="50%" style="display: block; margin: auto;" /> - 216 capítulos - 61 países - 100267 miembrxs ] .pull-right[ <img src="images/rladiesglobal.png" width="100%" style="display: block; margin: auto;" /> ] --- class: left ## RLadies Buenos Aires .pull-left[ <img src="https://rladiesba.netlify.app/author/rladies-buenos-aires/avatar_huae50964fd4ece6c135015c99a5e9a56e_144270_270x270_fill_lanczos_center_2.png" width="70%" style="display: block; margin: auto;" /> [
Globe
rladiesba.netlify.app](https://rladiesba.netlify.app/) [
Meetup
meetup.com](https://www.meetup.com/es/rladies-buenos-aires/) [
GitHub
GitHub](https://github.com/RLadies-BA) [
Twitter
@RLadiesBA](https://twitter.com/RLadiesBA) [
Instagram
RLadiesBA](https://www.instagram.com/rladiesba/) ] .pull-right[ ### Sponsors: <img src="https://guide.rladies.org/images/horizontal-logo.png" width="60%" style="display: block; margin: auto auto auto 0;" /> <img src="https://www.r-consortium.org/wp-content/uploads/sites/13/2016/09/RConsortium_Horizontal_Pantone.png" width="60%" style="display: block; margin: auto auto auto 0;" /> ] --- ## RLadies Buenos Aires - organizadoras <img src="images/rladiesba.png" width="90%" style="display: block; margin: auto;" /> --- class: center, middle, big-font <img src="images/meetup.png" width="100%" style="display: block; margin: auto;" /> --- class: left, middle # ¿Quiénes somos? .pull-left[ <br> <img src="images/imagen1.png" width="40%" style="display: block; margin: auto;" /> ] .pull-right[ ### Andrea Gómez Vargas - Socióloga - Data Analyst en INDEC - Fan de Bad Bunny ### Karina Bartolomé - Economista - Data Scientist en Ualá - Fan de {gt} ] --- class: center, middle, inverse # Antes de arrancar <img src="https://thepcosbible-com.exactdn.com/wp-content/uploads/2020/06/giphy-7.gif?strip=all&lossy=1&quality=80&resize=514%2C288&ssl=1" width="50%" style="display: block; margin: auto;" /> --- class: left, middle ## Qué se necesita para este taller? -- 🔸 Ganas de hacer tablas -- 🔸 Una cuenta en <a><i class="fa fa-spotify fa-fw"></i> Spotify</a> -- 🔸 <a><i class="fa fa-registered fa-fw"></i></a> y RStudio instalados, con los siguientes paquetes: ```r library(tidyverse) # Manipulación de datos library(gt) # Tablas gt: grammar of tables library(gtExtras) # Extras de tablas gt library(spotifyr) # API de spotify library(rjson) # Leer jsons de credenciales library(ggrepel) # Textos en ggplot ``` --- background-position: 50% 50% class: center, inverse, middle, big-font # Ahora sí 🚀 --- class: left, middle ## ¿Qué vamos a ver hoy? -- 🔸 Cómo extraer datos de la **API de Spotify** 🔸 Introducción a **The Grammar of Tables {gt}** 📦 🔸 Creación de **tablas en {gt} 📦 con datos de Spotify** --- class: center, middle, inverse, big-font # <a><i class="fa fa-spotify"></i> API de Spotify</a> --- ## ¿Qué es una API? -- Las API son mecanismos que `permiten a dos componentes de software comunicarse entre sí` mediante un conjunto de definiciones y protocolos. -- .pull-left[ <img src="images/apis_meme.png" width="70%" style="display: block; margin: auto;" /> ] .pull-right[ <a href="https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api"><i class="fa fa-twitter fa-fw"></i> API de Twitter</a><br> <a href="https://www.argentina.gob.ar/onti/software-publico/catalogo/apis"><i class="fa fa-globe"></i> APIs Argentina</a><br> Etc. ] --- ## <a href="https://developer.spotify.com/documentation/web-api/"><i class="fa fa-spotify"></i> API de Spotify</a><br> -- Datos que se pueden obtener a partir de esta API: -- 🔸 Datos sobre artistas -- 🔸 Datos sobre álbumes -- 🔸 Datos sobre el usuario -- 🔸 Y más 😎 -- Para más información, visitar la <a href="https://developer.spotify.com/documentation/web-api/reference/#/">**documentación de la API de Spotify**</a><br> --- ## <a><i class="fa fa-spotify"></i> Credenciales de Spotify</a><br> Para obtener credenciales que permitan consultar datos desde la API es necesario ingresar a <a href="https://developer.spotify.com/">**Spotify for developers**</a>. Compartimos un <a href="https://docs.google.com/document/d/1GpOBol3E-1hg6AIQyD2ZN5GYlrHkIRl-gGooGEdBm0A/edit">**documento con los pasos detallados para generar tus credenciales**</a>. -- ⚠️ Recordá que tus credenciales son personales, no las compartas. ⚠️ -- ### Autenticación Se utiliza la función **get_spotify_access_token()** de {spotifyr} 📦 para autenticarse con las credenciales: ```r access_token <- get_spotify_access_token() ``` --- ## <a><i class="fa fa-spotify"></i> Consulta simple a la API</a><br> Consulta de los N artistas que más escuchaste en el corto plazo: ```r N = 1 df_artistas <- get_my_top_artists_or_tracks( type = 'artists', time_range = 'short_term', limit = N ) %>% select(name, followers.total, genres) ``` ```r df_artistas %>% head() ``` ``` name followers.total 1 Las Ligas Menores 77946 genres 1 argentine alternative rock, argentine indie, latin rock ``` --- class: center, big-font, inverse # Introducción a {gt} <img src="images/gt_meme.jpg" width="35%" style="display: block; margin: auto;" /> --- <br> The grammar of tables (gt) se basa en la siguiente estructura: <div class="figure" style="text-align: center"> <img src="https://karbartolome-blog.netlify.app/posts/tablas-subte/images/gt_workflow_diagram.svg" alt="Estructura de tablas gt, fuente: https://gt.rstudio.com" /> <p class="caption">Estructura de tablas gt, fuente: https://gt.rstudio.com</p> </div> --- En donde las tablas tienen un formato específico, generado mediante capas: <div class="figure" style="text-align: center"> <img src="https://karbartolome-blog.netlify.app/posts/tablas-subte/images/gt_parts_of_a_table.svg" alt="Estructura de tablas gt, fuente: https://gt.rstudio.com" /> <p class="caption">Estructura de tablas gt, fuente: https://gt.rstudio.com</p> </div> --- class: center, inverse, middle, big-font # Bad Bunny <img src="https://64.media.tumblr.com/1623e4fc39e004a212029bb36513b310/b693e0e3d8bdd649-95/s540x810/3461e29ed079728927adec76cfb37f3463cc56f5.gifv" width="50%" style="display: block; margin: auto;" /> --- Vamos a realizar una búsqueda de datos de **Bad Bunny** 🐰: ```r ARTISTA = 'bad bunny' ``` Para este artista, se genera una búsqueda de variables mediante la función **get_artist_audio_features()**: ```r vars_audio = c( 'danceability', 'energy', 'loudness', 'acousticness', 'instrumentalness' ) ``` ```r df_artist_features <- get_artist_audio_features(artist = ARTISTA) %>% select( artist_id, artist_name, album_id, album_name, album_release_date, album_images, track_name, duration_ms, all_of(vars_audio) ) %>% arrange(desc(album_release_date)) ``` --- Realizamos una **agregación por álbum** para obtener la duración total y una lista de todos los valores de cada una de las variables de audio en cada uno de los álbumes: ```r df_albums <- df_artist_features %>% group_by( album_images, artist_name, album_id, album_name, album_release_date ) %>% summarise( duration_mins = sum(duration_ms/(1000*60)), across(all_of(vars_audio), ~ list(.x)), ) %>% ungroup() ``` Estas listas luego serán utilizadas para visualizar la distribución de cada variable a nivel álbum. --- Se cuenta con un df de variables vinculadas a cada canción de cada álbum del artista seleccionado: ```r df_albums %>% glimpse() ``` ``` Rows: 6 Columns: 11 $ album_images <list> [<data.frame[3 x 3]>], [<data.frame[3 x 3]>], [<da… $ artist_name <chr> "Bad Bunny", "Bad Bunny", "Bad Bunny", "Bad Bunny",… $ album_id <chr> "3RQQmkQEvNCY4prGKE6oc5", "2d9BCZeAAhiZWPpbX9aPCW",… $ album_name <chr> "Un Verano Sin Ti", "EL ÚLTIMO TOUR DEL MUNDO", "LA… $ album_release_date <chr> "2022-05-06", "2020-11-27", "2020-05-10", "2020-02-… $ duration_mins <dbl> 81.85270, 47.33332, 30.31767, 65.96717, 31.10840, 5… $ danceability <list> <0.804, 0.564, 0.911, 0.650, 0.787, 0.872, 0.795, … $ energy <list> <0.674, 0.903, 0.712, 0.715, 0.546, 0.588, 0.684, … $ loudness <list> <-5.453, -3.221, -5.105, -5.198, -7.094, -6.276, -… $ acousticness <list> <0.2940, 0.3560, 0.0901, 0.0993, 0.3050, 0.2750, 0… $ instrumentalness <list> <0.00000118, 0.00000000, 0.00002680, 0.00029100, 0… ``` --- Se seleccionan las columnas que no sean listas y se visualizan con **{gt}** 📦 ```r tabla <- df_albums %>% select(artist_name, album_name, album_release_date, duration_mins) %>% # Se convierte el df a the grammar of tables gt() tabla ```
artist_name
album_name
album_release_date
duration_mins
Bad Bunny
Un Verano Sin Ti
2022-05-06
81.85270
Bad Bunny
EL ÚLTIMO TOUR DEL MUNDO
2020-11-27
47.33332
Bad Bunny
LAS QUE NO IBAN A SALIR
2020-05-10
30.31767
Bad Bunny
YHLQMDLG
2020-02-29
65.96717
Bad Bunny
OASIS
2019-06-28
31.10840
Bad Bunny
X 100PRE
2018-12-23
53.94298
--- Siguiendo con la lógica de {gt} 📦 es posible añadir nuevas capas a la tabla. Por ejemplo, se añade título, subtítulo y colores: ```r tabla %>% tab_header( title = md('**Bad Bunny** en Spotify'), subtitle = 'Álbumes más recientes' ) %>% gt_color_box( columns = duration_mins, palette=c('white', 'green'), domain=c(0,round(max(df_albums$duration_mins))+1)) ```
Bad Bunny
en Spotify
Álbumes más recientes
artist_name
album_name
album_release_date
duration_mins
Bad Bunny
Un Verano Sin Ti
2022-05-06
82
Bad Bunny
EL ÚLTIMO TOUR DEL MUNDO
2020-11-27
47
Bad Bunny
LAS QUE NO IBAN A SALIR
2020-05-10
30
Bad Bunny
YHLQMDLG
2020-02-29
66
Bad Bunny
OASIS
2019-06-28
31
Bad Bunny
X 100PRE
2018-12-23
54
--- Con **muchas** capas, es posible convertir el df original en la siguiente tabla: <img src="../02_caso_spotify/tablas/tabla_8.png" width="80%" style="display: block; margin: auto;" /> --- class: center, middle <img src="images/meme_badbunny.png" width="30%" style="display: block; margin: auto;" /> --- class: center, middle <img src="https://i.pinimg.com/564x/9a/54/17/9a541707e8b87607f25091fbc4538598.jpg" width="30%" style="display: block; margin: auto;" /> Veamos los detalles en el archivo .Rmd: 🔗 [Generando tablas de Bad Bunny a partir de datos de Spotify](https://github.com/karbartolome/gt-spotify/blob/main/02_caso_spotify/spotify_gt_rendered.md) 🔗 [Proyecto en RStudio Cloud (ahora Posit)](https://posit.cloud/content/5023586) --- # Compartí tu tabla en redes sociales Dejamos un script: 🔗 [generar_tabla_artista.R](https://github.com/karbartolome/gt-spotify/blob/main/02_caso_spotify/generar_tabla_artista.R) que permite generar la tabla del .Rmd a partir de una función para un artista específico. Si te interesa, 🤩**podes utilizar la función para generar una tabla {gt} sobre tu artista favorito y compartirla en las redes con los hashtags: #RLadiesBA y #RStatsES** 🤩 --- Se cargan las funciones incluidas en el script y se genera la tabla: ```r source(here::here('02_caso_spotify/generar_tabla_artista.R')) df <- gen_data_artista(.artista='las ligas menores') tabla <- gen_tabla_artista(.df=df,.head=5) ``` <img src="../02_caso_spotify/tablas/tabla_lasligasmenores.png" width="80%" style="display: block; margin: auto;" /> --- class: center, middle, inverse, big-font # Comentarios finales --- # Cosas que queremos que se lleven de este workshop <img src="https://acegif.com/wp-content/uploads/gifs/spongebob-rainbow-1.gif" width="20%" style="display: block; margin: auto;" /> -- - Las tablas también son una forma de visualización de datos. -- - {gt} 📦 simplifica la generación de tablas mediante una estructura similar a {ggplot2} 📦, utilizando capas. -- - Las APIs son un método muy útil para acceder a datos que de otra forma sería muy complejo consultar. --- # Links utiles - 🔗 [Galería de tablas de RStudio](https://community.rstudio.com/c/table-gallery) - 🔗 [Documentación de {gt}📦](https://gt.rstudio.com/) - 🔗 [Documentación de {spotifyr} 📦](https://www.rcharlie.com/spotifyr/) - 🔗 [Intro a Tidyverse | con Jimena Saucedo y María Nanton en el Women in Bioinformatics and Data Science](https://www.youtube.com/watch?v=ycudMihLues&ab_channel=RLadiesBuenosAires) - 🔗 [Post sobre el uso de gt: Uso del subte en la Ciudad Autónoma de Buenos Aires](https://karbartolome-blog.netlify.app/posts/tablas-subte/) - 🔗 [Otro link (:](https://www.youtube.com/watch?v=dQw4w9WgXcQ&ab_channel=RickAstley) --- class: inverse, center, middle # Contacto .pull-left[ <a href="https://karbartolome-blog.netlify.com"><i class="fa fa-link fa-fw"></i> karbartolome-blog.netlify.com</a><br> <a href="http://twitter.com/karbartolome"><i class="fa fa-twitter fa-fw"></i> @karbartolome</a><br> <a href="http://github.com/karbartolome"><i class="fa fa-github fa-fw"></i> @karbartolome</a><br> ] .pull-right[ <a href="https://soyandrea.netlify.app"><i class="fa fa-link fa-fw"></i> Soyandrea.netlify.app</a><br> <a href="http://twitter.com/me_andre"><i class="fa fa-twitter fa-fw"></i> @me_andre</a><br> <a href="http://github.com/SoyAndrea"><i class="fa fa-github fa-fw"></i> @SoyAndrea</a><br> ] --- class: center, middle, big-font, inverse # Muchas gracias!! Las slides fueron creadas con el paquete [**xaringan**](https://github.com/yihui/xaringan), utilizando el template de Rladies --- <br> <img src="https://gifdb.com/images/thumbnail/bad-bunny-eating-popcorn-mi03a75ps5zxfv72.gif" width="80%" style="display: block; margin: auto;" />