Funcion para la descarga de datos abiertos de la Direccion General de Epidemiologia (DGE)
Uso
descarga_datos_abiertos(
dbdir = tempfile(fileext = ".duckdb"),
sites.covid = get_sites_covid(),
site.covid.dic = get_site_dic(),
read_format = c("duckdb", "tibble"),
drv = duckdb::duckdb(),
pragma_memory_limit = Sys.getenv("pragma_memory_limit"),
tblname = "covidmx",
colClasses = get_col_class(),
download_process = c("pins", "download.file"),
unzip_command = Sys.getenv("unzip_command"),
unzip_args = Sys.getenv("unzip_args"),
unzip_args_dict = list(exdir = ".", overwrite = TRUE),
check_unzip_install = TRUE,
clear_zip = (download_process[1] != "pins"),
clear_csv = TRUE,
use_dict = TRUE,
datos_abiertos_zip_paths = NULL,
datos_abiertos_unzipped_path = NULL,
datos_abiertos_tbl = NULL,
diccionario_zip_path = NULL,
diccionario_unzipped_path = NULL,
diccionario = NULL,
quiet = FALSE,
cache_datos = NULL,
use_cache_on_failure = TRUE,
cache_diccionario = NULL,
force_download = FALSE,
show_warnings = TRUE,
board_url_name = "datos_abiertos",
board_url_name_dict = "diccionario_covid",
download_file_args = list(method = "curl", destfile = tempfile(), quiet = quiet),
download_file_args_dict = download_file_args,
descarga_db_datos_abiertos_tbl_args = list(),
descarga_db_diccionario_ssa_args = list(),
...
)Argumentos
- dbdir
(opcional) Direccion donde guardar la base de datos con terminacion
.duckdb. Corresponde al argumento deduckdb::dbConnect__duckdb_driver()- sites.covid
(opcional) Sitios web con el vinculo a los archivos
.zipde l os datos abiertos. Puedes cambiarlo por uno de los historicos, por ejemplo. La estructura esc("nombre" = "url", "nombre2" = "url2"). La ultima verificacion del sitio web default fue el 6 de septiembre del 2022.- site.covid.dic
(opcional) Sitio desde el cual descarga del diccionario de datos. La ultima verificacion del sitio fue el 6 de septiembre 2022.
- read_format
(opcional)
"duckdb"o"tibble"establece el formato de lectura de la base de datos. En la mayoria de los casos"tibble"va a resultar en un error de memoria. La opcion de"duckdb"siempre es mas rapida por lo cual es el default.- drv
(opcional) Un driver para
dbConnect(defaultduckdb::duckdb())- pragma_memory_limit
(opcional) Limite de memoria para el programa (ver PRAGMAS). Cambialo a que sea mas o menos la mitad de tu RAM. La forma mas sencilla es como una variable ambiental con
Sys.setenv('pragma_memory_limit' = '1GB')por ejemplo para un limite de 1 gigabyte.- tblname
(opcional) Nombre de la tabla de
duckdbdonde guardar los datos por default se llamacovidmx. Solo es relevante si estas usando el mismodbdirpara otro proyecto distinto.- colClasses
(opcional) Clases de la columna para leer en
duckdb::read_csv_duckdb().- download_process
(opcional) Metodo para descargar ya sea
pinsodownload.file. Se recomiendapinspues guarda en memoria la fecha de la ultima descarga y analiza si ha pasado mas de un dia desde la descarga. En caso afirmativo verifica si el archivo ha cambiado y si hubo cambios entonces lo descarga.- unzip_command
(opcional) Forma de extraer la base de datos de datos abiertos si
unzipfalla. La forma de llamarla es consystem2(unzip_command, args = c(unzip_args, file_download_data)).- unzip_args
(opcional) Argumentos de extraccion de la base de datos de datos abiertos si
unzipfalla. La forma de llamarla es consystem2(unzip_command, args = c(unzip_args, file_download_data)).- unzip_args_dict
(opcional) Lista de argumentos para usar
utils::unzipen el diccionario de datos.- check_unzip_install
(opcional) Bandera de verificacion para checar si tienes lo necesario para unzippear los datos en el caso de que
unzipno sirva.- clear_zip
(opcional) Si borrar los archivos
.zipdescargados para el diccionario y los datos abiertos. No se recomienda si estas usandopins. Ve la nota para mas informacion.- clear_csv
(opcional) Si borrar los archivos
.csvque se generan despues de abrir el zip. El default es que si pues en general solo requieres elduckdb.- use_dict
(opcional) Si descargar el diccionario de
site.covid.dic.- datos_abiertos_zip_paths
(opcional) Camino a los datos abiertos si ya los descargaste en
zip- datos_abiertos_unzipped_path
(opcional) Camino a los datos abiertos
csvsi ya los descargaste y descomprimiste el archivozipen uncsv- datos_abiertos_tbl
(opcional) Camino a un archivo
.duckdbcon los datos formateados- diccionario_zip_path
(opcional) Camino al diccionario si ya losdescargaste en
zip- diccionario_unzipped_path
(opcional) Camino al diccionario
csvsi ya lo descargaste y descomprimiste el archivozipen uncsv- diccionario
(opcional) Lo que resulta de realizar una descarga del diccionario usando
descarga_diccionario- quiet
(opcional) Variable para no mostrar mensajes
- cache_datos
(opcional) Direccion donde guardar los datos en memoria usando
pinspara no tener que volver a descargarlos si nada ha cambiado- use_cache_on_failure
(opcional) Booleana. Establece que si no se pueden descargar datos nuevos utilice los que tenga en memoria. Por default es
TRUE.- cache_diccionario
(opcional) Direccion donde guardar el diccionario en memoria usando
pinspara no tener que volver a descargarlo si nada ha cambiado- force_download
(opcional) Analiza si cambio el pin y descarga datos nuevos en caso afirmativo aunque haya pasado menos de un dia.
- show_warnings
(opcional) si arrojar
warnings- board_url_name
(opcional) Establece el nombre del
pins::board_urlpara los datos abiertos (si ya usas pins para que no se empalme). Por default se llamadatos_abiertos- board_url_name_dict
(opcional) Establece el nombre del
pins::board_urlpara los datos abiertos. Por default se llamadiccionario_covid- download_file_args
(opcional) Lista de argumentos adicionales para
download.filede los datos si se elige este metodo para descargar.- download_file_args_dict
(opcional) Lista de argumentos adicionales para
download.filedel diccionario si se elige este metodo de descarga.- descarga_db_datos_abiertos_tbl_args
(opcional) Lista con argumentos adicionales para el
pins::pin_downloadde datos abiertos- descarga_db_diccionario_ssa_args
(opcional) Lista con argumentos adicionales para el
pins::pin_downloadde datos abiertos- ...
(opcional) Parametros adicionales para
DBI::dbConnect.
Valor
Lista de valores:
dats - Tabla conectada mediante
duckdb::dbConnect__duckdb_driver()(siduckdb) o tibble (sitibble)disconnect - Funcion para cerrar la conexion a la base de datos.
dict - Lista de
tibbles con el diccionario de datos para cada variable
Detalles
La funcion de descarga principal es descarga_datos_abiertos() llama las siguientes funciones
en orden:
descarga_diccionario()Se encarga de descargar y formatear el diccionario de datosdescarga_db()Se encarga de descargar y formatear la base de datospega_db_datos_abiertos_tbl_y_diccionario()Pega ambos en el formato lista decovidmx
A su vez descarga_diccionario() ejecuta las siguientes para obtener el diccionario de datos:
descarga_db_diccionario_ssa()Descarga el diccionario de la DGEunzip_db_diccionario_ssa()Libera el archivozipdescargadoparse_db_diccionario_ssa()Genera una lista de tiblles con el diccionario por variable
Por otro lado,descarga_db() ejecuta las siguientes para obtener los datos abiertos:
descarga_db_datos_abiertos_tbl()Descarga las bases de datos de covid de la DGEunzip_db_datos_abiertos_tbl()Libera el archivozipdescargadoparse_db_datos_abiertos_tbl()Genera una base de datos enduckdb(otibble) c on la informacion
Si en algun momento se interrumpio la descarga o hubo problemas de conexion o detuviste
el proceso de generacion de la base de datos abiertos puedes llamar a las funciones
de read_datos_abiertos().
Nota
No te recomiendo borrar el cache con clear_zip o editarlo por cualquier otro medio si
estas usando pins pues puede romperse la dependencia. Si accidentalmente lo borraste
usa pins::board_cache_path() para ir al path y borrar manualmente toda la carpeta.
Memoria RAM
Si tienes RAM que te sobre puedes no crear una base de datos en duckdb sino leer directo
el archivo csv. Esto se logra con read_format = tibble. No lo recomiendo pues puedes
terminar con tu sesion de R si se te acaba la memoria.
Windows Para abrir el archivo .zip quiza requieras tambien descargar e instalar
7Zip por default el sistema lo busca en
C:\\Program Files\\7-Zip\\7z.exe pero si no esta ese directorio es necesario que
en unzip_command especifiques el camino donde se instalo 7z.exe.
Uso de pins
Para almacenar los datos se utiliza un pequenio cambio sobre la libreria pins. Los datos
se descargan y se almacenan en cache junto con informacion sobre cuando fue la descarga. Si
no ha pasado un dia desde la ultima descarga no se descarga nada nuevo. Si los datos que
se tienen no han cambiado respecto a lo que esta en linea tampoco se vuelven a descargar aunque
haya pasado mas de un dia.
Si se te fue el Internet No te preocupes, pins lee tu descarga mas reciente.
Para ver donde estan descargados tus datos usa pins::board_cache_path(). Para borrarlos usa
pins::cache_prune().
Metodos de unzip
Por default el programa intenta abrir la base de datos con utils::unzip(). Sin embargo
historicamente la base de datos ha estado codificada de tal forma que utils::unzip() no
pueda abrirla. Para ello se utilizaban diferentes comandos en particular el default que
hemos visto funcionaba son los comandos de terminal unzip (en Linux/OSX) y 7zip (en Windows).
En caso de ser requeridos el sistema te lo hara saber junto con las instrucciones de instalacion
Referencias
Secretaría de Salud (2022). Datos Abiertos de COVID-19 URL: https://www.gob.mx/salud/documentos/datos-abiertos-152127
Ejemplos
# \donttest{
# Descarga de la base de datos junto con diccionario en duckdb y la guarda en
# un archivo temporal.
# Puede cambiarse el dlink por el adecuado o dejarse en blanco
# quita la opción de sites.covid t site.covid.dic para descargar los de la DGE.
# Esto es solo un ejemplo.
file_duck <- tempfile(fileext = ".duckdb")
#Estos links deben omitirse en una corrida normal. Se incluyen por ahora como ejemplo
#pero las opciones site.covid.dic y sites.covid deben eliminarse de abajo.
dlink <- "https://github.com/RodrigoZepeda/covidmx/raw/main/datos_abiertos_covid19.zip"
diclink <- "https://github.com/RodrigoZepeda/covidmx/raw/main/diccionario_datos_covid19.zip"
#En el ejemplo de R por normas de CRAN tenemos que hacerlo así pero en tu
#computadora puedes solo usar descargar datos sin el if else
if (RCurl::url.exists(dlink) & RCurl::url.exists(diclink)){
datos_covid <- descarga_datos_abiertos(
dbdir = file_duck,
sites.covid = dlink,
site.covid.dic = diclink,
show_warnings = FALSE
)
# Luego haces algo con esos datos...
# Cuando terminas cierras la sesion:
datos_covid$disconnect()
# Despues podras leerlos con read_datos_abiertos cuando quieras:
datos_covid <- read_datos_abiertos(dbdir = file_duck, site.covid.dic = diclink)
datos_covid$disconnect()
# Si no pones `dbdir` nota que los datos se guardan en un archivo temporal que se elimina
# al cerrar tu sesion
datos_covid <- descarga_datos_abiertos(sites.covid = dlink, show_warnings = FALSE,
site.covid.dic = diclink)
} else {
datos_covid <- datosabiertos
}
#>
#> ── Hola esto es lo que hare hoy para ti: ───────────────────────────────────────
#> 1. Base de datos de covid-19 de la Direccion General de Epidemiologia:
#> • Descargar las bases de datos abiertos
#> • Descomprimir las bases de datos abiertos
#> • Consolidar en una sola base de datos
#> 2. Diccionario de datos de covid-19 de la Direccion General de Epidemiologia:
#> • Descargar el diccionario
#> • Descomprimir el diccionario
#> • Consolidar todos los diccionarios en una lista
#> 3. Unir datos y diccionario en una sola lista
#>
#> ── Comenzamos (por favor ten paciencia): ───────────────────────────────────────
#> ℹ Descargando la informacion...
#> ℹ Descomprimiendo los archivos .zip...
#> ℹ Consolidando los archivos .csv en duckdb...
#> ℹ Cargando los datos en duckdb...
#> ℹ Conectando a la tabla `covidmx` creada en duckdb...
#> ℹ Eliminando los archivos .csv
#> ✔ Terminado. No olvides desconectar la base con `datos_covid$disconnect()`
#> al terminar de trabajar.
#> ✔ Desconectado
#>
#> ── Hola esto es lo que hare hoy para ti: ───────────────────────────────────────
#> 1. Base de datos de covid-19 de la Direccion General de Epidemiologia:
#> ✔ Ya lo tienes.
#> 2. Diccionario de datos de covid-19 de la Direccion General de Epidemiologia:
#> • Descargar el diccionario
#> • Descomprimir el diccionario
#> • Consolidar todos los diccionarios en una lista
#> 3. Unir datos y diccionario en una sola lista
#>
#> ── Comenzamos (por favor ten paciencia): ───────────────────────────────────────
#> ℹ Conectando a la tabla `covidmx` creada en duckdb...
#> ✔ Terminado. No olvides desconectar la base con `datos_covid$disconnect()`
#> al terminar de trabajar.
#> Warning: La descarga mas reciente de fue hace 0.84798 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.`
#> ✔ Desconectado
#>
#> ── Hola esto es lo que hare hoy para ti: ───────────────────────────────────────
#> 1. Base de datos de covid-19 de la Direccion General de Epidemiologia:
#> • Descargar las bases de datos abiertos
#> • Descomprimir las bases de datos abiertos
#> • Consolidar en una sola base de datos
#> 2. Diccionario de datos de covid-19 de la Direccion General de Epidemiologia:
#> • Descargar el diccionario
#> • Descomprimir el diccionario
#> • Consolidar todos los diccionarios en una lista
#> 3. Unir datos y diccionario en una sola lista
#>
#> ── Comenzamos (por favor ten paciencia): ───────────────────────────────────────
#> ℹ Descargando la informacion...
#> ℹ Descomprimiendo los archivos .zip...
#> ℹ Consolidando los archivos .csv en duckdb...
#> ℹ Cargando los datos en duckdb...
#> ℹ Conectando a la tabla `covidmx` creada en duckdb...
#> ℹ Eliminando los archivos .csv
#> ✔ Terminado. No olvides desconectar la base con `datos_covid$disconnect()`
#> al terminar de trabajar.
# Desconectamos
datos_covid$disconnect()
#> ✔ Desconectado
# }