Dolar Paralelo Argentina

R

Una Introducción a la librería {gganimate} utilizando datos del tipo de cambio paralelo de Argentina durante los periodos de 2002-2022. Estos datos se extraen usando la tecnica de Web Scraping con {rvest}.

Maxi Galoto
2022-01-18

react

Inicio



Dolar Paralelo Argentina

Volver al Inicio



El siguiente trabajo consiste en una introducción a la librería {gganimate} de R utilizando datos del tipo de cambio paralelo para Argentina durante el periodo 2002-2022.

Los datos se van a extraer utilizando la técnica de Web Scraping con la librería {rvest} desde la pagina: dolarhistorico y dolarhoy.




Libreria Utilizada

Volver al Inicio



Gganimate es una extensión del paquete ggplot2 para crear ggplots animados.

Proporciona una variedad de funciones nuevas que se pueden agregar al objeto de trazado para personalizar cómo debe cambiar con el tiempo.

Rvest ayuda a extraer (o recolectar) datos de páginas web. Inspirado en bibliotecas como beautifulSoup y RoboBrowser .




Extract, Transform and Load



A continuación se detallan las funciones que se utilizaron para realizar la extracción, transofrmacion y carga de los datos.

La función realiza las siguientes tareas:

Primero se levantan los datos:



edit_dolar_historico = function(df){
  return(
    df %>% mutate(
      Fecha = as.Date(Fecha, format = "%d/%m/%Y"),
      Compra = as.numeric(Compra),
      Venta = as.numeric(Venta),
      Promedio = as.numeric(Promedio),
      variacion = as.numeric(variacion))
    )
}


data = edit_dolar_historico(read_excel('data/dolar.xlsx') %>% 
  select(Fecha,Compra,Venta,Promedio,variacion)) %>% 
  arrange(Fecha)

Luego se crean las funciones para extraer los datos de ambas paginas y la transformacion de los DataFrames:



get_tibble = function(dolarhoy, data, today){
  return(
    tibble(
        Fecha = as.Date(today),
        Compra = dolarhoy["compra"][[1]],
        Venta = dolarhoy["venta"][[1]],
        Promedio = dolarhoy["promedio"][[1]],
        variacion = round(
          ((dolarhoy["promedio"][[1]]-data$Promedio[nrow(data)] ) / data$Promedio[nrow(data)]),2
          )
      )
  )
}


edit_dolar = function(df){
  return(
    data.frame(df) %>% mutate(
      Fecha = as.Date(Fecha, format = "%d/%m/%Y"),
      Compra = round(as.numeric(gsub(",", ".", Compra)),2),
      Venta = round(as.numeric(gsub(",", ".", Venta)),2),
      Promedio = ((Compra + Venta) / 2),
      variacion = round(as.numeric(gsub(",", ".", gsub("%", "", Variación))),2) ) %>%
      select(Fecha, Compra, Venta, Promedio, variacion)
  ) 
}



get_ts_dolar = function(data, URL) {
  from_year=year(max(data$Fecha))
  from_month=month(max(data$Fecha))
  vector_years = c(from_year:year(today()))
  months = c('enero', 'febrero', 'marzo', 
              'abril', 'mayo', 'junio', 
              'julio', 'agosto', 'septiembre', 
              'octubre', 'noviembre', 'diciembre'
             )
  vector_months = months[from_month:length(months)]
  
  vector_final = c()
  datalist = list()
  datalist = vector("list")
  
  counter = 1
  for (i in 1:length(vector_years)) {
    counter = counter + 1
    year = vector_years[i]
    
    for (i in 1:length(vector_months)) {
      counter = counter + 1
      month = vector_months[i]
      vector_final[counter] = paste0(month, '-', year)
    }
  }
  
  for (i in 1:length(vector_final)) {
    skip_to_next <- FALSE
    link = paste0(
      URL,vector_final[i])
    data = as.data.frame(rvest::html_table(read_html(link)))
    datalist[[i]] <- data
    tryCatch(print(b), error = function(e) {skip_to_next <<- TRUE})
    if( skip_to_next ) { next }    
  }
  dolar = do.call(rbind, datalist)
  return(
    dolar
    )
}




get_dolarhoy = function(url){
  webpage <- read_html(url)
  compra_node <- webpage %>%
    html_nodes(
    xpath = "//div[@class='topic'][text()='Compra']/following-sibling::div[@class='value']")
  venta_node <- webpage %>%
    html_nodes(
    xpath = "//div[@class='topic'][text()='Venta']/following-sibling::div[@class='value']")
  compra_valor <- round(as.numeric(gsub("\\$","", html_text(compra_node))),2)
  venta_valor <- round(as.numeric(gsub("\\$","", html_text(venta_node))),2)
  promedio <- round(((venta_valor+compra_valor)/2),2)
  return(c("compra" = compra_valor, "venta" = venta_valor, "promedio" = promedio))
}

Luego se obtienen los datos solo si today > maxima fecha del ultimo dato. Si la diferencia es 1 dia o el dia es el mismo se actualiza el registro desde DolarHoy, de lo contrario se buscan todos los datos del mes en curso desde la otra pagina y se actualizan en el DataFrame.


if (today>=max(data$Fecha)){
  if (today == max(data$Fecha)+1 | today == max(data$Fecha)){
    dolarhoy_blue= get_dolarhoy(URL_BLUE)
    dolar = unique(bind_rows(
      data %>% filter(Fecha < today),
      get_tibble(dolarhoy_blue, data, today)
    ) %>% arrange(Fecha)
  )
    } else {
    dolar = unique(bind_rows(data, edit_dolar(get_ts_dolar(data, URL))) %>% arrange(Fecha))
  }
  
  write.xlsx(dolar, 'data/dolar.xlsx', rowNames = FALSE, overwrite = TRUE)
  rm(data)
} else {
  dolar <- data %>% arrange(Fecha)
  rm(data)
}



Dolar Paralelo



Una vez obtenidos los datos se realizo el grafico animado:

.

Se puede observar un fuerte incremento del tipo de cambio luego del Shock Externo del Covid-19.

Si bien la tendencia del dólar es alcista hace tiempo, este gráfico nos muestra una relación casi exponencial.

El siguiente código es el que se utilizo para crear el gráfico dinámico con {gganimate}.


dolar %>% 
  ggplot(aes(x = Fecha, y = Promedio)) + 
    geom_path(aes(x = Fecha, y = Promedio), alpha = 0.7, size = 1.5, width = 1, color = '#39ad58') + 
    geom_point(aes(x = Fecha, y = Promedio), alpha = 1, size = 4, width = 2,color = 'grey') +
    ggtitle("Regions With Most Cases") +
    scale_x_date(date_labels = "%Y") +
    scale_y_continuous(limits = c(min(dolar$Promedio)/1.10, max(dolar$Promedio)*1.10)) + 
    geom_text(aes(label = paste0("Precio: $",Promedio,'\nPeriodo:',month(dolar$Fecha),'/',year(dolar$Fecha))), hjust = +1, size = 6) +
    labs(title = 'Dolar Paralelo, Fecha: {frame_along}', x = 'Año', y = 'Dolar Paralelo', subtitle = "Dinamica del Dolar Paralelo",
    caption = "Elaboracion propia en base a datos de Ambito.com") +
    theme_bw() +
    theme(legend.position = "bottom") + 
    transition_reveal(Fecha) +
    geom_vline(xintercept=dolar$Fecha[4515],linetype=1, 
                color = "black", size=0.8) 



Dashboard



Publicado en: Pagina de Rpubs