Estandarizacion de datos del Inventario Nacional de Energias Renovables

1. Introduccion

Indicadores que salen de esta fuente

ID Descripción
P0009 Potencial de aprovechamiento energía solar
P0010 Potencial de aprovechamiento energía eólica
P0011 Potencial de aprovechamiento energía geotérmica
P0012 Potencial de aprovechamiento energía de biomasa
P0606 Generación mediante fuentes renovables de energía
P0607 Potencial de fuentes renovables de energía
P0608 Capacidad instalada para aprovechar fuentes renovables de energía

In [32]:
descripciones = {
'P0009' : 'Potencial de aprovechamiento energía solar',
'P0010' : 'Potencial de aprovechamiento energía eólica',
'P0011' : 'Potencial de aprovechamiento energía geotérmica',
'P0012' : 'Potencial de aprovechamiento energía de biomasa',
'P0606' : 'Generación mediante fuentes renovables de energía',
'P0607' : 'Potencial de fuentes renovables de energía',
'P0608' : 'Capacidad instalada para aprovechar fuentes renovables de energía'
}

In [33]:
# Librerias utilizadas
import pandas as pd
import sys
import urllib
import os
import csv

In [34]:
# 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()))


Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)] on win32
Pandas version: 0.20.1
Running on Windows 8.1

Descarga de datos

Los datos se encuentran en la plataforma del Inventario Nacional de Energias Renovables (INERE) ubicada en https://dgel.energia.gob.mx/inere/, y tienen que descargarse manualmente porque su página está elaborada en Flash y no permite la descarga sistematizada de datos. A veces ni funciona por sí misma, manda errores al azar.

Se descargaron dos datasets, uno que contiene el Inventario Actual y otro con el Inventario Potencial de energías renovables a nivel nacional.

Como la base de datos no incluye claves geoestadísticas, estas tienen que asignarse manualmente. A continuacion se muestra el encabezado del archivo que se procesó a mano.


In [35]:
# Lectura del dataset de energia renovable actual como descargado
directorio = r'D:\PCCS\00_RawData\01_CSV\INERE\\'
archivo = directorio+'Actual Energia Renovable.xls'
raw_actual = pd.read_excel(archivo).dropna()
raw_actual.head()
# El dataset envía error cuando se intenta leer directamente


---------------------------------------------------------------------------
XLRDError                                 Traceback (most recent call last)
<ipython-input-35-8f7028226c8e> in <module>()
      2 directorio = r'D:\PCCS\00_RawData\01_CSV\INERE\\'
      3 archivo = directorio+'Actual Energia Renovable.xls'
----> 4 raw_actual = pd.read_excel(archivo).dropna()
      5 raw_actual.head()
      6 # El dataset envía error cuando se intenta leer directamente

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\excel.py in read_excel(io, sheetname, header, skiprows, skip_footer, index_col, names, parse_cols, parse_dates, date_parser, na_values, thousands, convert_float, has_index_names, converters, dtype, true_values, false_values, engine, squeeze, **kwds)
    198 
    199     if not isinstance(io, ExcelFile):
--> 200         io = ExcelFile(io, engine=engine)
    201 
    202     return io._parse_excel(

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\excel.py in __init__(self, io, **kwds)
    255             self.book = xlrd.open_workbook(file_contents=data)
    256         elif isinstance(io, compat.string_types):
--> 257             self.book = xlrd.open_workbook(io)
    258         else:
    259             raise ValueError('Must explicitly set engine if not passing in'

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\xlrd\__init__.py in open_workbook(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows)
    439         formatting_info=formatting_info,
    440         on_demand=on_demand,
--> 441         ragged_rows=ragged_rows,
    442         )
    443     return bk

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\xlrd\book.py in open_workbook_xls(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows)
     89         t1 = time.clock()
     90         bk.load_time_stage_1 = t1 - t0
---> 91         biff_version = bk.getbof(XL_WORKBOOK_GLOBALS)
     92         if not biff_version:
     93             raise XLRDError("Can't determine file's BIFF version")

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\xlrd\book.py in getbof(self, rqd_stream)
   1289         bof_error(
   1290             'BOF not workbook/worksheet: op=0x%04x vers=0x%04x strm=0x%04x build=%d year=%d -> BIFF%d' \
-> 1291             % (opcode, version2, streamtype, build, year, version)
   1292             )
   1293 

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\xlrd\book.py in bof_error(msg)
   1222         if DEBUG: print("reqd: 0x%04x" % rqd_stream, file=self.logfile)
   1223         def bof_error(msg):
-> 1224             raise XLRDError('Unsupported format, or corrupt file: ' + msg)
   1225         savpos = self._position
   1226         opcode = self.get2bytes()

XLRDError: Unsupported format, or corrupt file: BOF not workbook/worksheet: op=0x0009 vers=0x0000 strm=0x1000 build=0 year=0 -> BIFF21

Ninguno de los dos datasets puede ser leido por python tal como fue descargado, por lo que tienen que abrirse en excel y guardarse nuevamente en formato xlsx.

Dataset energia renovable actual


In [36]:
# Lectura del dataset de energia renovable actual después de ser re-guardado en excel
directorio = r'D:\PCCS\00_RawData\01_CSV\INERE\\'
archivo = directorio+'Actual Energia Renovable.xlsx'
raw_actual = pd.read_excel(archivo).dropna()
raw_actual.head()


Out[36]:
ESTADO MUNICIPIO NOMBRE PRODUCTOR TIPO UNIDADES CAPACIDAD INSTALADA (MW) GENERACIÓN (GWh/a)
1 Querétaro Santiago de Querétaro Atlatec Privado Biogás 1.0 1.049 3.824943
2 Jalisco Tlajomulco De Zuñiga Atlatec, Planta El Ahogado Privado Biogás 2.0 2.830 6.918000
3 Tabasco Tenosique Azsuremex Privado Combustión directa 2.0 2.500 2.923360
4 Jalisco Tuxpan Bio Pappel, Atenquique Privado Combustión directa 4.0 15.500 32.240000
5 Nuevo León Salinas Victoria Bioenergía de Nuevo León Privado Biogás 7.0 16.960 87.759000

Se asignó CVE_MUN manualmente a la mayoría de los registros. No fue posible encontrar una clave geoestadística para las siguientes combinaciones de estado/municipio

ESTADO MUNICIPIO
Veracruz Jiotepec
Chiapas Atizapan
Oaxaca Motzorongo
Guerrero La Venta
Jalisco Santa Rosa

Para los siguientes registros, la CVE_MUN fue intuida desde el nombre de la población o el nombre del proyecto:

ESTADO MUNICIPIO CVE_MUN PROYECTO
Puebla Atencingo 21051 Ingenio de Atencingo
Puebla Tatlahuquitepec 21186 Mazatepec

A continuación se presenta el encabezado del dataset procesado manualmente, incluyendo columnas que se utilizaron como auxiliares para la identificación de municipios


In [37]:
# Lectura del dataset de energia renovable actual procesado manualmente
directorio = r'D:\PCCS\00_RawData\01_CSV\INERE\\'
archivo = directorio+'Actual CVE_GEO.xlsx'
actual_proc = pd.read_excel(archivo, dtype={'CVE_MUN': 'str'}).dropna()
actual_proc.head()


Out[37]:
ESTADO MUNICIPIO 3EDO3 3MUN3 GEO_EDO GEOEDO_3MUN CVE_MUN GEO_MUN_Nom NOMBRE PRODUCTOR TIPO UNIDADES CAPACIDAD INSTALADA (MW) GENERACIÓN (GWh/a)
0 Querétaro Santiago de Querétaro QUEARO SANARO 22 22SANARO 22014 QUERÉTARO_Querétaro Atlatec Privado Biogás 1 1.049 3.824943
1 Jalisco Tlajomulco De Zuñiga JALSCO TLAIGA 14 14TLAIGA 14097 JALISCO_Tlajomulco de Zúñiga Atlatec, Planta El Ahogado Privado Biogás 2 2.830 6.918000
2 Tabasco Tenosique TABSCO TENQUE 27 27TENQUE 27017 TABASCO_Tenosique Azsuremex Privado Combustión directa 2 2.500 2.923360
3 Jalisco Tuxpan JALSCO TUXPAN 14 14TUXPAN 14108 JALISCO_Tuxpan Bio Pappel, Atenquique Privado Combustión directa 4 15.500 32.240000
4 Nuevo León Salinas Victoria NUEEÓN SALRIA 19 19SALRIA 19045 NUEVO LEÓN_Salinas Victoria Bioenergía de Nuevo León Privado Biogás 7 16.960 87.759000

Para guardar el dataset y utilizarlo en la construcción del parámetro, se eliminarán algunas columnas.


In [38]:
list(actual_proc)


Out[38]:
['ESTADO',
 'MUNICIPIO',
 '3EDO3',
 '3MUN3',
 'GEO_EDO',
 'GEOEDO_3MUN',
 'CVE_MUN',
 'GEO_MUN_Nom',
 'NOMBRE',
 'PRODUCTOR',
 'TIPO',
 'UNIDADES',
 'CAPACIDAD INSTALADA (MW)',
 'GENERACIÓN (GWh/a) ']

In [39]:
# Eliminacion de columnas redundantes y temporales
del(actual_proc['ESTADO'])
del(actual_proc['MUNICIPIO'])
del(actual_proc['3EDO3'])
del(actual_proc['3MUN3'])
del(actual_proc['GEO_EDO'])
del(actual_proc['GEOEDO_3MUN'])
del(actual_proc['GEO_MUN_Nom'])

# Nombre Unico de Coloumnas
actual_proc = actual_proc.rename(columns = {
    'NOMBRE' : 'NOMBRE PROYECTO', 
    'PRODUCTOR': 'SECTOR PRODUCCION', 
    'TIPO': 'TIPO FUENTE ENER', 
    'UNIDADES': 'UNIDADES GEN'})

# Asignacion de CVE_MUN como indice 
actual_proc.set_index('CVE_MUN', inplace=True)
actual_proc.head()


Out[39]:
NOMBRE PROYECTO SECTOR PRODUCCION TIPO FUENTE ENER UNIDADES GEN CAPACIDAD INSTALADA (MW) GENERACIÓN (GWh/a)
CVE_MUN
22014 Atlatec Privado Biogás 1 1.049 3.824943
14097 Atlatec, Planta El Ahogado Privado Biogás 2 2.830 6.918000
27017 Azsuremex Privado Combustión directa 2 2.500 2.923360
14108 Bio Pappel, Atenquique Privado Combustión directa 4 15.500 32.240000
19045 Bioenergía de Nuevo León Privado Biogás 7 16.960 87.759000

In [40]:
# Metadatos estándar
metadatos = {
    'Nombre del Dataset': 'Inventario Actual de Energias Renovables',
    'Descripcion del dataset': '',
    'Disponibilidad Temporal': '2014',
    'Periodo de actualizacion': 'No Determinada',
    'Nivel de Desagregacion': 'Localidad, Municipal, Estatal, Nacional',
    'Notas': None,
    'Fuente': 'SENER',
    'URL_Fuente': 'https://dgel.energia.gob.mx/inere/',
    'Dataset base': None,
}

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


Out[40]:
Descripcion
Metadato
Nombre del Dataset Inventario Actual de Energias Renovables
Descripcion del dataset
Disponibilidad Temporal 2014
Periodo de actualizacion No Determinada
Nivel de Desagregacion Localidad, Municipal, Estatal, Nacional
Notas None
Fuente SENER
URL_Fuente https://dgel.energia.gob.mx/inere/
Dataset base None

In [9]:
list(actual_proc)


Out[9]:
['NOMBRE PROYECTO',
 'SECTOR PRODUCCION',
 'TIPO FUENTE ENER',
 'UNIDADES GEN',
 'CAPACIDAD INSTALADA (MW)',
 'GENERACIÓN (GWh/a) ']

In [41]:
# Descripciones de columnas
variables = {
    'NOMBRE PROYECTO': 'Nombre del proyecto de produccion de energia',
    'SECTOR PRODUCCION': 'Sector al que pertenece el proyecto de produccion de energia',
    'TIPO FUENTE ENER': 'Tipo de fuente de donde se obtiene la energía',
    'UNIDADES GEN': 'Numero de generadores instalados por proyecto',
    'CAPACIDAD INSTALADA (MW)': 'Capacidad Instalada en Megawatts',
    'GENERACIÓN (GWh/a) ' : 'Generación de Gigawatts/hora al año'
}

# Convertir descripciones a dataframe
actualvars = pd.DataFrame.from_dict(variables, orient='index', dtype=None)
actualvars.columns = ['Descripcion']
actualvars = actualvars.rename_axis('Mnemonico')
actualvars


Out[41]:
Descripcion
Mnemonico
NOMBRE PROYECTO Nombre del proyecto de produccion de energia
SECTOR PRODUCCION Sector al que pertenece el proyecto de producc...
TIPO FUENTE ENER Tipo de fuente de donde se obtiene la energía
UNIDADES GEN Numero de generadores instalados por proyecto
CAPACIDAD INSTALADA (MW) Capacidad Instalada en Megawatts
GENERACIÓN (GWh/a) Generación de Gigawatts/hora al año

In [42]:
# Guardar dataset limpio para creacion de parametro.
file = r'D:\PCCS\01_Dmine\Datasets\INERE\ER_Actual.xlsx'
writer = pd.ExcelWriter(file)
actual_proc.to_excel(writer, sheet_name = 'DATOS')
actualmeta.to_excel(writer, sheet_name = 'METADATOS')
actualvars.to_excel(writer, sheet_name = 'VARIABLES')
writer.save()
print('---------------TERMINADO---------------')


---------------TERMINADO---------------

Dataset Potencial de Energia Renovable


In [49]:
# Lectura del dataset de potencial de energia renovable después de ser re-guardado en excel
directorio = r'D:\PCCS\00_RawData\01_CSV\INERE\\'
archivo = directorio+'Potencial Energia Renovable.xlsx'
raw_potencial = pd.read_excel(archivo, dtype={'CVE_MUN': 'str'}).dropna()
raw_potencial.head()


Out[49]:
ESTADO MUNICIPIO 3EDO3 3MUN3 GEO_EDO GEOEDO_3MUN CVE_MUN GEO_MUN_Nom PROYECTO TIPO CLASIFICACIÓN SUBCLASIFICACIÓN CAPACIDAD INSTALABLE (MW) POTENCIAL (GWh/a) FUENTE
0 Sonora Agua Prieta SONORA AGUETA 26 26AGUETA 26002 SONORA_Agua Prieta Agua Prieta II Termosolar Parabólica Probado En construcción 12.000 18.86400 CFE
1 Aguascalientes Asientos AGUTES ASITOS 1 01ASITOS 01002 AGUASCALIENTES_Asientos Aguascalientes 1 Biogás Probable Motogenerador 1.510 8.83008 CFE
2 Aguascalientes Asientos AGUTES ASITOS 1 01ASITOS 01002 AGUASCALIENTES_Asientos Aguascalientes 2 Biogás Probable Motogenerador 1.512 8.83008 CFE
3 Aguascalientes Asientos AGUTES ASITOS 1 01ASITOS 01002 AGUASCALIENTES_Asientos Aguascalientes 3 Biogás Probable Biodigestor 3.000 17.52000 CFE
4 Aguascalientes Jesús María AGUTES JESRÍA 1 01JESRÍA 01005 AGUASCALIENTES_Jesús María Aguascalientes 4 Biogás Probable Biodigestor 0.093 0.54312 CFE

In [50]:
# Eliminacion de columnas redundantes y temporales
potencial_proc = raw_potencial
del(potencial_proc['ESTADO'])
del(potencial_proc['MUNICIPIO'])
del(potencial_proc['3EDO3'])
del(potencial_proc['3MUN3'])
del(potencial_proc['GEO_EDO'])
del(potencial_proc['GEOEDO_3MUN'])
del(potencial_proc['GEO_MUN_Nom'])

potencial_proc.head()


Out[50]:
CVE_MUN PROYECTO TIPO CLASIFICACIÓN SUBCLASIFICACIÓN CAPACIDAD INSTALABLE (MW) POTENCIAL (GWh/a) FUENTE
0 26002 Agua Prieta II Termosolar Parabólica Probado En construcción 12.000 18.86400 CFE
1 01002 Aguascalientes 1 Biogás Probable Motogenerador 1.510 8.83008 CFE
2 01002 Aguascalientes 2 Biogás Probable Motogenerador 1.512 8.83008 CFE
3 01002 Aguascalientes 3 Biogás Probable Biodigestor 3.000 17.52000 CFE
4 01005 Aguascalientes 4 Biogás Probable Biodigestor 0.093 0.54312 CFE

In [29]:
potencial_proc['SUBCLASIFICACIÓN'].unique()


Out[29]:
array(['En construcción', 'Motogenerador', 'Biodigestor', 'Estudios',
       'Baja Entalpia', 'Mediana Entalpia', 'Alta Entalpia',
       'Por iniciar obras', 'En operación', 'Inactivo'], dtype=object)

In [51]:
# Nombre Unico de Coloumnas
potencial_proc = potencial_proc.rename(columns = {
    'PROYECTO' : 'NOMBRE PROYECTO', 
    'CLASIFICACIÓN': 'PROBABILIDAD', 
    'TIPO': 'TIPO FUENTE ENER',
    'SUBCLASIFICACIÓN': 'NOTAS'})

# Asignacion de CVE_MUN como indice 
potencial_proc.set_index('CVE_MUN', inplace=True)
potencial_proc.head()


Out[51]:
NOMBRE PROYECTO TIPO FUENTE ENER PROBABILIDAD NOTAS CAPACIDAD INSTALABLE (MW) POTENCIAL (GWh/a) FUENTE
CVE_MUN
26002 Agua Prieta II Termosolar Parabólica Probado En construcción 12.000 18.86400 CFE
01002 Aguascalientes 1 Biogás Probable Motogenerador 1.510 8.83008 CFE
01002 Aguascalientes 2 Biogás Probable Motogenerador 1.512 8.83008 CFE
01002 Aguascalientes 3 Biogás Probable Biodigestor 3.000 17.52000 CFE
01005 Aguascalientes 4 Biogás Probable Biodigestor 0.093 0.54312 CFE

In [46]:
# Metadatos estándar
metadatos = {
    'Nombre del Dataset': 'Inventario Potencial de Energias Renovables',
    'Descripcion del dataset': '',
    'Disponibilidad Temporal': '2014',
    'Periodo de actualizacion': 'No Determinada',
    'Nivel de Desagregacion': 'Localidad, Municipal, Estatal, Nacional',
    'Notas': None,
    'Fuente': 'SENER',
    'URL_Fuente': 'https://dgel.energia.gob.mx/inere/',
    'Dataset base': None,
}

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


Out[46]:
Descripcion
Metadato
Nombre del Dataset Inventario Potencial de Energias Renovables
Descripcion del dataset
Disponibilidad Temporal 2014
Periodo de actualizacion No Determinada
Nivel de Desagregacion Localidad, Municipal, Estatal, Nacional
Notas None
Fuente SENER
URL_Fuente https://dgel.energia.gob.mx/inere/
Dataset base None

In [53]:
list(potencial_proc)


Out[53]:
['NOMBRE PROYECTO',
 'TIPO FUENTE ENER',
 'PROBABILIDAD',
 'NOTAS',
 'CAPACIDAD INSTALABLE (MW)',
 'POTENCIAL (GWh/a)',
 'FUENTE']

In [56]:
potencial_proc['FUENTE'].unique()


Out[56]:
array(['CFE', 'UNAM', 'CMM', 'CRE', 'IMTA'], dtype=object)

In [ ]:
# Descripciones de columnas
variables = {
    'NOMBRE PROYECTO': 'Nombre del proyecto de produccion de energia',
    'TIPO FUENTE ENER': 'Tipo de fuente de donde se obtiene la energía',
    'PROBABILIDAD': 'Certeza respecto al proyecto deproduccion de energía',
    'NOTAS': 'Notas',
    'CAPACIDAD INSTALABLE (MW)': 'Capacidad Instalable en Megawatts',
    'POTENCIAL (GWh/a) ' : 'Potencial de Generación de Gigawatts/hora al año',
    'FUENTE': 'Fuente de información'
}

# Convertir descripciones a dataframe
potencialvars = pd.DataFrame.from_dict(variables, orient='index', dtype=None)
potencialvars.columns = ['Descripcion']
potencialvars = potencialvars.rename_axis('Mnemonico')
potencialvars