<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Limpieza de dataset del Censo Nacional de Gobiernos Municipales y Delegacionales 2015
1. Introduccion
Indicadores que salen de este dataset
Step1:  En el caso del parámetro P1003, los datos se extraen desde 3 archivos. Estos archivos son una base de datos para cada servicio relacionado con los RSU, Utilizando nuevamente el archivo que utiliza P1001 y dos adicionales
Step2:  Construccion de datasets estándar
Los datasets para cada parámetro surgen de diferentes preguntas del censo por lo que sus estructuras son muy desemejantes, razon por la cual
Step3:  P0306 - Programas de modernización catastral
Existencia de programas de modernización catastral en los municipios.
Step4:  El archivo está estructurado de manera inconveniente, teniendo un renglón para cada variable. Lo conveniente es que cada renglón contenga toda la información de un solo municipio.
Step5:  Para corregirlo, primero hacemos dataframes separados para cada variable. Afortunadamente, la columna 'Estructu' sirve para agrupar estructuralmente el dataframe
Step6:  Se reemplazarán numeros por descripciones en tip_inst
Step7:  Y se separará la columna 'inst_enc' en 2
Step8:  Finalmente, se unirán todas las series en un solo dataframe
Step9:  Metadatos para P0306
Step10:  EXPORTAR A EXCEL
Step11:  P0307
Step12:  El contenido de los archivos en la carpeta "Conjunto de datos" es el siguiente
Step13:  La información para el parámetro P0307 se encuentra en el archivo M_REGULA.csv
Step14:  ¿Dónde están los datos sobre desarrollo urbano y ordenamiento territorial?
Step15:  Los datos de DU y OT estan en la columna TEMA_NIS. El código 41 en esta column indica DU y OT
Step16:  Exportar archivo
Step17:  P1001 - Promedio diario de RSU recolectados
Step18:  ¿Donde estan los datos?
Step19:  Los datos se encuentran en el archivo secc_i_tr_cngmd15_m6, en la columna P2_2
Step20:  Exportar archivos
Step21:  P1006 - Número de municipios con aplicación de programas locales orientados a la GIRSU
Step22:  ¿Donde estan los datos?
El archivo secc_v_tr_cngmd15_m6.csv Contiene variables que caracterizan a los municipios de acuerdo a los programas orientados a la gestión integral de los residuos sólidos urbanos, durante el año 2014. En este archivo, la columna P13 Indica si se cuenta con algún programa orientado a la gestión integral de residuos sólidos urbanos (1 = Cuenta con Programas; 2 = No cuenta con programas).
El archivo secc_v_tr_cngmd15_m6_p13_1.csv Contiene la variable P13_1_1_2, que indica el tipo de programa orientado a la gestión integral de residuos sólidos urbanos.
Step23:  Exportar Archivos
Step24:  P1009 - Número de municipios con estudios de generación de RSU
Step25:  ¿Donde están los datos?
secc_iv_tr_cngmd15_m6 Contiene variables que caracterizan a los municipios de acuerdo a los estudios sobre la generación y composición de los residuos sólidos urbanos, durante el año 2014. 
La columna P12 Indica si se cuenta con algún estudio sobre la generación de residuos sólidos urbanos (1 = Si; 2 = No).
Step26:  Exportar archivos
Step27:  P1003 - Número de municipios con disponibilidad de servicios relacionados con los RSU
¿Donde estan los datos?
La informacion de este parametro se encuentra dividida entre diferentes carpetas.
Step28:  La Carpeta 1 Contiene 2 archivos
Step29:  Exportar archivos
Step30:  P1005 - Número de vehículos utilizados para la recolección de residuos sólidos urbanos
¿Donde están los datos?
La Carpeta 1 de P1003 (Procesada previamente) contiene 2 archivos
Step31:  Exportar archivos
<ASSISTANT_TASK:>
Python Code:
descripciones = {
'P0306' : 'Programas de modernización catastral',
'P0307' : 'Disposiciones normativas sustantivas en materia de desarrollo urbano u ordenamiento territorial',
'P1001' : 'Promedio diario de RSU recolectados',
'P1003' : 'Número de municipios con disponibilidad de servicios relacionados con los RSU',
'P1006' : 'Número de municipios con aplicación de programas locales orientados a la GIRSU',
'P1009' : 'Número de municipios con estudios de generación de RSU',
}
# Librerias utilizadas
import pandas as pd
import sys
import urllib
import os
import zipfile
import csv
import pprint
import re
# 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()))
root = r'http://www.beta.inegi.org.mx/contenidos/proyectos/censosgobierno/municipal/cngmd/2015/datosabiertos/'
links = {
    'P0306' : r'm1/Programa_modernizacion_catastral_cngmd2015_csv.zip', # Programas de modernización catastral
    'P0307' : r'm2/Marco_regulatorio_cngmd2015_csv.zip', # Disposiciones normativas sustantivas en materia de desarrollo urbano u ordenamiento territorial
    'P1001' : r'm6/Rec_RSU_cngmd2015_csv.zip', # Promedio diario de RSU recolectados
    'P1006' : r'm6/Prog_gest_int_RSU_cngmd2015_csv.zip', # Número de municipios con aplicación de programas locales orientados a la GIRSU
    'P1009' : r'm6/Est_gen_comp_RSU_cngmd2015_csv.zip', # Número de municipios con estudios de generación de RSU
}
Explanation: Limpieza de dataset del Censo Nacional de Gobiernos Municipales y Delegacionales 2015
1. Introduccion
Indicadores que salen de este dataset:
ID |Descripción
---|:----------
P0306|Programas  de modernización catastral 
P0307|Disposiciones normativas sustantivas en materia de desarrollo urbano u ordenamiento territorial 
P1001|Promedio diario de RSU recolectados
P1003|Número de municipios con disponibilidad de servicios relacionados con los RSU
P1006|Número de municipios con aplicación de programas locales orientados a la GIRSU
P1009|Número de municipios con estudios de generación de RSU
2. Descarga de datos
End of explanation
P1003links = { # Número de municipios con disponibilidad de servicios relacionados con los RSU
    1 : r'm6/Rec_RSU_cngmd2015_csv.zip',
    2 : r'm6/Trat_RSU_cngmd2015_csv.zip',
    3 : r'm6/Disp_final_RSU_cngmd2015_csv.zip'
}
# Destino local
destino = r'D:\PCCS\00_RawData\01_CSV\cngmd\2015'
# Descarga de zips para parametros que se encuentran en un solo archivo
m_archivos = {}   # Diccionario para guardar memoria de descarga
for parametro, fuente in links.items():
    file = fuente.split('/')[1]
    remote_path = root+fuente
    local_path = destino + r'\{}'.format(file)
    if os.path.isfile(local_path):
        print('Ya existe el archivo: {}'.format(local_path))
        m_archivos[parametro] = local_path
    else:
        print('Descargando {} ... ... ... ... ... '.format(local_path))
        urllib.request.urlretrieve(remote_path, local_path) #
        m_archivos[parametro] = local_path
        print('se descargó {}'.format(local_path))
    
# Descarga de zips para parametro P1003
m_archivos2 = {}   # Diccionario para guardar memoria de descarga
for parametro, fuente in P1003links.items():
    file = fuente.split('/')[1]
    remote_path = root+fuente
    local_path = destino + r'\{}'.format(file)
    if os.path.isfile(local_path):
        print('Ya existe el archivo: {}'.format(local_path))
        m_archivos2[parametro] = local_path
    else:
        print('Descargando {} ... ... ... ... ... '.format(local_path))
        urllib.request.urlretrieve(remote_path, local_path) #
        m_archivos2[parametro] = local_path
        print('se descargó {}'.format(local_path))
    
# Descompresión de archivos de m_parametro
unzipped = {}
for parametro, comprimido in m_archivos.items():
    target = destino + '\\' + parametro
    if os.path.isfile(target):
        print('Ya existe el archivo: {}'.format(target))
        unzipped[parametro] = target
    else:
        print('Descomprimiendo {} ... ... ... ... ... '.format(target))
        descomprimir = zipfile.ZipFile(comprimido, 'r')
        descomprimir.extractall(target)
        descomprimir.close
        unzipped[parametro] = target
        
# Descompresión de archivos de m_parametro2
unzipped2 = {}
for parametro, comprimido in m_archivos2.items():
    target = destino + '\\P1003\\' + str(parametro)
    if os.path.isfile(target):
        print('Ya existe el archivo: {}'.format(target))
        unzipped2[parametro] = target
    else:
        print('Descomprimiendo {} ... ... ... ... ... '.format(target))
        descomprimir = zipfile.ZipFile(comprimido, 'r')
        descomprimir.extractall(target)
        descomprimir.close
        unzipped2[parametro] = target
        
# Localizacion de archivos de cada parametro
# Cada parametro tiene rutas y estructuras distintas. En este paso localizo manualmente 
# cada tabla y estructura desde los comprimidos. cada valor del diccionario contiene la ruta hacia
# donde se encuentran las tablas.
cd = r'\conjunto_de_datos'
tablas = {
    'P0306' : destino + r'\P0306' + cd,
    'P0307' : destino + r'\P0307\marco_regulatorio_cngmd2015_dbf' + cd,
    'P1001' : destino + r'\P1001\Rec_RSU_cngmd2015_csv' + cd,
    'P1006' : destino + r'\P1006\Prog_gest_int_RSU_cngmd2015_csv' + cd,
    'P1009' : destino + r'\P1009\Est_gen_comp_RSU_cngmd2015_csv' + cd,
}
# Tablas para P1003
destino2 = destino + r'\P1003'
tablasP1003 = {
    '1' : destino2 + r'\1' + r'\Rec_RSU_cngmd2015_csv' + cd,
    '2' : destino2 + r'\2' + r'\Trat_RSU_cngmd2015_csv' + cd,
    '3' : destino2 + r'\3' + r'\Disp_final_RSU_cngmd2015_csv' + cd,
}
Explanation: En el caso del parámetro P1003, los datos se extraen desde 3 archivos. Estos archivos son una base de datos para cada servicio relacionado con los RSU, Utilizando nuevamente el archivo que utiliza P1001 y dos adicionales:
End of explanation
# Script para extraer metadatos:
def getmeta(path, charcoding):   # Path es el contenido en las variables 'tablas' para cada parametro
    cat = r'\catalogos'
    dic = r'\diccionario_de_datos'
    metadict = {}
    metapath = path.replace(cd, cat)
    metafiles = os.listdir(metapath)
    dicdict = {}
    dicpath = path.replace(cd, dic)
    dicfiles = os.listdir(dicpath)
    for file in metafiles:
        variable = file.replace('.csv', '')
        if file.endswith('.csv'):
            csvpath = metapath+'\\'+file
            metadf = pd.DataFrame.from_csv(csvpath, parse_dates=False)
            try:
                metadf.index = metadf.index.map(str.lower)
            except:
                pass
            metadict[variable] = metadf
        else:
            dothis = input('El archivo {} no es csv, que deseas hacer? [DD]etener [CC]ontinuar'.format(file))
            dothis = dothis.lower()
            if dothis == 'dd':
                raise GeneratorExit('Script detenido por el usuario')
            elif dothis == 'cc':
                continue
            else:
                raise KeyError('No entendi la instruccion {}'.format(dothis))
    for file in dicfiles:
        if file.endswith('.csv'):
            filename = file.replace('.csv', '')
            csvpath = dicpath+'\\'+file
            try:
                dicdf = pd.read_csv(csvpath, skiprows=2, usecols=[1, 2], index_col=0, parse_dates=False).dropna()
            except:
                dicdf = pd.read_csv(csvpath, skiprows=2, usecols=[1, 2], index_col=0, parse_dates=False, encoding = charcoding).dropna()
            dicdf.index = dicdf.index.map(str.lower)
            dicdict[filename] = dicdf
    
    return dicdict, metadict
# Funcion para revisar metadatos
def queryvar(var, tablelen=10, colprint = 125, dictio = p0306dic, metadat = p0306meta):
    pdefault = pd.get_option('display.max_colwidth')
    pd.set_option('display.max_colwidth', colprint)   # Expande el espacio para imprimir columnas
    print('"{}" :\n{}'.format(var, dictio.loc[var][0].upper()))
    if len(metadat[var]) > tablelen:
        print('{}\nImprimiendo {} de {} registros'.format('-'*40,tablelen, len(metadat[var])))
    print(metadat[var].head(tablelen))
    pd.set_option('display.max_colwidth', pdefault)   # Regresa la variable de impresion de columnas a su default
Explanation: Construccion de datasets estándar
Los datasets para cada parámetro surgen de diferentes preguntas del censo por lo que sus estructuras son muy desemejantes, razon por la cual:
(1) : Cada parámetro tiene que procesarse individualmente.
(2) : Es conveniente extraer de manera individual los metadatos de cada parámetro. Con este propósito, el siguiente script sirve para extraer los metadatos de cada dataset:
End of explanation
# Creacion de diccionarios con metadatos para cada variable de P0306:
par = 'P0306'
p0306dic, p0306meta = getmeta(tablas['P0306'], 'mbcs')
print('Se extrajeron metadatos para las siguientes variables de {}:'.format(par))
for key in p0306meta.keys(): print(key)
print('\nDiccionarios disponibles para {}:'.format(par))
for key in p0306dic.keys(): print(key)
# Para P0306, solo existe una tabla de descripciones por lo que se convierte a un dataframe unico para poder indexar
p0306dic = p0306dic['diccionario_de_datos_programa_modernizacion_catastral_cngmd2015_dbf']
p0306dic
list(p0306dic.index)
queryvar('acc_modr')
print('** Descripciones de variables **\n'.upper())
for i in p0306dic.index:
    queryvar(i)
    print('\n')
# Carga de datos
P0306f = tablas['P0306']+'\\'+os.listdir(tablas['P0306'])[0]
df = pd.read_csv(P0306f, dtype={'ubic_geo':'str'})
df = df.rename(columns = {'ubic_geo':'CVE_MUN'})
df.set_index('CVE_MUN', inplace = True)
P0306 = df.where((pd.notnull(df)), None)
Explanation: P0306 - Programas de modernización catastral
Existencia de programas de modernización catastral en los municipios.
End of explanation
# subset para pruebas
test = P0306.loc['15045']
test
Explanation: El archivo está estructurado de manera inconveniente, teniendo un renglón para cada variable. Lo conveniente es que cada renglón contenga toda la información de un solo municipio.
End of explanation
queryvar('estructu')
# ¿El municipio cuenta con un programa de modernización catastral?
P0306_00 = P0306[P0306['estructu'] == 240500]['prog_mod'].astype('int')
print(P0306_00.head(10))
print('-'*50)
queryvar('prog_mod')
# ¿En que periodo se realizaron las acciones del programa de modernización catastral?
P0306_03 = P0306[P0306['estructu'] == 240503]['perio_ac'].astype('int')
print(P0306_03.head(10))
print('-'*50)
queryvar('perio_ac')
# ¿Qué acciones se realizaron?
P0306_02 = P0306[P0306['estructu'] == 240502]['acc_modr'].astype('int').groupby('CVE_MUN').apply(list)
print(P0306_02.head(10))
queryvar('acc_modr')
# ¿Cuantas acciones se realizaron?
P0306_02b = P0306_02.apply(len).rename('n_acc_modr')
P0306_02b.head(10)
queryvar('inst_enc')
# ¿Que instituciones se han involucrado en la modernizacion catastral, y de qué manera?
P0306_01t = P0306[P0306['estructu'] == 240501][['inst_enc', 'tip_inst']]    # tipo de apoyo e institucion 
P0306_01t.head()
Explanation: Para corregirlo, primero hacemos dataframes separados para cada variable. Afortunadamente, la columna 'Estructu' sirve para agrupar estructuralmente el dataframe
End of explanation
queryvar('tip_inst')
# Institucion involucrada
instit = {
    1:'Administración pública de la entidad federativa',
    2:'BANOBRAS',
    3:'SEDATU',
    4:'OTRA INSTITUCION'
}
P0306_01t['tip_inst'] = P0306_01t['tip_inst'].replace(instit)
P0306_01t.head()
Explanation: Se reemplazarán numeros por descripciones en tip_inst:
End of explanation
queryvar('inst_enc')
P0306_01t1 = P0306_01t[P0306_01t['inst_enc'] == 1]['tip_inst'].groupby('CVE_MUN').apply(list).rename('i_coord_ejecuta')
P0306_01t2 = P0306_01t[P0306_01t['inst_enc'] == 2]['tip_inst'].groupby('CVE_MUN').apply(list).rename('i_otorga_apoyos')
P0306_01t1.head()
P0306_01t2.head()
Explanation: Y se separará la columna 'inst_enc' en 2:
End of explanation
# Convertir series en Dataframes
P0306_00 = P0306_00.to_frame()
P0306_03 = P0306_03.to_frame()
P0306_02 = P0306_02.to_frame()
P0306_02b = P0306_02b.to_frame()
P0306_01t1 = P0306_01t1.to_frame()
P0306_01t2 = P0306_01t2.to_frame()
# Unir dataframes
P0306 = P0306_00.join(P0306_03).join(P0306_02).join(P0306_02b).join(P0306_01t1).join(P0306_01t2)
P0306 = P0306.where((pd.notnull(P0306)), None)
P0306.head()
Explanation: Finalmente, se unirán todas las series en un solo dataframe
End of explanation
P0306meta = {
    'Nombre del Dataset' : 'Censo Nacional de Gobiernos Municipales y Delegacionales 2015',
    'Descripcion del dataset' : 'Censo Nacional de Gobiernos Municipales y Delegacionales 2015',
    'Disponibilidad Temporal' : '2015',
    'Periodo de actualizacion' : 'Bienal',
    'Nivel de Desagregacion' : 'Municipal',
    'Notas' : 's/n',
    'Fuente' : 'INEGI',
    'URL_Fuente' : 'http://www.beta.inegi.org.mx/contenidos/proyectos/censosgobierno/municipal/cngmd/2015/datosabiertos/',
    'Dataset base' : '"P0306.xlsx" disponible en \nhttps://github.com/INECC-PCCS/01_Dmine/tree/master/Datasets/CNGMD/2015',
}
P0306meta = pd.DataFrame.from_dict(P0306meta, orient='index', dtype=None)
P0306meta.columns = ['Descripcion']
P0306meta = P0306meta.rename_axis('Metadato')
P0306meta
list(P0306meta)
P0306.head()
Explanation: Metadatos para P0306
End of explanation
file = r'D:\PCCS\01_Dmine\Datasets\CNGMD\P0306.xlsx'
writer = pd.ExcelWriter(file)
P0306.to_excel(writer, sheet_name = 'P0306')
P0306meta.to_excel(writer, sheet_name ='METADATOS')
writer.save()
Explanation: EXPORTAR A EXCEL
End of explanation
# Redefinición de la función para revisar metadatos, porque los datos de la carpeta 'catálogos' de P0307 
# no coinciden con los titulos de las columnas en la carpeta 'Conjunto de datos'.
def getmetab(csvpath, textcoding):
    # Importa el csv
    try: dicdf = pd.read_csv(csvpath, 
                    index_col=0, 
                    parse_dates=False
                   )
    except: dicdf = pd.read_csv(csvpath, 
                    index_col=0, 
                    parse_dates=False, 
                    encoding = textcoding,
                   )
    
    # Renombra las columnas
    dicdf.columns = list(dicdf.iloc[1])
    
    # Crea columna con el indice
    dicdf['text_arc'] = dicdf.index
    # Extrae el nombre del csv fuente en una columna independiente
    def getarc(x):
        try: return re.search('(?<=(o: ))([A-Z])\w+', x).group()
        except: return None
    dicdf['arc'] = dicdf['text_arc'].apply(lambda x: getarc(x))
    # Extrae la descripcion del archivo en una columna independiente
    def getdescarc(x):
        try: return re.search('\(([^)]+)\)', x).group(1)
        except: return None
    dicdf['desc_arc'] = dicdf['text_arc'].apply(lambda x: getdescarc(x))
    
    # Marca columnas que se van a eliminar (Las columnas de donde se sacaron las variables 'arc' y 'desc_arc')
    dicdf['delete1'] = dicdf[list(dicdf.columns)[1:6]].notnull().sum(axis = 1)
    
    # Rellenar valores NaN
    dicdf = dicdf.fillna(method='ffill')
    
    # Eliminar valores marcados previaente
    dicdf = dicdf[dicdf.delete1 != 0]
    
    # Eliminar encabezados de columna repetidos
    dicdf = dicdf[dicdf.Descripción != 'Descripción']
    
    # Asignar nuevo indice y eliminar columna 'arc'
    dicdf = dicdf.set_index('arc')
    
    # Elimina columna delete1
    del dicdf['delete1']
    
    # Renombra la columna de descripciones de codigos
    dicdf.columns.values[5] = 'Descripcion codigos'
    
    # Dame el DataFrame
    return dicdf
# También es necesario redefinir la función para hacer consultas a los metadatos
def queryvar(filename, var = '', tablelen=10, colprint = 125, dictio = metadatos):
    pdefault = pd.get_option('display.max_colwidth')
    pd.set_option('display.max_colwidth', colprint)   # Expande el espacio para imprimir columnas
    frame = dictio.loc[filename]
    print('Archivo "{}.csv" {}'.format(filename, '-'*30))   # Muestra el nombre del archivo
    print(frame.iloc[0]['desc_arc'])                     # Muestra la descripcion del archivo
    if var == '': pass
    else:
        print('\n{}{}'.format(var.upper(), '-'*30))                  # Muestra el nombre de la variable
        varframe = frame[frame['Nombre de la \ncolumna'] == var.upper()]   # Haz un subset con los datos de la variable
        varframe = varframe.set_index('Códigos válidos en la columna')
        print(varframe['Descripción'][0])                    # Muestra la descripcion de la variable
        print(varframe[['Descripcion codigos']])             # Imprime las descripciones de codigos
csvpath = r'D:\PCCS\00_RawData\01_CSV\cngmd\2015\P0307\marco_regulatorio_cngmd2015_dbf\diccionario_de_datos\diccionario_de_datos_marco_regulatorio_cngmd2015.csv'
metadatos = getmetab(csvpath, 'mbcs')
# Definición de rutas de archivos
par = 'P0307'
P0307files = {}
for file in os.listdir(tablas[par]):
    P0307files[file.replace('.csv', '')] = tablas[par]+'\\'+file
Explanation: P0307: Disposiciones normativas sustantivas en materia de desarrollo urbano u ordenamiento territorial
Es necesario cambiar el encoding para leer los archivos de este parametro
End of explanation
for file in P0307files.keys():
    print(file)
    queryvar(file.upper())
    print('\n')
Explanation: El contenido de los archivos en la carpeta "Conjunto de datos" es el siguiente:
End of explanation
print('P0307 - {}\n'.format(descripciones['P0307']))
queryvar('m_regula'.upper())
# Carga de datos
P0307f = tablas['P0307']+'\\'+ os.listdir(tablas['P0307'])[4]
df = pd.read_csv(P0307f, dtype={'ubic_geo':'str'})
df = df.rename(columns = {'ubic_geo':'CVE_MUN'})
df.set_index('CVE_MUN', inplace = True)
P0307 = df.where((pd.notnull(df)), None)
P0307.head()
P0307.columns
Explanation: La información para el parámetro P0307 se encuentra en el archivo M_REGULA.csv
End of explanation
queryvar('m_regula'.upper(), 'tema_nis')
Explanation: ¿Dónde están los datos sobre desarrollo urbano y ordenamiento territorial?
End of explanation
P0307 = P0307[P0307['tema_nis'] == 41]
P0307.head()
# Quita las columnas que estén vacías
P0307 = P0307.dropna(axis=1, how = 'all')
P0307.head()
# Metadatos
meta = P0306meta
meta.at['Dataset base','Descripcion'] = meta.at['Dataset base','Descripcion'].replace('P0306', 'P0307')
meta
Explanation: Los datos de DU y OT estan en la columna TEMA_NIS. El código 41 en esta column indica DU y OT
End of explanation
par = 'P0307'
file = r'D:\PCCS\01_Dmine\Datasets\CNGMD'+'\\'+par+'.xlsx'
writer = pd.ExcelWriter(file)
P0307.to_excel(writer, sheet_name = par)
meta.to_excel(writer, sheet_name ='METADATOS')
writer.save()
Explanation: Exportar archivo
End of explanation
# Rutas de archivos
param = 'P1001'
rutadatos = tablas[param]
rutameta = tablas[param].replace('conjunto_de_datos', 'diccionario_de_datos')
rutameta = rutameta + '\\' + os.listdir(rutameta)[0]
print('{}\n{}'.format(rutadatos, rutameta))
# Obtencion de metadatos
# Cada hoja de metadatos es muy muy similar, pero con muy ligeras variaciones
# La unica parte del proceso que es seguro automatizar es la importación del archivo hacia Python
def getmeta(csvpath, textcoding):
    # Importa el csv
    try: 
        dicdf = pd.read_csv(csvpath, 
                    index_col=0, 
                    parse_dates=False
                   )
    except: 
        dicdf = pd.read_csv(csvpath, 
                    index_col=0, 
                    parse_dates=False, 
                    encoding = textcoding,
                   )
    
    # Renombra las columnas
    dicdf.columns = list(dicdf.iloc[1])
    
    # Dame el archivo
    return dicdf
os.listdir(r'D:\PCCS\00_RawData\01_CSV\cngmd\2015\P1001\Rec_RSU_cngmd2015_csv\diccionario_de_datos')
metadatos = getmeta(rutameta, 'mbcs')
# Crea columna con el indice
metadatos['Nombre de la \ncolumna'] = metadatos.index
# Extrae el nombre del csv fuente en una columna independiente
def getarc(x):
    try: return x.split(' ')[1]
    except: return None
metadatos['archivo'] = metadatos['Nombre de la \ncolumna'].apply(getarc)
# Extrae la descripcion del archivo en una columna independiente
def getdescarc(x):
    try: return x.split('(')[1].replace(')','')
    except: return None
metadatos['desc_arc'] = metadatos['Nombre de la \ncolumna'].apply(getdescarc)
# En la columna 'arc', reemplaza las celdas cuyo valor es 'de'
metadatos['archivo'] = metadatos['archivo'].replace({'de':None})
# Marca columnas que se van a eliminar (Las columnas de donde se sacaron las variables 'arc' y 'desc_arc')
metadatos['delete1'] = metadatos[list(metadatos.columns)[1:6]].notnull().sum(axis = 1)
# Rellenar valores NaN
metadatos = metadatos.fillna(method='ffill')
# Eliminar valores marcados previaente
metadatos = metadatos[metadatos.delete1 != 0]
# Eliminar columnas sin datos
metadatos = metadatos.dropna(axis = 1, how = 'all')
# Eliminar encabezados de columna repetidos
metadatos = metadatos[metadatos.Descripción != 'Descripción']
# Asignar nuevo indice y eliminar columna 'text_arc'
metadatos = metadatos.set_index('archivo')
# Elimina columna delete1
del metadatos['delete1']
# Renombra la columna de descripciones de codigos
metadatos.columns.values[3] = 'Descripcion codigos'
# Reordena las columnas
neworder = ['Nombre de la \ncolumna', 'Descripción', 'Tipo de dato', 'Rango válido', 'Descripcion codigos', 
            'Pregunta textual', 'Página de Cuestionario', 'Definición', 'desc_arc']
metadatos = metadatos.reindex(columns= neworder)
# Renombra las columnas para que funcionen con queryvar
metadatos = metadatos.rename({'Rango válido':'Códigos válidos en la columna'})
metadatos.head(3)
Explanation: P1001 - Promedio diario de RSU recolectados
End of explanation
metadatos.loc['secc_i_tr_cngmd15_m6'][metadatos.loc['secc_i_tr_cngmd15_m6']['Nombre de la \ncolumna'] == 'P2_2']
Explanation: ¿Donde estan los datos?
End of explanation
# Definición de rutas a archivos de datos
Paramfiles = {}
for file in os.listdir(rutadatos):
    Paramfiles[file.replace('.csv', '')] = rutadatos+'\\'+file
for file, path in Paramfiles.items():
    print('{}:\n{}\n'.format(file, path))
# Carga de datos
P1001f = tablas[param]+'\\'+ os.listdir(tablas[param])[0]
df = pd.read_csv(P1001f, dtype={'folio':'str'}, encoding = 'mbcs')
df = df.rename(columns = {'folio':'CVE_MUN'})
df.set_index('CVE_MUN', inplace = True)
P1001 = df.where((pd.notnull(df)), None)
P1001.head(1)
P1001 = P1001['p2_2'].to_frame()
P1001.head(1)
Explanation: Los datos se encuentran en el archivo secc_i_tr_cngmd15_m6, en la columna P2_2
End of explanation
# Metadatos
meta = meta           # Utiliza el archivo de metadatos que habías definido anteriormente
meta.at['Dataset base','Descripcion'] = '"P1001.xlsx" disponible en \nhttps://github.com/INECC-PCCS/01_Dmine/tree/master/Datasets/CNGMD/2015'
meta.at['Notas','Descripcion'] = 'p2_2: Cantidad de residuos sólidos recolectada en kilogramos.'
meta
file = r'D:\PCCS\01_Dmine\Datasets\CNGMD'+'\\'+param+'.xlsx'
writer = pd.ExcelWriter(file)
P1001.to_excel(writer, sheet_name = param)
meta.to_excel(writer, sheet_name ='METADATOS')
writer.save()
Explanation: Exportar archivos
End of explanation
# Rutas de archivos
param = 'P1006'
rutadatos = tablas[param]
rutameta = tablas[param].replace('conjunto_de_datos', 'diccionario_de_datos')
rutameta = rutameta + '\\' + os.listdir(rutameta)[0]
print('{}\n{}'.format(rutadatos, rutameta))
Explanation: P1006 - Número de municipios con aplicación de programas locales orientados a la GIRSU
End of explanation
# Definición de rutas a archivos de datos
Paramfiles = {}
for file in os.listdir(rutadatos):
    Paramfiles[file.replace('.csv', '')] = rutadatos+'\\'+file
for file, path in Paramfiles.items():
    print('{}:\n{}\n'.format(file, path))
os.listdir(tablas[param])[0]
# Carga de datos
P1006f = tablas[param]+'\\'+ os.listdir(tablas[param])[0]
df = pd.read_csv(P1006f, dtype={'folio':'str'}, encoding = 'mbcs')
df = df.rename(columns = {'folio':'CVE_MUN'})
df.set_index('CVE_MUN', inplace = True)
P1006 = df.where((pd.notnull(df)), None)
Explanation: ¿Donde estan los datos?
El archivo secc_v_tr_cngmd15_m6.csv Contiene variables que caracterizan a los municipios de acuerdo a los programas orientados a la gestión integral de los residuos sólidos urbanos, durante el año 2014. En este archivo, la columna P13 Indica si se cuenta con algún programa orientado a la gestión integral de residuos sólidos urbanos (1 = Cuenta con Programas; 2 = No cuenta con programas).
El archivo secc_v_tr_cngmd15_m6_p13_1.csv Contiene la variable P13_1_1_2, que indica el tipo de programa orientado a la gestión integral de residuos sólidos urbanos.
End of explanation
P1006 = P1006['p13'].to_frame()
# Metadatos
meta = meta           # Utiliza el archivo de metadatos que habías definido anteriormente
meta.at['Dataset base','Descripcion'] = '"P1006.xlsx" disponible en \nhttps://github.com/INECC-PCCS/01_Dmine/tree/master/Datasets/CNGMD/2015'
meta.at['Notas','Descripcion'] = 'En la columna p13, ¿El municipio cuenta con Programas de Gestion de Residuos? 1: Si, 2: No'
meta
file = r'D:\PCCS\01_Dmine\Datasets\CNGMD'+'\\'+param+'.xlsx'
writer = pd.ExcelWriter(file)
P1006.to_excel(writer, sheet_name = param)
meta.to_excel(writer, sheet_name ='METADATOS')
writer.save()
Explanation: Exportar Archivos
End of explanation
# Rutas de archivos
param = 'P1009'
rutadatos = tablas[param]
rutameta = tablas[param].replace('conjunto_de_datos', 'diccionario_de_datos')
rutameta = rutameta + '\\' + os.listdir(rutameta)[0]
print('{}\n{}'.format(rutadatos, rutameta))
Explanation: P1009 - Número de municipios con estudios de generación de RSU
End of explanation
# Definición de rutas a archivos de datos
Paramfiles = {}
for file in os.listdir(rutadatos):
    Paramfiles[file.replace('.csv', '')] = rutadatos+'\\'+file
for file, path in Paramfiles.items():
    print('{}:\n{}\n'.format(file, path))
# Carga de datos
P1009f = tablas[param]+'\\'+ os.listdir(tablas[param])[0]
df = pd.read_csv(P1009f, dtype={'folio':'str'}, encoding = 'mbcs')
df = df.rename(columns = {'folio':'CVE_MUN'})
df.set_index('CVE_MUN', inplace = True)
P1009 = df.where((pd.notnull(df)), None)
del(P1009['entidad'])
del(P1009['municipio'])
Explanation: ¿Donde están los datos?
secc_iv_tr_cngmd15_m6 Contiene variables que caracterizan a los municipios de acuerdo a los estudios sobre la generación y composición de los residuos sólidos urbanos, durante el año 2014. 
La columna P12 Indica si se cuenta con algún estudio sobre la generación de residuos sólidos urbanos (1 = Si; 2 = No).
End of explanation
meta
# Metadatos
meta = meta           # Utiliza el archivo de metadatos que habías definido anteriormente
meta.at['Dataset base','Descripcion'] = '"P1009.xlsx" disponible en \nhttps://github.com/INECC-PCCS/01_Dmine/tree/master/Datasets/CNGMD/2015'
meta.at['Notas','Descripcion'] = 'Para la columna P12, ¿El Municipio cuenta con estudios de generacion de residuos? 1: Si 2: No'
meta
file = r'D:\PCCS\01_Dmine\Datasets\CNGMD'+'\\'+param+'.xlsx'
writer = pd.ExcelWriter(file)
P1009.to_excel(writer, sheet_name = param)
meta.to_excel(writer, sheet_name ='METADATOS')
writer.save()
Explanation: Exportar archivos
End of explanation
tablasP1003
Explanation: P1003 - Número de municipios con disponibilidad de servicios relacionados con los RSU
¿Donde estan los datos?
La informacion de este parametro se encuentra dividida entre diferentes carpetas.
End of explanation
# Rutas de archivos
param = 'P1003'
rutasdatos = list(tablasP1003.values())
for ruta in rutasdatos:
    print(ruta)
# Definición de rutas a archivos de datos
Paramfiles = {}
for rutadatos in rutasdatos:
    for file in os.listdir(rutadatos):
        Paramfiles[file.replace('.csv', '')] = rutadatos+'\\'+file
for file, path in Paramfiles.items():
    print('{}:\n{}\n'.format(file, path))
# Carga de datos
# Es necesario hacer 3 dataframes, uno por cada archivo, y después unir las columnas para cada parámetro.
P1003f1 = Paramfiles['secc_i_tr_cngmd15_m6']
df = pd.read_csv(P1003f1, dtype={'folio':'str'}, encoding = 'mbcs')
df = df.rename(columns = {'folio':'CVE_MUN'})
df.set_index('CVE_MUN', inplace = True)
P1003f1 = df.where((pd.notnull(df)), None)
P1003f2 = Paramfiles['secc_ii_tr_cngmd15_m6']
df = pd.read_csv(P1003f2, dtype={'folio':'str'}, encoding = 'mbcs')
df = df.rename(columns = {'folio':'CVE_MUN'})
df.set_index('CVE_MUN', inplace = True)
P1003f2 = df.where((pd.notnull(df)), None)
# El Parametro en realidad no utiliza el numero de sitios de disposicion de residuos. 
# Y no está documentado el significado de NS en la columna P11 lo que dificulta la lectura de los datos
''' 
P1003f3 = Paramfiles['secc_iii_tr_cngmd15_m6']
df = pd.read_csv(P1003f3, dtype={'folio':'str'}, encoding = 'mbcs')
df = df.rename(columns = {'folio':'CVE_MUN'})
df.set_index('CVE_MUN', inplace = True)
P1003f3 = df.where((pd.notnull(df)), None)
'''
# Aislar datos de interés
P1003 = P1003f1['p1'].to_frame()
P1003['p10'] = P1003f2['p10']
# P1003['p11'] = P1003f3['p11']   #p11 se excluye del analisis por los motivos descritos antes
P1003.head(1)
Explanation: La Carpeta 1 Contiene 2 archivos:
secc_i_tr_cngmd15_m6.csv - Contiene variables que caracterizan a los municipios de acuerdo a la recolección de residuos sólidos urbanos, durante el año 2014. En este archivo, la variable P1 indica la disponibilidad del servicio de recolección (1: Si, 2:No)
secc_i_tr_cngmd15_m6_p6_3_2.csv - Contiene variables que caracterizan a los municipios de acuerdo al parque vehicular utilizado para la recolección y traslado de residuos sólidos urbanos, durante el año 2014. En este archivo, la variable P6_3_2_1_3 contiene el número de vehículos utilizados para la recolección de Residuos solidos urbanos. (Esta variable puede utilizarse para la construcción del parámetro 1005)
La Carpeta 2 Contiene 1 archivo:
secc_ii_tr_cngmd15_m6.csv - Contiene variables que caracterizan a los municipios de acuerdo al tratamiento de los residuos, durante el año 2014. En este archivo, la variable P10 Identifica si al menos una fracción de los residuos sólidos urbanos recolectados por el municipio o delegación es enviada a plantas de tratamiento (1: Si, 2:No)
La Carpeta 3 contiene 1 archivo:
secc_iii_tr_cngmd15_m6.csv - Contiene variables que caracterizan a los municipios de acuerdo a la disposición final de los residuos sólidos urbanos, durante el año 2014. En este archivo, la variable P11 Identifica el número de sitios de disposición final a los que son son remitidos los residuos que se recolectan en todo el municipio o delegación
End of explanation
# Metadatos
meta = meta           # Utiliza el archivo de metadatos que habías definido anteriormente
meta.at['Dataset base','Descripcion'] = '"P1003.xlsx" disponible en \nhttps://github.com/INECC-PCCS/01_Dmine/tree/master/Datasets/CNGMD/2015'
meta.at['Notas','Descripcion'] = 'para p1: ¿Dispone de servicio de recoleccion? (1: Si 2: No)\npara p10: ¿Al menos una fracción de los RSU es enviada a plantas de tratamiento? (1: Si 2: No)\npara p11: ¿A cuantos sitios de disposición final son remitidos los residuos?'
meta
param
file = r'D:\PCCS\01_Dmine\Datasets\CNGMD'+'\\'+param+'.xlsx'
writer = pd.ExcelWriter(file)
P1003.to_excel(writer, sheet_name = param)
meta.to_excel(writer, sheet_name ='METADATOS')
writer.save()
Explanation: Exportar archivos
End of explanation
# Carga de datos
P1005f = Paramfiles['secc_i_tr_cngmd15_m6_p6_3_2']
df = pd.read_csv(P1005f, dtype={'FOLIO':'str'}, encoding = 'mbcs')
df = df.rename(columns = {'FOLIO':'CVE_MUN'})
df.set_index('CVE_MUN', inplace = True)
P1005f = df.where((pd.notnull(df)), None)
P1005f.head(1)
Explanation: P1005 - Número de vehículos utilizados para la recolección de residuos sólidos urbanos
¿Donde están los datos?
La Carpeta 1 de P1003 (Procesada previamente) contiene 2 archivos:
secc_i_tr_cngmd15_m6.csv, y
secc_i_tr_cngmd15_m6_p6_3_2.csv - Contiene variables que caracterizan a los municipios de acuerdo al parque vehicular utilizado para la recolección y traslado de residuos sólidos urbanos, durante el año 2014. En este archivo, la variable P6_3_2_1_3 contiene el número de vehículos utilizados para la recolección de Residuos solidos urbanos. (Esta variable puede utilizarse para la construcción del parámetro 1005)
End of explanation
P1005 = P1005f['P6_3_2_1_3'].to_frame()
P1005.head(3)
# Metadatos
meta = meta           # Utiliza el archivo de metadatos que habías definido anteriormente
meta.at['Dataset base','Descripcion'] = '"P1005.xlsx" disponible en \nhttps://github.com/INECC-PCCS/01_Dmine/tree/master/Datasets/CNGMD/2015'
meta.at['Notas','Descripcion'] = 'P6_3_2_1_3: Numero de vehiculos utilizados para la recolección de Residuos Solidos Urbanos'
meta
param = 'P1005'
file = r'D:\PCCS\01_Dmine\Datasets\CNGMD'+'\\'+param+'.xlsx'
writer = pd.ExcelWriter(file)
P1005.to_excel(writer, sheet_name = param)
meta.to_excel(writer, sheet_name ='METADATOS')
writer.save()
Explanation: Exportar archivos
End of explanation
<END_TASK>