knitr::opts_chunk$set(echo = TRUE) library(covidmx) library(tidyverse) library(kableExtra)
covidmx
?Centraliza la información y la lectura de la base es más rápida que lo que ocurriría normalmente. Gracias a covidmx
pierdes menos tiempo descargando y le dedicas más tiempo a analizar. El hecho de usar duckdb
permite generar preguntas a la base de manera rápida. Por ejemplo con el siguiente benchmark:
dlink <- c("test" = "https://github.com/RodrigoZepeda/covidmx/raw/main/datos_abiertos_covid19.zip") #Datos del 2021 en tibble (clásico) datos_tibble <- descarga_datos_abiertos(read_format = "tibble", sites.covid = dlink, show_warnings = FALSE) #Datos del 2021 en duckdb (paquete covidmx) datos_duckdb <- descarga_datos_abiertos(sites.covid = dlink, show_warnings = FALSE)
#Calculamos el total de casos por fecha y sexo para ver que #el duckdb es mucho más rápido microbenchmark::microbenchmark( datos_tibble$dats |> group_by(FECHA_SINTOMAS, SEXO) |> tally(), datos_duckdb$dats |> group_by(FECHA_SINTOMAS, SEXO) |> tally() )
Lo cual resulta en los siguientes tiempos (milisegundos):
#Calculamos el total de casos por fecha y sexo para ver que #el duckdb es mucho más rápido benchmark <- microbenchmark::microbenchmark( datos_tibble$dats |> group_by(FECHA_SINTOMAS, SEXO) |> tally(), datos_duckdb$dats |> group_by(FECHA_SINTOMAS, SEXO) |> tally() ) benchmark |> as_tibble() |> mutate(expr = if_else(str_detect(expr, "datos_duckdb"), "duckdb", "tibble")) |> mutate(time = time/1.e6) |> group_by(expr) |> summarise("Media" = mean(time), "Minimo" = min(time), "Maximo" = max(time), "Mediana" = median(time), "Q25" = quantile(time, 0.25), "Q75" = quantile(time, 0.75), "DesvEst" = sd(time)) |> kableExtra::kable() |> kableExtra::kable_styling()
No olvides desconectar
datos_duckdb$disconnect()
pins
?El paquete de pins
registra una dirección web y verifica que no haya
cambiado el archivo presente en la dirección antes de descargar de nuevo. Esto te permite
no perder tanto tiempo en la descarga. Ve cómo si descargo una vez y luego una subsecuente el mismo
paquete me advierte que no hace falta pues nada ha cambiado:
cache_dir <- tempdir() descarga_datos_red_irag(cache = cache_dir) #Primer intento no dice nada descarga_datos_red_irag(cache = cache_dir) #Segundo intento nos dice que ya descargó
duckdb
?duckdb
es un sistema de bases de datos caracterizado por su velocidad y por leer de memoria
(disco duro) las bases. Usando duckdb
tu computadora no sufre por poca RAM
y opera más rápido que con un tibble
.
Utiliza la opción dbdir
para crear un archivo .duckdb
y guardar tus datos en formato duckdb
. Como
ejemplo:
#Descarga y almacena en archivo duckdb descarga_datos_abiertos(dbdir = "ejemplo.duckdb") #Lee de archivo duckdb read_datos_abiertos(dbdir = "ejemplo.duckdb")
datos_covid$dats
y se vuelve muy lento / se acaba la memoriaProbablemente la función no tenga un equivalente en duckdb
. La recomendación es aplicar la mayor
cantidad de filtros y selecciones que puedas en duckdb
y después aplicarle la función que quieras. Ejemplo:
datos_covid <- covidmx::datosabiertos #No recomendado primero aplicar función ajena a duck y luego semana #tampoco se recomienda quedarte con todas las variables datos_covid$dats |> mutate(dia_semana = lubridate::wday(FECHA_SINTOMAS)) |> filter(SEXO == 1) #Recomendado: quedarte solo las variables q necesitas y primero aplicar #las funciones de dbplyr datos_covid$dats |> select(SEXO, FECHA_SINTOMAS) |> filter(SEXO == 1) |> mutate(dia_semana = lubridate::wday(FECHA_SINTOMAS))
tibble
se me acaba la memoriaEsto es normal pues los tibble
viven en tu memoria RAM
. Cambia read_format
a "duckdb"
.
duckdb
se me acaba la memoriaEsto es normal si tu memoria RAM
es pequeña. Cambia pragma_memory_limit = "1GB"
a algo más pequeño
tomando en cuenta que el límite de PRAGMA siempre debe ser menor al de tu RAM
(recomiendo la mitad o menos).
Puedes usar las funciones del tipo read_datos_abiertos_*
según vengan en zip
, csv
o duckdb
. La
función read_datos_abiertos
intenta adivinar el formato automáticamente.
En las funciones de descarga_
puedes cambiar la variable sites.covid
poniendo el nombre
de la base como identificador y el sitio en forma de vector. Por ejemplo descargando la siguiente
de Github:
dlink <- c("gtest" = "https://github.com/RodrigoZepeda/covidmx/raw/main/datos_abiertos_covid19.zip") datos_covid <- descarga_datos_abiertos(read_format = "duckdb", sites.covid = dlink, tblname = "test", quiet = TRUE, show_warnings = F, force_download = T, cache_datos = tempfile(), cache_diccionario = tempfile())
NULL
(ej datos_duckdb$dats$ORIGEN
)La base de datos que leíste como duckdb
no es un tibble
ni un data.frame
por lo cual no todas
las funciones que aplican para tibble
están disponibles. Para obtener una sola columna usa pull
:
datos_duckdb$dats %>% pull(ORIGEN)
tibble
?Para convertir tu base en tibble
utiliza collect
. Por ejemplo:
datos_duckdb$dats %>% collect()
fun
is not supported on database backendsLa función que quieres aplicar no es una función de dbplyr
necesitas colapsar tu base primero
en un tibble
para poder aplicarla. Ver sección correspondiente
El vínculo de sites.covid
es incorrecto (quizá la SSA lo cambió). Para actualizar el correcto sigue las mismas instrucciones descritas en la sección previa.
El problema es que estás usando el driver
de duckdb
en otro lado. Prueba la opción con read_only
:
drv = duckdb::duckdb(dbdir = 'tu/archivo.duckdb', read_only = TRUE)
.
Hubo un problema con la conexión a Internet ya sea porque los datos cambiaron de sitio web o porque te quedaste sin señal.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.