Skip to content

Commit

Permalink
Merge pull request #172 from datosgobar/164-robustecer-generacion-de-…
Browse files Browse the repository at this point in the history
…indicadores

164 robustecer generacion de indicadores
  • Loading branch information
lrromero committed Jun 26, 2018
2 parents f29e978 + e26620d commit d5fa1ad
Show file tree
Hide file tree
Showing 17 changed files with 47,716 additions and 319 deletions.
109 changes: 84 additions & 25 deletions pydatajson/indicators.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,18 @@ def generate_catalogs_indicators(catalogs, central_catalog=None,
if isinstance(catalogs, string_types + (dict,)):
catalogs = [catalogs]

# Leo todos los catálogos
catalogs = [readers.read_catalog(catalog) for catalog in catalogs]

indicators_list = []
# Cuenta la cantidad de campos usados/recomendados a nivel global
fields = {}
catalogs_cant = 0
for catalog in catalogs:
catalog = readers.read_catalog(catalog)
try:
catalog = readers.read_catalog(catalog)
catalogs_cant += 1
except Exception as e:
msg = u'Error leyendo catálogo de la lista: {}'.format(str(e))
logger.error(msg)
continue

fields_count, result = _generate_indicators(
catalog, validator=validator)
Expand All @@ -84,9 +88,13 @@ def generate_catalogs_indicators(catalogs, central_catalog=None,

# Indicadores de la red entera
network_indicators = {
'catalogos_cant': len(catalogs)
'catalogos_cant': catalogs_cant
}

if not indicators_list:
# No se pudo leer ningún catálogo
return [], {}

# Sumo los indicadores individuales al total
indicators_total = indicators_list[0].copy()
for i in range(1, len(indicators_list)):
Expand Down Expand Up @@ -143,7 +151,22 @@ def _federation_indicators(catalog, central_catalog):
central_catalog (str o dict): ruta a catálogo central, o un dict
con el catálogo ya parseado
"""
central_catalog = readers.read_catalog(central_catalog)
result = {
'datasets_federados_cant': None,
'datasets_no_federados_cant': None,
'datasets_federados_eliminados_cant': None,
'datasets_federados_eliminados': None,
'datasets_no_federados': None,
'datasets_federados': None,
'datasets_federados_pct': None
}
try:
central_catalog = readers.read_catalog(central_catalog)
except Exception as e:
msg = u'Error leyendo el catálogo central: {}'.format(str(e))
logger.error(msg)
return result

federados = 0 # En ambos catálogos
no_federados = 0
datasets_federados_eliminados_cant = 0
Expand Down Expand Up @@ -191,15 +214,15 @@ def _federation_indicators(catalog, central_catalog):
else:
federados_pct = 0

result = {
result.update({
'datasets_federados_cant': federados,
'datasets_no_federados_cant': no_federados,
'datasets_federados_eliminados_cant': datasets_federados_eliminados_cant,
'datasets_federados_eliminados': datasets_federados_eliminados,
'datasets_no_federados': datasets_no_federados,
'datasets_federados': datasets_federados,
'datasets_federados_pct': round(federados_pct, 2)
}
})
return result


Expand Down Expand Up @@ -229,7 +252,7 @@ def _network_indicator_percentages(fields, network_indicators):
total_pct = 100 * float(meta_ok) / (meta_error + meta_ok)
network_indicators['datasets_meta_ok_pct'] = round(total_pct, 2)

# % de campos recomendados y optativos utilizados en todo el catálogo
# % de campos recomendados y optativos utilizados en el catálogo entero
if fields: # 'fields' puede estar vacío si ningún campo es válido
rec_pct = 100 * float(fields['recomendado']) / \
fields['total_recomendado']
Expand Down Expand Up @@ -270,7 +293,20 @@ def _generate_status_indicators(catalog, validator=None):
dict: indicadores básicos sobre el catálogo, tal como la cantidad
de datasets, distribuciones y número de errores
"""
summary = generate_datasets_summary(catalog, validator=validator)
result = {
'datasets_cant': None,
'distribuciones_cant': None,
'datasets_meta_ok_cant': None,
'datasets_meta_error_cant': None,
'datasets_meta_ok_pct': None
}
try:
summary = generate_datasets_summary(catalog, validator=validator)
except Exception as e:
msg = u'Error generando resumen del catálogo {}: {}'.format(catalog['title'], str(e))
logger.error(msg)
return result

cant_ok = 0
cant_error = 0
cant_distribuciones = 0
Expand All @@ -286,13 +322,13 @@ def _generate_status_indicators(catalog, validator=None):
datasets_ok_pct = 0
if datasets_total:
datasets_ok_pct = round(100 * float(cant_ok) / datasets_total, 2)
result = {
result.update({
'datasets_cant': datasets_total,
'distribuciones_cant': cant_distribuciones,
'datasets_meta_ok_cant': cant_ok,
'datasets_meta_error_cant': cant_error,
'datasets_meta_ok_pct': datasets_ok_pct
}
})
return result


Expand All @@ -316,16 +352,31 @@ def _generate_date_indicators(catalog, tolerance=0.2, only_numeric=False):
Returns:
dict: diccionario con indicadores
"""
result = {}
result = {
'datasets_desactualizados_cant': None,
'datasets_actualizados_cant': None,
'datasets_actualizados_pct': None,
'catalogo_ultima_actualizacion_dias': None
}
if not only_numeric:
result.update({
'datasets_frecuencia_cant': None
})

dias_ultima_actualizacion = _days_from_last_update(
catalog, "modified")
if not dias_ultima_actualizacion:
try:
dias_ultima_actualizacion = _days_from_last_update(
catalog, "issued")
catalog, "modified")
if not dias_ultima_actualizacion:
dias_ultima_actualizacion = _days_from_last_update(
catalog, "issued")

result['catalogo_ultima_actualizacion_dias'] = \
dias_ultima_actualizacion

result['catalogo_ultima_actualizacion_dias'] = \
dias_ultima_actualizacion
except Exception as e:
msg = u'Error generando indicadores de fecha del catálogo {}: {}'.format(catalog['title'], str(e))
logger.error(msg)
return result

actualizados = 0
desactualizados = 0
Expand All @@ -350,11 +401,19 @@ def _generate_date_indicators(catalog, tolerance=0.2, only_numeric=False):
# Calculo el período de días que puede pasar sin actualizarse
# Se parsea el período especificado por accrualPeriodicity,
# cumple con el estándar ISO 8601 para tiempos con repetición
date = helpers.parse_date_string(dataset['modified'])
days_diff = float((datetime.now() - date).days)
interval = helpers.parse_repeating_time_interval(
periodicity) * \
(1 + tolerance)
try:
date = helpers.parse_date_string(dataset['modified'])
days_diff = float((datetime.now() - date).days)
interval = helpers.parse_repeating_time_interval(
periodicity) * \
(1 + tolerance)
except Exception as e:
msg = u'Error generando indicadores de fecha del dataset {} en {}: {}'
msg.format(dataset['identifier'], catalog['title'], str(e))
logger.error(msg)
# Asumo desactualizado
desactualizados += 1
continue

if days_diff < interval:
actualizados += 1
Expand Down Expand Up @@ -630,7 +689,7 @@ def _filter_by_likely_publisher(central_datasets, catalog_datasets):
publisher_names = [
catalog_dataset["publisher"]["name"]
for catalog_dataset in catalog_datasets
if "name" in catalog_dataset["publisher"]
if "name" in catalog_dataset.get("publisher", {})
]

filtered_central_datasets = []
Expand Down

0 comments on commit d5fa1ad

Please sign in to comment.