descripciones = {
    'P0813' : 'Homicidios Intencionales',
}

# Librerías utilizadas
import pandas as pd
import sys
import urllib
import os
import csv
import zipfile
from simpledbf import Dbf5
import matplotlib.pyplot as plt
%matplotlib inline

# Configuracion del sistema
print('Python {} on {}'.format(sys.version, sys.platform))
print('Pandas version: {}'.format(pd.__version__))
import platform; print('Running on {} {}'.format(platform.system(), platform.release()))

# URL Fuente
remote_path = r'http://www.beta.inegi.org.mx/contenidos/proyectos/registros/vitales/mortalidad/microdatos/defunciones/2016/defunciones_base_datos_2016_dbf.zip'

# Carpeta destino Local
local_path = r'D:\PCCS\00_RawData\01_CSV\INEGI\Defunciones\defunciones_base_datos_2016_dbf.zip'

"""
Explanation: Limpieza del dataset de Mortalidad de INEGI
1. Introduccion
Indicadores que salen de este dataset:
ID | DESCRIPCION
----- | --------------
P0813 | Homicidios Intencionales
End of explanation
"""


# Descarga de archivo
if os.path.isfile(local_path):
    print('Ya existe el archivo: {}'.format(local_path))
else:
    print('Descargando {} ... ... ... ... ... '.format(local_path))
    urllib.request.urlretrieve(remote_path, local_path) #
    print('se descargó {}'.format(local_path))

# Descompresión de archivo
target = r'D:\PCCS\00_RawData\01_CSV\INEGI\Defunciones'
descomprimir = zipfile.ZipFile(local_path, 'r')
print('Iniciando descompresión')
descomprimir.extractall(target)
descomprimir.close
print('Descompresión terminada en {}'.format(target))

# Listado de archivos
files = os.listdir(target)
x = 0
for file in files:
    print('{} - {}'.format(x, file))
    x += 1

# Se utilizará el dataset contenido en el archivo DEFUN16.dbf (Posición 5)
path_to_dbf = r'{}\{}'.format(target,files[5])
dataset = Dbf5(path_to_dbf, codec='mbcs').to_dataframe()
dataset.head()

len(dataset)

# Seleccion de variables
x = 0
for i in dataset:
    print('{} - {}'.format(x, i))
    x += 1

# lista de variables seleccionadas
Variables = [0, 1, 6, 7, 10, 12, 16, 24, 26, 30, 43, 54, 55]
Variables = list(list(dataset)[i] for i in Variables)
Variables

dataset = dataset[Variables]
dataset.head()

# Tipos de datos en variables
dataset.dtypes

"""
Explanation: Descarga de datos
Todos los datos se encuentran en un solo archivo
End of explanation
"""


years = sorted(dataset['ANIO_OCUR'].unique())

yearsize = {}
for year in years:
    yearsize[year] = len(dataset[dataset['ANIO_OCUR'] == year])

len(dataset)

# El set1 tiene la suma de las defunciones registradas entre 1923 y 1990
set1 = 0
for year in years:
    # print(year)
    if year > 1990:
        break
    set1 += yearsize[year]
set1

# El set 2 tiene la suma de las defunciones registradas entre 1991 y 2000
set2 = 0
for year in years:
    if year < 1991:
        continue
    if year > 2000:
        break
    # print(year)
    set2 += yearsize[year]
set2

yearsize2 = {'1923-1990':set1,
            '1991-2000':set2}
for year in years:
    if year < 2001:
        continue
    # print(year)
    yearsize2[str(year)] = yearsize[year]

# Numero de defunciones registradas en cada periodo
for k,v in yearsize2.items():
    print('{} : {}'.format(k, v))

"""
Explanation: Exploracion del Dataset
End of explanation
"""


#Subconjunto de años para el estudio
dataset = dataset.loc[dataset['ANIO_OCUR'].isin(range(2010, 2017))]

"""
Explanation: Subconjunto de trabajo
End of explanation
"""


# Subconjunto de homicidios (El identificador 2 corresponde a homicidios) 
dataset = dataset.loc[dataset['PRESUNTO'] == 2]

dataset.head()

for year in sorted(list(dataset['ANIO_OCUR'].unique())):
    print('{} : {}'.format(year, len(dataset[dataset['ANIO_OCUR'] == year])))

"""
Explanation: En el campo "PRESUNTO", la clave 2 identifica homicidios.
End of explanation
"""


len(dataset['CAUSA_DEF'].unique())

dataset['CAUSA_DEF'].unique()

# Se utilizará el dataset contenido en el archivo CATMINDE.dbf (Posición 3)
path_to_desc = r'{}\{}'.format(target,files[3])
descripciones = Dbf5(path_to_desc, codec='mbcs').to_dataframe()
descripciones.head()

#Asignacion de columna con descripciones de causa de defunción
dataframe = dataset.merge(descripciones, left_on='CAUSA_DEF', right_on = 'CLAVE')
dataframe.head()

"""
Explanation: Asignación de causas de defuncion
El dataset tiene identificadas 127 causas de defunción (Por homicidio, pues ya se identificaron únicamente los casos donde el PRESUNTO es homicidio)
End of explanation
"""


# Concatenar claves estatales y municipales para obtener CVE_MUN
# Municipio donde se registró el deceso
dataframe['CVE_MUN_REGIS'] = dataframe.ENT_REGIS.map(str)+dataframe.MUN_REGIS
# Municipio donde ocurrió el deceso
dataframe['CVE_MUN_OCURR'] = dataframe.ENT_OCURR.map(str)+dataframe.MUN_OCURR
# Municipio donde ocurrió la lesión que provocó el deceso
dataframe['CVE_MUN_OCULES'] = dataframe.ENT_OCULES.map(str)+dataframe.MUN_OCULES

dataframe.head()

# Eliminar columnas redundantes
del(dataframe['ENT_REGIS'])
del(dataframe['MUN_REGIS'])
del(dataframe['ENT_OCURR'])
del(dataframe['MUN_OCURR'])
del(dataframe['ENT_OCULES'])
del(dataframe['MUN_OCULES'])
del(dataframe['CLAVE'])

# Renombrar nombre de la causa de defuncion
dataframe.rename(columns={'NOMBRE' : 'NOMBRE_CAUSA_DEF'}, inplace = True)

# Se asigna el municipio de ocurrencia como indice de la tabla
dataframe.set_index('CVE_MUN_OCURR', inplace=True)
dataframe.head()

#Reordenar Columnas
list(dataframe)

# Metadatos estándar
metadatos = {
    'Nombre del Dataset': 'INEGI - Registros administrativos de mortalidad al año 2016',
    'Descripcion del dataset': 'Originalmente, el formato de captación para las defunciones generales era una boleta colectiva, en la cual las fuentes informantes reportaban las defunciones que registraban durante el mes. A partir del año 1987, el formato principal es el certificado o acta de defunción y el cuaderno para defunciones accidentales y violentas del Ministerio Público.',
    'Disponibilidad Temporal': '1923 a 2016',
    'Periodo de actualizacion': 'Anual',
    'Nivel de Desagregacion': 'Caso',
    'Notas': None,
    'Fuente': 'INEGI',
    'URL_Fuente': 'http://www.beta.inegi.org.mx/proyectos/registros/vitales/mortalidad/',
    'Dataset base': None,
}

metadatos = pd.DataFrame.from_dict(metadatos, orient='index', dtype=None)
metadatos.columns = ['Descripcion']
metadatos = metadatos.rename_axis('Metadato')
metadatos

variables = {
    'ENT_REGIS': 'Entidad de registro.',
    'MUN_REGIS': 'Municipio de registro.',
    'ENT_OCURR': 'Entidad de ocurrencia.',
    'MUN_OCURR': 'Municipio de ocurrencia.',
    'CAUSA_DEF': 'Causa de la defunción (clave).',
    'SEXO': 'Sexo del (la) fallecido (a).\n'
            '1: Hombre\n'
            '2: Mujer\n'
            '9: No especificado',
    'ANIO_OCUR': 'Año de ocurrencia.',
    'ESCOLARIDA': 'Nivel de escolaridad del (la) fallecido (a) (escolaridad).\n'
                    '1: Sin escolaridad\n'
                    '2: Preescolar\n'
                    '3: Primaria incompleta\n'
                    '4: Primaria completa\n'
                    '5: Secundaria incompleta\n'
                    '6: Secundaria completa\n'
                    '7: Bachillerato o preparatoria incompleto\n'
                    '8: Bachillerato o preparatoria completo\n'
                    '9: Profesional\n'
                    '10: Posgrado\n'
                    '88: No aplica a menores de 3 años\n'
                    '99: No especificado',
    'PRESUNTO': 'Tipo de defunción (presunto). 2: Homicidio',
    'ASIST_MEDI': 'Condición de atención médica.\n'
                '1: Con Asistencia Medica\n'
                '2: Sin Asistencia Medica\n'
                '9: No especificada',
    'VIO_FAMI': 'Condición de violencia familiar.\n'
            '1: Hubo violencia familiar\n'
            '2: No hubo violencia familiar\n'
            '2: No aplica cuando no es homicidio\n'
            '9: No especificado',
    'ENT_OCULES': 'Entidad de ocurrencia de la lesión.',
    'MUN_OCULES': 'Municipio de ocurrencia de la lesión.',
}


variables = pd.DataFrame.from_dict(variables, orient='index', dtype=None)
variables.columns = ['Descripcion']
variables = variables.rename_axis('Mnemonico')
variables

variables['VIO_FAMI']

# Guardar el dataset
file = r'D:\PCCS\01_Dmine\Datasets\INEGI\Defunciones\defunciones.xlsx'
writer = pd.ExcelWriter(file)
dataframe.to_excel(writer, sheet_name = 'DATOS')
metadatos.to_excel(writer, sheet_name = 'METADATOS')
variables.to_excel(writer, sheet_name = 'VARIABLES')
writer.save()
print('---------------TERMINADO---------------')

"""
Explanation: Creación del dataset estándar y exportación a Excel
End of explanation
"""


