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
.zip
de 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
duckdb
donde guardar los datos por default se llamacovidmx
. Solo es relevante si estas usando el mismodbdir
para otro proyecto distinto.- colClasses
(opcional) Clases de la columna para leer en
duckdb::read_csv_duckdb()
.- download_process
(opcional) Metodo para descargar ya sea
pins
odownload.file
. Se recomiendapins
pues 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
unzip
falla. 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
unzip
falla. 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::unzip
en 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
unzip
no sirva.- clear_zip
(opcional) Si borrar los archivos
.zip
descargados 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
.csv
que 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
csv
si ya los descargaste y descomprimiste el archivozip
en uncsv
- datos_abiertos_tbl
(opcional) Camino a un archivo
.duckdb
con los datos formateados- diccionario_zip_path
(opcional) Camino al diccionario si ya losdescargaste en
zip
- diccionario_unzipped_path
(opcional) Camino al diccionario
csv
si ya lo descargaste y descomprimiste el archivozip
en 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
pins
para 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
pins
para 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_url
para 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_url
para los datos abiertos. Por default se llamadiccionario_covid
- download_file_args
(opcional) Lista de argumentos adicionales para
download.file
de los datos si se elige este metodo para descargar.- download_file_args_dict
(opcional) Lista de argumentos adicionales para
download.file
del diccionario si se elige este metodo de descarga.- descarga_db_datos_abiertos_tbl_args
(opcional) Lista con argumentos adicionales para el
pins::pin_download
de datos abiertos- descarga_db_diccionario_ssa_args
(opcional) Lista con argumentos adicionales para el
pins::pin_download
de 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
tibble
s 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 archivozip
descargadoparse_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 archivozip
descargadoparse_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
# }