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}.
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.
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 .
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:
= function(df){
edit_dolar_historico return(
%>% mutate(
df Fecha = as.Date(Fecha, format = "%d/%m/%Y"),
Compra = as.numeric(Compra),
Venta = as.numeric(Venta),
Promedio = as.numeric(Promedio),
variacion = as.numeric(variacion))
)
}
= edit_dolar_historico(read_excel('data/dolar.xlsx') %>%
data 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:
= function(dolarhoy, data, today){
get_tibble return(
tibble(
Fecha = as.Date(today),
Compra = dolarhoy["compra"][[1]],
Venta = dolarhoy["venta"][[1]],
Promedio = dolarhoy["promedio"][[1]],
variacion = round(
"promedio"][[1]]-data$Promedio[nrow(data)] ) / data$Promedio[nrow(data)]),2
((dolarhoy[
)
)
)
}
= function(df){
edit_dolar 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)
)
}
= function(data, URL) {
get_ts_dolar =year(max(data$Fecha))
from_year=month(max(data$Fecha))
from_month= c(from_year:year(today()))
vector_years = c('enero', 'febrero', 'marzo',
months 'abril', 'mayo', 'junio',
'julio', 'agosto', 'septiembre',
'octubre', 'noviembre', 'diciembre'
)= months[from_month:length(months)]
vector_months
= c()
vector_final = list()
datalist = vector("list")
datalist
= 1
counter for (i in 1:length(vector_years)) {
= counter + 1
counter = vector_years[i]
year
for (i in 1:length(vector_months)) {
= counter + 1
counter = vector_months[i]
month = paste0(month, '-', year)
vector_final[counter]
}
}
for (i in 1:length(vector_final)) {
<- FALSE
skip_to_next = paste0(
link
URL,vector_final[i])= as.data.frame(rvest::html_table(read_html(link)))
data <- data
datalist[[i]] tryCatch(print(b), error = function(e) {skip_to_next <<- TRUE})
if( skip_to_next ) { next }
}= do.call(rbind, datalist)
dolar return(
dolar
)
}
= function(url){
get_dolarhoy <- read_html(url)
webpage <- webpage %>%
compra_node html_nodes(
xpath = "//div[@class='topic'][text()='Compra']/following-sibling::div[@class='value']")
<- webpage %>%
venta_node html_nodes(
xpath = "//div[@class='topic'][text()='Venta']/following-sibling::div[@class='value']")
<- round(as.numeric(gsub("\\$","", html_text(compra_node))),2)
compra_valor <- round(as.numeric(gsub("\\$","", html_text(venta_node))),2)
venta_valor <- round(((venta_valor+compra_valor)/2),2)
promedio 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)){
= get_dolarhoy(URL_BLUE)
dolarhoy_blue= unique(bind_rows(
dolar %>% filter(Fecha < today),
data get_tibble(dolarhoy_blue, data, today)
%>% arrange(Fecha)
)
)else {
} = unique(bind_rows(data, edit_dolar(get_ts_dolar(data, URL))) %>% arrange(Fecha))
dolar
}
write.xlsx(dolar, 'data/dolar.xlsx', rowNames = FALSE, overwrite = TRUE)
rm(data)
else {
} <- data %>% arrange(Fecha)
dolar rm(data)
}
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)
Publicado en: Pagina de Rpubs