<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Estandarizacion de datos de los Anuarios Geoestadísticos de INEGI 2017
1. Introduccion
Parámetros que se obtienen de esta fuente
Step1:  2. Descarga de datos
Cada entidad cuenta con una página que presenta sus respectivos anuarios geoestadísticos. La manera más rápida de obtener las ligas de los anuarios es entrar a la biblioteca de INEGI (http
Step2:  Extraccion de indices
Conocer la información que contiene cada hoja del índice geoestadístico puede ser muy valioso y es necesario para hacer una función que itere adecuadamente por los archivos de todos los estados, debido a que los anuarios geoestadísticos de cada estado tienen ligeras variaciones que impiden una iteración directa.
Step3:  Los índices obtenidos de esta manera recibirán una limpieza manual desde Excel.
Estandarizacion de datos para Parámetros.
P0610 Ventas de electricidad
Debido a la falta de estructura de los índices de parámetros de electricidad, tuvieron que ser estandarizados manualmente en excel. Con los índices estandarizados ya es posible generar un iterador
Step4:  Seleccionar renglones correspondientes a volumen de ventas de energía en MW/h
Step5:  Extraer datos de todas las ciudades
Por medio de una función que se aplica al dataframe ventaselec, obtenemos los datos de ventas de energía eléctrica para todos los estados. Esta función incluye lineas para verificar los datasets extraidos.
Step6:  Revision de datos extraidos
Revision de los datos que se dejaron fuera (en trashesdic), para asegurarme de que no dejé ningún municipio fuera.
Step7:  Revision de columnas en todos los datasets
Step8:  Podemos ver que la extracción de columnas no fue uniforme. Tomando como base la Ciudad de México, se revisarán los casos particulares
Step9:  Los siguientes estados contienen columnas que no son estándar
Step10:  Se van a revisar caso por caso los siguientes estados.
Step11:  CVE_EDO 05
Step12:  CVE_EDO 10
Step13:  CVE_EDO 12
Step14:  CVE_EDO 16
Step15:  CVE_EDO 18
Step16:  CVE_EDO 26
Step17:  CVE_EDO 29
Step18:  Consolidacion de dataframe 
Todos los dataframes se guardarán como un solo archivo único y chingón.
Step19:  Como todo lo triste de esta vida, el dataset no tiene asignadas claves geoestadísticas municipales, por lo que será necesario etiquetarlo manualmente en Excel.
Step20:  Las siguientes columnas de código muestran el dataset después de la limpieza realizada en Excel.
Step21:  El dataset limpio quedó guardado como '..\PCCS\01_Dmine\Datasets\AGEO\2017\VentasElectricidad.xlsx'
P0701 Longitud total de la red de carreteras del municipio (excluyendo las autopistas)
Debido a la falta de estructura de los índices de parámetros de Movilidad, tuvieron que ser estandarizados manualmente en excel. Con los índices estandarizados ya es posible generar un iterador
Step22:  Seleccionar renglones correspondientes a Longitud total de la red de carreteras (kilometros)
Step23:  Falta el índice para CDMX, hay que agregarlo aparte
Step24:  Extraer datos de todas las ciudades 
Por medio de una función que se aplica al dataframe, obtenemos los datos de ventas de energía eléctrica para todos los estados. Esta función incluye lineas para verificar los datasets extraidos.
Step25:  Los datos extraídos son muy irregulares por lo que es mas rapido limpiarlos en excel.
<ASSISTANT_TASK:>
Python Code:
descripciones = {
    'P0610': 'Ventas de electricidad',
    'P0701': 'Longitud total de la red de carreteras del municipio (excluyendo las autopistas)'
}
# Librerias utilizadas
import pandas as pd
import sys
import urllib
import os
import csv
import zipfile
# 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()))
Explanation: Estandarizacion de datos de los Anuarios Geoestadísticos de INEGI 2017
1. Introduccion
Parámetros que se obtienen de esta fuente:
ID |Descripción
---|:----------
P0610|Ventas de electricidad
P0701|Longitud total de la red de carreteras del municipio (excluyendo las autopistas)
End of explanation
raiz = 'http://internet.contenidos.inegi.org.mx/contenidos/Productos/prod_serv/contenidos/espanol/bvinegi/productos/nueva_estruc/anuarios_2017/'
# El diccionario tiene como llave la CVE_EDO y dirige hacia la liga de descarga del archivo zip con las tablas del 
# Anuario Geoestadístico de cada estado
links = {
    '01': raiz + '702825092078.zip',
    '02': raiz + '702825094874.zip',
    '03': raiz + '702825094881.zip',
    '04': raiz + '702825095109.zip',
    '05': raiz + '702825095406.zip',
    '06': raiz + '702825092061.zip',
    '07': raiz + '702825094836.zip',
    '08': raiz + '702825092139.zip',
    '09': raiz + '702825094683.zip',
    '10': raiz + '702825092115.zip',
    '11': raiz + '702825092146.zip',
    '12': raiz + '702825094690.zip',
    '13': raiz + '702825095093.zip',
    '14': raiz + '702825092085.zip',
    '15': raiz + '702825094706.zip',
    '16': raiz + '702825092092.zip',
    '17': raiz + '702825094713.zip',
    '18': raiz + '702825092054.zip',
    '19': raiz + '702825094911.zip',
    '20': raiz + '702825094843.zip',
    '21': raiz + '702825094973.zip',
    '22': raiz + '702825092108.zip',
    '23': raiz + '702825095130.zip',
    '24': raiz + '702825092122.zip',
    '25': raiz + '702825094898.zip',
    '26': raiz + '702825094904.zip',
    '27': raiz + '702825095123.zip',
    '28': raiz + '702825094928.zip',
    '29': raiz + '702825096212.zip',
    '30': raiz + '702825094980.zip',
    '31': raiz + '702825095116.zip',
    '32': raiz + '702825092047.zip'
}
for value in links.values():
    print(value)
# Descarga de archivos a carpeta local
destino = r'D:\PCCS\00_RawData\01_CSV\AGEO\2017'
archivos = {}   # Diccionario para guardar memoria de descarga
for k,v in links.items():
    archivo_local = destino + r'\{}.zip'.format(k)
    if os.path.isfile(archivo_local):
        print('Ya existe el archivo: {}'.format(archivo_local))
        archivos[k] = archivo_local
    else:
        print('Descargando {} ... ... ... ... ... '.format(archivo_local))
        urllib.request.urlretrieve(v, archivo_local) #
        archivos[k] = archivo_local
        print('se descargó {}'.format(archivo_local))
# Descompresión de archivos de estado
unzipped = {}
for estado, comprimido in archivos.items():
    target = destino + '\\' + estado
    if os.path.isdir(target):
        print('Ya existe el directorio: {}'.format(target))
        unzipped[estado] = target
    else:
        print('Descomprimiendo {} ... ... ... ... ... '.format(target))
        descomprimir = zipfile.ZipFile(comprimido, 'r')
        descomprimir.extractall(target)
        descomprimir.close
        unzipped[estado] = target
        
Explanation: 2. Descarga de datos
Cada entidad cuenta con una página que presenta sus respectivos anuarios geoestadísticos. La manera más rápida de obtener las ligas de los anuarios es entrar a la biblioteca de INEGI (http://www.beta.inegi.org.mx/app/publicaciones/) y buscar la palabra "Anuario" en el campo de búsqueda.
CVE_EDO |Nombre|URL
---|:---|:----------
01|Aguascalientes|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092078
02|Baja California|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094874
03|Baja California Sur|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094881
04|Campeche|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825095109
05|Coahuila de Zaragoza|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825095406
06|Colima|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092061
07|Chiapas|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094836
08|Chihuahua|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092139
09|Ciudad de México|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094683
10|Durango|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092115
11|Guanajuato|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092146
12|Guerrero|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094690
13|Hidalgo|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825095093
14|Jalisco|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092085
15|México|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094706
16|Michoacán de Ocampo|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092092
17|Morelos|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094713
18|Nayarit|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092054
19|Nuevo León|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094911
20|Oaxaca|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094843
21|Puebla|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094973
22|Querétaro|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092108
23|Quintana Roo|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825095130
24|San Luis Potosí|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092122
25|Sinaloa|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094898
26|Sonora|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094904
27|Tabasco|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825095123
28|Tamaulipas|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094928
29|Tlaxcala|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825096212
30|Veracruz de Ignacio de la Llave|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825094980
31|Yucatán|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825095116
32|Zacatecas|http://www.beta.inegi.org.mx/app/biblioteca/ficha.html?upc=702825092047
Dentro de cada página, se incluye una liga directa para descargar un archivo comprimido con las tablas de datos de cada anuario geoestadítico. La lista links contiene estas URL y se utilizará para sistematizar la descarga de datos.
End of explanation
unzipped
# Extraer indices
indices = {}
for estado, ruta in unzipped.items():
    for file in os.listdir(ruta):
        if file.endswith('.xls'):
            path = ruta + '\\' + file
            indice = pd.read_excel(path, sheetname='Índice', skiprows = 1)   # Primera lectura al indice para sacar columnas
            dtypes = list(indice)
            tempdic = {}
            for i in dtypes:
                tempdic[i] = 'str'
            indice = pd.read_excel(path, 
                                   sheetname='Índice', 
                                   skiprows = 1,
                                   dtype = tempdic).dropna(how = 'all')   # Segunda lectura al indice ya con dtypes
            name = list(indice)[0]           # Guarda el nombre del indice
            cols = []
            for i in range(len(list(indice))):
                cols.append('col{}'.format(i))    # Crea nombres estandar de columna
            indice.columns = cols                 # Asigna nombres de columna
            indice['indice'] = name
            indice['file'] = file
            if estado not in indices.keys():      # Crea un diccionario para cada estado, si no existe
                indices[estado] = {}
            indices[estado][name] = indice
            print('Procesado {} |||NOMBRE:||| {}; [{}]'.format(file, name, len(cols)))     # Imprime los resultados del proceso
# Reordenar los dataframes por tipo
indices_2 = {}
for estado in indices.keys():
    for indice in indices[estado].keys():
        if indice not in indices_2.keys():
            indices_2[indice] = {}
        indices_2[indice][estado] = indices[estado][indice]
# Convertir indices en archivos unicos.
finalindexes = {}
for i in indices_2.keys():
    print(i)
    frameslist = []
    for estado in indices_2[i].keys():
        frame = indices_2[i][estado]
        frame['estado'] = estado
        frameslist.append(frame)
    fullindex = pd.concat(frameslist)
    finalindexes[i] = fullindex
    print('Hecho: {}\n'.format(i))
# Escribir archivos xlsx
path = r'D:\PCCS\01_Dmine\Datasets\AGEO\2017\indices'
for indice in finalindexes.keys():
    file = path+'\\'+indice+'.xlsx'
    writer = pd.ExcelWriter(file)
    finalindexes[indice].to_excel(writer, sheet_name = 'Indice')
    writer.save()
    print('[{}] lineas - archivo {}'.format(len(finalindexes[indice]), file))
Explanation: Extraccion de indices
Conocer la información que contiene cada hoja del índice geoestadístico puede ser muy valioso y es necesario para hacer una función que itere adecuadamente por los archivos de todos los estados, debido a que los anuarios geoestadísticos de cada estado tienen ligeras variaciones que impiden una iteración directa.
End of explanation
# Importar dataset de índices
f_indice = r'D:\PCCS\01_Dmine\Datasets\AGEO\2017\indices\Limpios\Electricidad.xlsx'
ds_indices = pd.read_excel(f_indice, dtype={'Numeral':'str', 'estado':'str'}).set_index('estado')
ds_indices.head()
Explanation: Los índices obtenidos de esta manera recibirán una limpieza manual desde Excel.
Estandarizacion de datos para Parámetros.
P0610 Ventas de electricidad
Debido a la falta de estructura de los índices de parámetros de electricidad, tuvieron que ser estandarizados manualmente en excel. Con los índices estandarizados ya es posible generar un iterador
End of explanation
# Dataframe con índice de hojas sobre el tema "Ventas de electricidad"
ventaselec = ds_indices[ds_indices['Units'] == '(Megawatts-hora)']
ventaselec.head()
len(ventaselec)
# Crear columna con rutas
path = r'D:\PCCS\00_RawData\01_CSV\AGEO\2017'
ventaselec['path'] = path+'\\'+ventaselec.index+'\\'+ventaselec['file']
# Definir función para traer datos a python
unnameds = set(['Unnamed: '+str(i) for i in range(0, 50)])   # Lista 'Unnamed: x' de 0 a 50
def get_ventas(path, sheet, estado):
    temp = pd.ExcelFile(path)
    temp = temp.parse(sheet, header = 6).dropna(axis = 0, how='all').dropna(axis = 1, how='all')
    
    # Elimina las columnas unnamed
    dropplets = set(temp.columns).intersection(unnameds)
    temp = temp.drop(dropplets, axis = 1)
    temp = temp.dropna(axis = 0, how='all')
    temp = temp.reset_index().drop('index', axis = 1)
    
    # Identifica los últimos renglones, que no contienen datos
    col0 = temp.columns[0]        # Nombre de la columna 0, para usarlo en un chingo de lugares. Bueno 3
    try: tempnotas = temp[col0][temp[col0] == 'Nota:'].index[0]  # Para las hojas que terminan en 'Notas'
    except: tempnotas = temp[col0][temp[col0] == 'a/'].index[0]   # Para las hojas que terminan en 'a/'
    print(tempnotas)
    
    # Aparta los renglones después de "a/", para conocer la información que dejé fuera.
    trashes = temp.iloc[tempnotas:-1]
    
    # Elimina los renglones después de "a/"
    temp = temp.iloc[0:tempnotas]
    
    # Crear columna de estado y renombrar la primera columna para poder concatenar datframes más tarde.
    temp['CVE_EDO'] = estado
    temp = temp.rename(columns={col0:'NOM_MUN'})
    print(type(temp))
    
    return temp, trashes
Explanation: Seleccionar renglones correspondientes a volumen de ventas de energía en MW/h
End of explanation
# Funcion para extraer datos
def getdata(serie, estado):
    path = serie['path']
    sheet = serie['Numeral']
    print('{}\n{}'.format('-'*30, path))     # Imprime la ruta hacia el archivo
    print('Hoja: {}'.format(sheet))          # Imprime el nombre de la hoja que se va a extraer
    trashes, temp = get_ventas(path, sheet, estado)
    print(temp.iloc[[0, -1]][temp.columns[0]])
    print(list(temp))
    print(('len = {}'.format(len(temp))))
    return trashes, temp
ventasdic = {}
trashesdic = {}
for estado in ventaselec.index:
    ventasdic[estado], trashesdic[estado] = getdata(ventaselec.loc[estado], estado)
# Ejemplo de uno de los dataframes extraidos
ventasdic['09']
ventaselec['path']
Explanation: Extraer datos de todas las ciudades
Por medio de una función que se aplica al dataframe ventaselec, obtenemos los datos de ventas de energía eléctrica para todos los estados. Esta función incluye lineas para verificar los datasets extraidos.
End of explanation
a = '-'*30
for CVE_EDO in trashesdic.keys():
    print('{}\n{}\n{}'.format(a, trashesdic[CVE_EDO], a))
Explanation: Revision de datos extraidos
Revision de los datos que se dejaron fuera (en trashesdic), para asegurarme de que no dejé ningún municipio fuera.
End of explanation
for CVE_EDO in ventasdic.keys():
    variables = list(ventasdic[CVE_EDO])
    longitud = len(variables)        # Cuantas variables existen?
    longset = len(set(variables))    # Cuantas variables son distintas?
    print('{}{} [{} - {}]\n{}\n{}'.format(a, CVE_EDO, longitud, longset, variables, a))
Explanation: Revision de columnas en todos los datasets
End of explanation
varCDMX = set(list(ventasdic['09']))
varCDMX
Explanation: Podemos ver que la extracción de columnas no fue uniforme. Tomando como base la Ciudad de México, se revisarán los casos particulares:
End of explanation
nostandar = [] # Lista de estados cuyas columnas no son estandar
for CVE_EDO in ventasdic.keys():
    varsedo = set(list(ventasdic[CVE_EDO]))
    diffs = varCDMX.symmetric_difference(varsedo)
    if len(diffs) != 0:
        print('{}{}\n{}\n{}'.format(a, CVE_EDO, diffs, a))
        nostandar.append(CVE_EDO)
Explanation: Los siguientes estados contienen columnas que no son estándar:
End of explanation
nostandar
Explanation: Se van a revisar caso por caso los siguientes estados.
End of explanation
REV_EDO = '05'
ventasdic[REV_EDO].head(6)
list(ventasdic[REV_EDO])
drops = ['a/', '\nb/', '\nc/', 'd/', '\ne/']     # Nombres de las columnas que se van a eliminar
ventasdic['05'] = ventasdic['05'].drop(drops, axis = 1)
old_colnames = list(ventasdic[REV_EDO])
new_colnames = list(ventasdic['09'])
colnames = {i:j for i,j in zip(old_colnames,new_colnames)}
ventasdic[REV_EDO] = ventasdic[REV_EDO].rename(columns = colnames)     # Normalizacion
ventasdic['05'].head()
Explanation: CVE_EDO 05
End of explanation
REV_EDO = '10'
ventasdic[REV_EDO].head(6)
list(ventasdic[REV_EDO])
drops = ['d/']     # Nombres de las columnas que se van a eliminar
ventasdic[REV_EDO] = ventasdic[REV_EDO].drop(drops, axis = 1)
Explanation: CVE_EDO 10
End of explanation
REV_EDO = '12'
ventasdic[REV_EDO].head(6)
list(ventasdic[REV_EDO])
drops = ['a/']     # Nombres de las columnas que se van a eliminar
ventasdic[REV_EDO] = ventasdic[REV_EDO].drop(drops, axis = 1)
Explanation: CVE_EDO 12
End of explanation
REV_EDO = '16'
ventasdic[REV_EDO].head(6)
list(ventasdic[REV_EDO])
drops = ['d/']     # Nombres de las columnas que se van a eliminar
ventasdic[REV_EDO] = ventasdic[REV_EDO].drop(drops, axis = 1)
Explanation: CVE_EDO 16
End of explanation
REV_EDO = '18'
ventasdic[REV_EDO].head(6)
list(ventasdic[REV_EDO])
drops = ['d/']     # Nombres de las columnas que se van a eliminar
ventasdic[REV_EDO] = ventasdic[REV_EDO].drop(drops, axis = 1)
Explanation: CVE_EDO 18
End of explanation
REV_EDO = '26'
ventasdic[REV_EDO].head(6)
list(ventasdic[REV_EDO])
drops = ['d/']     # Nombres de las columnas que se van a eliminar
ventasdic[REV_EDO] = ventasdic[REV_EDO].drop(drops, axis = 1)
Explanation: CVE_EDO 26
End of explanation
REV_EDO = '29'
ventasdic[REV_EDO].head(6)
list(ventasdic[REV_EDO])
drops = ['a/', '\nb/', '\nc/', 'd/', '\ne/']     # Nombres de las columnas que se van a eliminar
ventasdic[REV_EDO] = ventasdic[REV_EDO].drop(drops, axis = 1)
old_colnames = list(ventasdic[REV_EDO])
new_colnames = list(ventasdic['09'])
colnames = {i:j for i,j in zip(old_colnames,new_colnames)}
ventasdic[REV_EDO] = ventasdic[REV_EDO].rename(columns = colnames)     # Normalizacion
Explanation: CVE_EDO 29
End of explanation
# Unificacion de datos a un solo dataset
ventasDS = pd.DataFrame()
for CVE_EDO, dataframe in ventasdic.items():
    estado = ventasdic[CVE_EDO]['NOM_MUN'][0]
    print('Adjuntando {} - {} -----'.format(CVE_EDO, estado))
    ventasDS = ventasDS.append(dataframe)
# Nombre final para columnas, para evitar duplicidades con otros datasets 
# y para eliminar acentos que podrían causar problemas de encoding
colnames = {
'NOM_MUN':'NOM_MUN',
'Total':'Total ventas elec',
'Doméstico':'VE Domestico',
'Alumbrado\npúblico':'VE alumbrado publico',
'Bombeo de aguas \npotables y negras':'VE Bombeo agua potable y negra',
'Agrícola':'VE Agricola',
'Industrial y \nde servicios':'VE Industrial y servicios',
}
ventasDS = ventasDS.rename(columns=colnames)
ventasDS.head()
# Metadatos
metadatos = {
    'Nombre del Dataset': 'Anuario Geoestadistico 2017 por estado, Datos de electricidad',
    'Descripcion del dataset': None,
    'Disponibilidad Temporal': '2016',
    'Periodo de actualizacion': 'Anual',
    'Nivel de Desagregacion': 'Municipal',
    'Notas': 's/n',
    'Fuente': 'INEGI - Anuarios Geoestadisticos',
    'URL_Fuente': 'http://www.beta.inegi.org.mx/proyectos/ccpv/2010/?#section',
    'Dataset base': None
}
metadatos = pd.DataFrame.from_dict(metadatos, orient='index', dtype='str')
metadatos.columns = ['Descripcion']
metadatos= metadatos.rename_axis('Metadato')
metadatos
Variables = {
    'NOM_MUN':'Nombre del Municipio',
    'Total ventas elec':'Total de ventas de energía electrica',
    'VE Domestico':'Ventas de energia en el sector domestico (Megawatts-Hora)',
    'VE alumbrado publico':'Ventas de energia en alumbrado publico (Megawatts-Hora)',
    'VE Bombeo agua potable y negra':'Ventas de energia en bombeo de agua potable y negra (Megawatts-Hora)',
    'VE Agricola':'Ventas de energia en el sector Agricola (Megawatts-Hora)',
    'VE Industrial y servicios':'Ventas de energia en el sector industrial y de Servicios (Megawatts-Hora)',
    'CVE_EDO':'Clave Geoestadistica Estatal de 2 Digitos',
}
Variables = pd.DataFrame.from_dict(Variables, orient='index', dtype='str')
Variables.columns = ['Descripcion']
Variables= Variables.rename_axis('Mnemonico')
Variables
Explanation: Consolidacion de dataframe 
Todos los dataframes se guardarán como un solo archivo único y chingón.
End of explanation
#Exportar dataset
file = r'D:\PCCS\01_Dmine\Datasets\AGEO\2017'+'\\'+'electricidad.xlsx'
writer = pd.ExcelWriter(file)
ventasDS.to_excel(writer, sheet_name = 'DATOS')
metadatos.to_excel(writer, sheet_name ='METADATOS')
Variables.to_excel(writer, sheet_name ='VARIABLES')
writer.save()
Explanation: Como todo lo triste de esta vida, el dataset no tiene asignadas claves geoestadísticas municipales, por lo que será necesario etiquetarlo manualmente en Excel.
End of explanation
# Muestra del dataset con claves geoestadísticas asignadas
archivo = r'D:\PCCS\01_Dmine\Datasets\AGEO\2017\VentasElectricidad.xlsx'
elec = pd.read_excel(archivo, sheetname='DATOS', dtype={'CVE_MUN':'str'})
elec = elec.set_index('CVE_MUN')
elec.head()
Explanation: Las siguientes columnas de código muestran el dataset después de la limpieza realizada en Excel.
End of explanation
# Importar dataset de índices
f_indice = r'D:\PCCS\01_Dmine\Datasets\AGEO\2017\indices\Limpios\IndicesMovilidad.xlsx'
ds_indices = pd.read_excel(f_indice, dtype={'Numeral':'str', 'estado':'str'}).set_index('estado')
ds_indices.head()
Explanation: El dataset limpio quedó guardado como '..\PCCS\01_Dmine\Datasets\AGEO\2017\VentasElectricidad.xlsx'
P0701 Longitud total de la red de carreteras del municipio (excluyendo las autopistas)
Debido a la falta de estructura de los índices de parámetros de Movilidad, tuvieron que ser estandarizados manualmente en excel. Con los índices estandarizados ya es posible generar un iterador
End of explanation
# Dataframe con índice de hojas sobre el tema "Longitud total de la red de carreteras"
dataframe = ds_indices[ds_indices['ID'] == '22.1']
dataframe.head()
len(dataframe)
dataframe.index
Explanation: Seleccionar renglones correspondientes a Longitud total de la red de carreteras (kilometros)
End of explanation
ds_indices[ds_indices['ID'] == '20.16']
dataframe = dataframe.append(ds_indices[ds_indices['ID'] == '20.16'])
# Crear columna con rutas
path = r'D:\PCCS\00_RawData\01_CSV\AGEO\2017'
dataframe['path'] = path+'\\'+dataframe.index+'\\'+dataframe['file']
dataframe.head(2)
# Definir función para traer datos a python
unnameds = set(['Unnamed: '+str(i) for i in range(0, 50)])   # Lista 'Unnamed: x' de 0 a 50
   # Esta lista se utilizará para eliminar columnas nombradas Unnamed, que por lo general no tienen datos.
def get_datos(path, sheet, estado):
    temp = pd.ExcelFile(path)
    temp = temp.parse(sheet, header = 6).dropna(axis = 0, how='all').dropna(axis = 1, how='all')
    return temp
    # Identifica los últimos renglones, que no contienen datos
#    col0 = temp.columns[0]        # Nombre de la columna 0, para usarlo en un chingo de lugares. Bueno 3
#    try: tempnotas = temp[col0][temp[col0] == 'Nota:'].index[0]  # Para las hojas que terminan en 'Notas'
#    except: tempnotas = temp[col0][temp[col0] == 'a/'].index[0]   # Para las hojas que terminan en 'a/'
#    print(tempnotas)
#    
#    # Aparta los renglones después de "a/", para conocer la información que dejé fuera.
#    trashes = temp.iloc[tempnotas:-1]
#    
#    # Elimina los renglones después de "a/"
#    temp = temp.iloc[0:tempnotas]
#    
#    # Crear columna de estado y renombrar la primera columna para poder concatenar datframes más tarde.
#    temp['CVE_EDO'] = estado
#    temp = temp.rename(columns={col0:'NOM_MUN'})
#    print(type(temp))
#    
#    return temp, trashes
Explanation: Falta el índice para CDMX, hay que agregarlo aparte
End of explanation
# Funcion para extraer datos
def getdata(serie, estado):
    path = serie['path']
    sheet = serie['ID']
    print('{}\n{}'.format('-'*30, path))     # Imprime la ruta hacia el archivo
    print('Hoja: {}'.format(sheet))          # Imprime el nombre de la hoja que se va a extraer
    temp = get_datos(path, sheet, estado)
    print(temp.iloc[[0, -1]][temp.columns[0]])
    print(list(temp))
    print(('len = {}'.format(len(temp))))
    return temp
datadic = {}
for estado in dataframe.index:
    datadic[estado] = getdata(dataframe.loc[estado], estado)
datadic.keys()
Explanation: Extraer datos de todas las ciudades 
Por medio de una función que se aplica al dataframe, obtenemos los datos de ventas de energía eléctrica para todos los estados. Esta función incluye lineas para verificar los datasets extraidos.
End of explanation
#Exportar dataset
file = r'D:\PCCS\01_Dmine\Datasets\AGEO\2017'+'\\'+'Long_Carreteras_raw1.xlsx'
writer = pd.ExcelWriter(file)
for estado, dataset in datadic.items():
    dataset.to_excel(writer, sheet_name = estado)
    print('Se guardó dataset para {}'.format(estado))
writer.save()
Explanation: Los datos extraídos son muy irregulares por lo que es mas rapido limpiarlos en excel.
End of explanation
<END_TASK>