Ir al contenido

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.

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())

Quiero obtener una sola columna de la base pero me da 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)

¿Cómo convertir mi base en tibble?

Para convertir tu base en tibble utiliza collect. Por ejemplo:

datos_duckdb$dats %>% collect()

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).

Warning message: Downloading ‘…’ failed; falling back to cached version

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.