Preguntas Frecuentes
Rodrigo Zepeda
2023-02-15
Código:vignettes/articles/Preguntas_Frecuentes.Rmd
Preguntas_Frecuentes.Rmd
Preguntas
¿Por qué me conviene usar 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)
##
[1mindexing
[0m
[34mtest.csv
[0m [=======================------------------]
[32m5.68GB/s
[0m, eta:
[36m 0s
[0m
[1mindexing
[0m
[34mtest.csv
[0m [=======================================]
[32m393.87MB/s
[0m, eta:
[36m 0s
[0m
#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):
expr | Media | Minimo | Maximo | Mediana | Q25 | Q75 | DesvEst |
---|---|---|---|---|---|---|---|
duckdb | 73.55443 | 49.99551 | 123.3242 | 73.45143 | 59.46723 | 81.20542 | 16.2601 |
tibble | 533.66309 | 463.90363 | 665.0071 | 527.61363 | 508.48319 | 556.05074 | 36.0717 |
No olvides desconectar
datos_duckdb$disconnect()
## ✔ Desconectado
¿Para qué me sirve la descarga con 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
## # A tibble: 31,506 × 6
## Estado Hospitaliza…¹ Venti…² UCI y…³ Fecha Actualizacion
## <chr> <dbl> <dbl> <dbl> <date> <dttm>
## 1 Oaxaca 100 0 0 2020-04-01 2022-12-23 08:07:13
## 2 Ciudad de México 100 65.8 65.8 2020-04-01 2022-12-23 08:07:13
## 3 México 100 16.7 33.3 2020-04-01 2022-12-23 08:07:13
## 4 Guanajuato 100 7.69 7.69 2020-04-01 2022-12-23 08:07:13
## 5 Oaxaca 100 0 8.33 2020-04-02 2022-12-23 08:07:13
## 6 Ciudad de México 100 60.2 61 2020-04-02 2022-12-23 08:07:13
## 7 México 100 16.7 16.7 2020-04-02 2022-12-23 08:07:13
## 8 Guanajuato 100 8.33 8.33 2020-04-02 2022-12-23 08:07:13
## 9 Oaxaca 100 0 0 2020-04-03 2022-12-23 08:07:13
## 10 Ciudad de México 43.7 36.8 75 2020-04-03 2022-12-23 08:07:13
## # … with 31,496 more rows, and abbreviated variable names
## # ¹`Hospitalizados (%)`, ²`Ventilación (%)`, ³`UCI y Ventilación (%)`
descarga_datos_red_irag(cache = cache_dir) #Segundo intento nos dice que ya descargó
## Warning: La descarga mas reciente de fue hace 0.00053 dias. Como tiene menos de un dia
## usare esa. Escribe `force_download = TRUE` si quieres descargar de todas
## formas. Para desactivar este mensaje `show_warnings = FALSE.`
## # A tibble: 31,506 × 6
## Estado Hospitaliza…¹ Venti…² UCI y…³ Fecha Actualizacion
## <chr> <dbl> <dbl> <dbl> <date> <dttm>
## 1 Oaxaca 100 0 0 2020-04-01 2022-12-23 08:07:13
## 2 Ciudad de México 100 65.8 65.8 2020-04-01 2022-12-23 08:07:13
## 3 México 100 16.7 33.3 2020-04-01 2022-12-23 08:07:13
## 4 Guanajuato 100 7.69 7.69 2020-04-01 2022-12-23 08:07:13
## 5 Oaxaca 100 0 8.33 2020-04-02 2022-12-23 08:07:13
## 6 Ciudad de México 100 60.2 61 2020-04-02 2022-12-23 08:07:13
## 7 México 100 16.7 16.7 2020-04-02 2022-12-23 08:07:13
## 8 Guanajuato 100 8.33 8.33 2020-04-02 2022-12-23 08:07:13
## 9 Oaxaca 100 0 0 2020-04-03 2022-12-23 08:07:13
## 10 Ciudad de México 43.7 36.8 75 2020-04-03 2022-12-23 08:07:13
## # … with 31,496 more rows, and abbreviated variable names
## # ¹`Hospitalizados (%)`, ²`Ventilación (%)`, ³`UCI y Ventilación (%)`
¿Para qué me sirve 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
.
¿Cómo guardo la base descargada de datos abiertos?
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")
Deseo aplicar una función directamente a
datos_covid$dats
y se vuelve muy lento / se acaba la
memoria
Probablemente 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))
Al leer con tibble
se me acaba la memoria
Esto es normal pues los tibble
viven en tu memoria
RAM
. Cambia read_format
a
"duckdb"
.
Al leer con duckdb
se me acaba la memoria
Esto 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).
¿Cómo leer una base de datos abiertos que ya tenía en mi computadora?
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.
¿Cómo descargar una base de datos abiertos desde otro link?
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())
Errores frecuentes
fun
is not supported on database backends
La 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
Error in dirname(fname) : object ‘fname’ not found In addition: Warning message: In system2(unzip_command, args = c(unzip_args, datos_abiertos_zip_path), : running command ‘’unzip’ -o …’ had status 9
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.
Error: rapi_startup: Failed to open database: IO Error: Cannot open file. The process cannot access the file because it is being used by another process.
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)
.