Dia 2: Fallas encontradas (data, metadata, diccionario) (E9)

Este espacio está dedicado para compartir los avances de las actividades de este día.

Sobre las actividades, te dejamos una guía a continuación:

Para compartir los avances, cuéntanos lo siguiente:

  • Cuáles son esos 3 conjuntos de datos que seleccionaste para la detección de fallos.
  • En un párrafo cuéntanos qué defectos encontraste en la metadata y/o el diccionario de datos de esos 3 conjuntos de datos.
  • Cuál de esos 3 conjuntos de datos requieren proceso de limpieza. Cuéntanos un poco sobre qué campos/columnas contienen basura, y de qué tipo. campos/columnas contienen basura, y de qué tipo.

Marca el check :white_check_mark: cuando hayas realizado la actividad.

Hola!

Con nuestro equipo hemos desarrollado el siguiente código, cuyo objetivo principal es:

Utilizar la API del portal de datos abiertos, buscar un conjunto de datos y luego en base a ese nombre descargar todos los recursos del conjunto.

Esta basado en un Jupyter Notebook en Python.

Buscar conjuntos de datos

# API docs: http://docs.ckan.org/en/2.9/api/
import requests # Librerias utilizadas
import json
import os 

# Query a la API
query = input("Busca por palabras claves: ")
r = requests.get(f"https://datosabiertos.gob.ec/api/3/action/package_search?q={query}")
data = r.json()
  
number_of_suggestions = len(data["result"]["results"])
print(f"Se han encontrado {number_of_suggestions} coincidencias: \n")

# Muestra los conjuntos de datos
for i in range(0, number_of_suggestions):
    print(json.dumps(data["result"]["results"][i]["name"],indent = 4, sort_keys = True))

Input: “colocacion”
Output:

Se han encontrado 7 coincidencias:

“colocacion-por-zonal”
“colocacion-por-segmento”
“colocacion-por-sector”
“colocacion-por-provincia”
“colocacion-por-genero”
“colocacion-por-ano”
“colocacion-por-zonal-oficina”

Descargar datos de un conjunto de datos
El objetivo aquí es copiar y pegar uno de los conjuntos que se muestren arriba.

# Ingresa el nombre de un conjunto de datos mostrado arriba.
query_conjuntos = input("Ingrese el nombre del conjunto elegido: ")

# Crea una carpeta con el nombre del conjunto de datos.
os.system(f"mkdir /Users/gutembergmendoza/Docs/hub_uio/data/{query_conjuntos}")

# Query a la API
r = requests.get(f"https://datosabiertos.gob.ec/api/3/action/package_search?q={query_conjuntos}")
data = r.json()

# Working with Json File
number_of_files = len(data["result"]["results"][0]["resources"])
print("Nombre del conjunto: ", query_conjuntos, "\n")

json_resources = data["result"]["results"][0]["resources"]

for i in range(0, number_of_files):
    print("\n")
    print('Recurso numero: ', i)

    file_name = json.dumps(json_resources[i]["name"],indent = 4, sort_keys = True)
    print("Nombre: " , file_name )

    # Resource link
    link = json.dumps(json_resources[i]["url"],indent = 4, sort_keys = True)
    #formatted the link
    formatted_link = str(link).replace('"','')

    # Download the data
    json_to_data = requests.get(formatted_link).content
    print("file: " , formatted_link[formatted_link.find('download')+9:])
    with open(f"data/{query_conjuntos}"+ "/" + formatted_link[formatted_link.find('download')+9:],'wb') as file:
        file.write(json_to_data)
    
    print('Datos descargados.')

Input: colocacion-por-genero
output: Se descarga el contenido.

Esperamos que este código sirva para la comunidad.

1 me gusta

Solución:
Cuáles son esos 3 conjuntos de datos que seleccionaste para la detección de fallos.

  • Boletín de Deuda Pública.
  • Ejecución de gastos de personal por entidad operativa desconcentrada eod.
  • Teletrabajo

En un párrafo cuéntanos qué defectos encontraste en la metadata y/o el diccionario de datos de esos 3 conjuntos de datos.
Hemos encontramos dos principales defectos, datos vacíos y problemas con el encoding, esto significa que en procesadores de datos no reconocen ciertos signos de puntuación, adicionalmente hay valores que deben ser int y se encuentran como float. Esto se especifica más adelante.

Cuál de esos 3 conjuntos de datos requieren proceso de limpieza. Cuéntanos un poco sobre qué campos/columnas contienen basura, y de qué tipo. campos/columnas contienen basura, y de qué tipo.
De los 3 conjuntos elegidos, 2 de ellos necesitan limpieza: Boletín de Deuda Pública y Teletrabajo.

Hemos procesado los datos con Python, esto se puede hacer de diferentes maneras, en el código se encuentra comentado los detalles.

Boletín de Deuda Pública

Contiene los datos del Boletín de Deuda Pública de Junio/2021 expresado en miles de dólares (USD).

import pandas as pd
import chardet
path_to_data = "data/boletin-de-deuda-publica/MEF_BoletinDeuda_SaldosYMovimientosIn2020_Junio2021.csv"
path_to_dict = "data/boletin-de-deuda-publica/mef_boletindeuda_saldosymovimientosin2020_junio2021_diccionariodatos.ods"
with open(path_to_data, 'rb') as f:
    enc = chardet.detect(f.read()) 

df = pd.read_csv(path_to_data,encoding='latin1', delimiter=";")
df_dict = pd.read_excel(path_to_dict)
df

# Existen valores NaN en todas las columnas antes de la columna "Saldo al mes anterior"
# En las columnas despues de la mencionada antes, existen valores de vacios. 
# Las columnas de año, SPT,SPNF,PGE,SPT,SPNF, PGE necesitan ser integer. 
# Existe diccionario de datos.

Ejecucion de gastos de personal por entidad operativa desconcentrada eod

Reporte de ejecución del Presupuesto General del Estado (PGE) en gastos de personal 2021. Sectores: 111 y 112. Grupos: 51 y 71.

path_to_data = "data/ejecucion-de-gastos-de-personal-por-entidad-operativa-desconcentrada-eod/mef_presupuestogastospersonaleod_agosto2021.csv"
path_to_dict = "data/ejecucion-de-gastos-de-personal-por-entidad-operativa-desconcentrada-eod/mef_presupuestogastospersonaleod_agosto2021_diccionariodatos.ods"
with open(path_to_data, 'rb') as f:
    enc = chardet.detect(f.read()) 

df = pd.read_csv(path_to_data,encoding='latin1', delimiter=";")
df_dict = pd.read_excel(path_to_dict)
df

# Es un DataSet bastante completo, pensamos que no necesita limpieza.

Teletrabajo

path_to_data = "data/teletrabajo/mdt_teletrabajo_2022mayo.csv"
path_to_dict = "data/teletrabajo/mdt_teletrabajo_dd_2022marzo.ods"
with open(path_to_data, 'rb') as f:
    enc = chardet.detect(f.read()) 

df = pd.read_csv(path_to_data,encoding='latin1', delimiter=";")
df_dict = pd.read_excel(path_to_dict)
df_dict

#El encoding presenta problemas en signos de puntuacion, eso podria corregirse. 
# Existen valores que son float y deberian ser integer. Ejm: mes_fecha_inicio_teletrabajo

Al final, nuestro ecosistema de datos quedó de la siguiente manera:

WhatsApp Image 2022-06-23 at 1.46.45 AM

1 me gusta

Se encontro que en lo referente a la colocacion de creditos para Octubre 2021 la data solo contenia la descripcion de las variables tanto en los formatos csv como ods.
Por lo que se procedio a descartar la misma.

Uno de los errores que encontramos fue que los conjuntos de datos no se encontraban como tal en algunas temáticas que escogimos únicamente se encontraba el diccionario de datos. Otro de los errores era que varias columnas presentaban valores nulos. También, ciertas columnas se encontraba en formatos que no eran adecuados para los datos. Por citar un ejemplo, en el caso de la columna “año” se encontraron valores de tipo flotantes.