ETL y servidor web para scrapear series de tiempo de Excels semi-estructurados y transformarlos en distribuciones de formato abierto, basado en una extensión experimental del Perfil Nacional de Metadatos de la política de apertura de datos de la APN.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
config
samples
scripts
tests
.gitignore
.travis.yml
LICENSE
Makefile
README.md
fix_github_links.sh
requirements.txt
requirements_dev.txt

README.md

series-tiempo-ar-scraping

Build Status license python

ETL y servidor web que scrapea series de tiempo de archivos .xlsx semi-estructurados y los transforma en distribuciones de formato abierto. La aplicación está basada en una extensión experimental del Perfil de Metadatos del Paquete de Apertura de Datos.

Indice

Instalación

Los siguientes pasos fueron probados en una instalación de Ubuntu 16.04.

  1. Instalar las dependencias necesarias para descargar y configurar el proyecto:
$ sudo apt install python-pip git
  1. Clonar el repositorio y acceder al directorio creado:
$ git clone https://github.com/datosgobar/series-tiempo-ar-scraping.git
$ cd series-tiempo-ar-scraping
  1. Crear el entorno virtual de Python con Anaconda o Virtualenv e instalar las dependencias del proyecto:

    Anaconda:

    Si Anaconda no se encuentra instalado, instalarlo:

    $ make install_anaconda

    Durante el proceso de instalación, asegurar que el instalador modifique el archivo .bashrc para incluir el comando conda en el PATH.

    Luego, habilitar el comando conda:

    $ source ~/.bashrc

    Una vez instalado Anaconda y habilitado el comando conda, crear el entorno virtual:

    $ make setup_anaconda

    Virtualenv:

    Crear el entorno virtual e instalar las dependencias:

    $ make setup_virtualenv
  2. Crear el índice de catálogos y el archivo de configuración general:

$ cp config/index.example.yaml config/index.yaml
$ cp config/config_general.example.yaml config/config_general.yaml

El archivo index.yaml contiene el listado de catálogos a ser descargados y scrapeados. Por defecto, incluye un catálogo de ejemplo llamado example_catalog1, cuyos archivos están almacenados en este repositorio.

  1. (Opcional) Crear los archivos de configuración para el envio de reportes por mail y para descargas, asi también como el archivo custom_steps.sh, el cual permite ejecutar comandos a elección del usuario una vez que el ETL finaliza.
$ cp config/config_email.example.yaml config/config_email.yaml
$ cp config/config_downloads.example.yaml config/config_downloads.yaml
$ cp config/custom_steps.example.sh config/custom_steps.sh

Luego, editar los archivos config_email.yaml, config_downloads.yaml y custom_steps.sh con los parámetros deseados.

Uso

Correr el ETL

Los distintos pasos del scraper se pueden correr individualmente como recetas del Makefile. Para correr el ETL completo:

Anaconda:

$ source activate series-tiempo-ar-scraping
$ make all

Virtualenv:

$ source series-tiempo-ar-scraping/bin/activate
$ make all

El proceso toma catálogos de datos abiertos en Excel con series de tiempo documentas para scraping, transforma el catálogo al formato data.json y genera (distribuciones para scraping) o descarga (distribuciones ya generadas según la especificación) los archivos de distribuciones en el directorio data/output.

Si se corre luego de los pasos de instalación, el proceso se ejecuta con el catálogo de ejemplo.

Ejecución Automática con cron

Utilizando la herramienta cron, es posible ejecutar de forma automática el ETL en horarios determinados. Para instalar el archivo de configuración cron del proyecto, seguir las siguientes instrucciones:

Anaconda:

$ source activate series-tiempo-ar-scraping # asegurar que el entorno virtual Python esté activado
$ make install_cron

Virtualenv:

$ source series-tiempo-ar-scraping/bin/activate # asegurar que el entorno virtual Python esté activado
$ make install_cron

Una vez instalado el archivo de configuración, el ETL se ejecutará a las 00, 12, 15 y 17 horas de cada día.

Entradas/Salidas del ETL

  • Entradas:

    • index.yaml: Contiene un listado de catálogos con series de tiempo y sus URLs respectivas (Ver ejemplo).
    • config_general.yaml: Contiene la configuración del servidor donde se servirán los archivos de salida (Ver ejemplo).
  • Salidas:

    • Directorio data/output/: Por cada catálogo procesado, se crea un subdirectorio con:
      • data.json: Catálogo en formato .json (data/output/catalog/{catalog_id}/data.json).
      • catalog.xlsx: Catálogo en formato .xlsx (data/output/catalog/{catalog_id}/catalog.xlsx).
      • Archivos de distribuciones descargados vía downloadURL (data/output/catalog/{catalog_id}/dataset/{dataset_id}/distribution/{distribution_id}/distribucion-descargada-nombre.csv).
      • Archivos de distribuciones scrapeadas (data/output/catalog/{catalog_id}/dataset/{dataset_id}/distribution/{distribution_id}/distribucion-scrapeada-nombre.csv).
    • Directorio data/reports/: Por cada catálogo procesado, se crea un subdirectorio con:
      • Reporte del proceso de validación del catálogo.
      • Reporte con información sobre los datasets del catálogo.
      • Reportes del proceso de scraping del catálogo.

Crear un catálogo con series de tiempo

El scraper se basa en una extensión del Perfil Nacional de Metadatos que documenta cómo debe crearse un catálogo de datos abiertos.

El Perfil de Metadatos especifica cómo deben documentarse distribuciones CSV que contengan series de tiempo. Esta es una especificación estricta que propone generar CSVs estándares y documentarlos para su extracción e interpretación segura por aplicaciones de todo tipo.

Este proyecto, añade algunos campos de metadatos extra al catálogo que no son parte del Perfil de Metadatos y están pensados para poder generar estos CSVs estándares a partir de series que están publicadas en Excels semi-estructurados.

Nuevos campos para scraping

Distribución (distribution)
Nombre Requerido Descripción Ejemplo Variable (data.json) Tipo (data.json)
URL de Excel fuente Si URL que permite la descarga directa de un archivo XLSX que tiene series de tiempo. https://github.com/datosgobar/series-tiempo-ar-scraping/raw/master/samples/sources/actividad_ied.xlsx scrapingFileURL String
URL de Excel fuente Si Nombre de la hoja del Excel donde están las series a scrapear para generar la distribución. 1.2 OyD real s.e. scrapingFileSheet String
Campo (field)
Nombre Requerido Descripción Ejemplo Variable (data.json) Tipo (data.json)
Celda comienzo de la serie Si Coordenadas de la celda donde comienzan los datos de la serie o los valores del índice de tiempo. A9 scrapingDataStartCell String
Celda identificador de la serie Si Coordenadas de la celda donde está el identificador o nomenclador de la serie. Este campo sólo es necesario para las series (no para el índice de tiempo). El identificador debe estar en una celda que sea el "encabezado" de la serie y debe coincidir con el documentado como `id` en el catálogo. A8 scrapingIdentifierCell String

Contacto

Te invitamos a crearnos un issue en caso de que encuentres algún bug o tengas feedback de alguna parte de series-tiempo-ar-scraping.

Para todo lo demás, podés mandarnos tu comentario o consulta a datos@modernizacion.gob.ar.