ESTADISTICAS

Automatización de Análisis Energético con PyDataXM


1. Introducción

El presente sistema automatiza la consulta, procesamiento y análisis de datos energéticos utilizando la API de XM a través de la librería PyDataXM. Esta herramienta permite obtener información clave sobre el mercado eléctrico colombiano, incluyendo el consumo de combustible, generación de energía, precios de bolsa, embalses y demanda del Sistema Interconectado Nacional (SIN).

Este proceso es fundamental para garantizar la eficiencia operativa y la toma de decisiones basada en datos en tiempo real dentro del sector eléctrico. La automatización facilita el acceso a información confiable, agiliza el análisis de datos históricos y permite detectar tendencias críticas para la planificación energética.


2. Objetivo del Sistema

El sistema tiene como propósito principal:

  1. Automatizar la consulta de datos energéticos desde la API de XM mediante la librería PyDataXM.
  2. Realizar un análisis detallado del consumo de combustible y la generación eléctrica.
  3. Monitorear indicadores clave, como los precios de la bolsa, los niveles de embalses y la demanda eléctrica.
  4. Exportar los resultados a un archivo Excel con múltiples hojas para facilitar el análisis y la visualización de tendencias.

3. Descripción General del Sistema

El sistema está compuesto por seis módulos principales:

  1. logger(): Configuración del sistema de registro de eventos y errores.
  2. decoratortimeprocess(func): Decorador para medir el tiempo de ejecución de las funciones.
  3. Funciones de consulta de datos desde la API de XM:
  4. consumo_combustible(): Consulta y analiza el consumo de combustible (MBTU) por recurso.
  5. generacion(): Obtiene los datos de generación eléctrica por recurso.
  6. indicadores(): Extrae información sobre los precios de bolsa.
  7. embalses(): Analiza los niveles de embalses y aportes hídricos.
  8. DemaSIN(): Obtiene los valores de demanda del sistema interconectado nacional (SIN).
  9. main(): Ejecuta el flujo completo, genera el archivo Excel con los datos y almacena los resultados.

4. Configuración Inicial

4.1 Requisitos del Sistema

Para utilizar este sistema, es necesario contar con:

  • Python 3.8 o superior.
  • Librerías requeridas:
    pip install pydataxm pandas openpyxl
    
  • Acceso a la API de XM con permisos para consultar datos históricos.

4.2 Estructura del Proyecto

La estructura del sistema es la siguiente:

/analisis_energetico.py
/logs/
  ├── Ejecucion.log
/resultados/
  ├── Estadisticas.xlsx

5. Descripción Detallada de los Módulos

5.1 logger()

Configura un sistema de registro que almacena eventos en un archivo Ejecucion.log.

def logger():
    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    log_path = os.path.join(os.path.dirname(__file__), 'Ejecucion.log')
    handler = logging.FileHandler(log_path)
    handler.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    return logger

5.2 decoratortimeprocess(func)

Mide el tiempo de ejecución de cada función y lo registra en el log.

def decoratortimeprocess(func):
    def wrapper(*args, **kwargs):
        start = dt.datetime.now()
        result = func(*args, **kwargs)
        end = dt.datetime.now()
        logger().info(f'Tiempo de ejecución de la función {func.__name__}: {end - start}')
        return result
    return wrapper

5.3 consumo_combustible()

Obtiene el consumo de combustible (MBTU) por recurso y lo filtra para incluir solo la planta TESORITO.

@decoratortimeprocess
def consumo_combustible():
    df_consulta = api_XM.request_data(
        'ConsCombustibleMBTU',
        'Recurso',
        dt.date(*periodo_inicial),
        dt.date(*periodo_final))

    df_consumo_combustible = pd.merge(df_consulta, df_sistema, left_on=['Values_code'], right_on=['Values_Code'], how='left')
    df_consumo_combustible['Consumo'] = df_consumo_combustible.filter(like='Values_Hour').sum(axis=1)

    df_consumo_combustible = df_consumo_combustible[df_consumo_combustible['Values_Name_y'].str.contains("TESORITO", regex=False, na=False, case=False)]
    df_consumo_combustible.drop(columns=['Id_x', 'Values_code', 'Id_y', 'Values_Code'], inplace=True)

    return df_consumo_combustible

5.4 generacion()

Consulta la generación de energía por recurso y la filtra por la planta TESORITO.

@decoratortimeprocess
def generacion():
    df_consulta = api_XM.request_data(
        'Gene',
        'Recurso',
        dt.date(*periodo_inicial),
        dt.date(*periodo_final))

    df_generacion = pd.merge(df_consulta, df_sistema, left_on=['Values_code'], right_on=['Values_Code'], how='left')
    df_generacion['Generación'] = df_generacion.filter(like='Values_Hour').sum(axis=1)

    df_generacion = df_generacion[df_generacion['Values_Name'].str.contains("TESORITO", regex=False, na=False, case=False)]
    df_generacion.drop(columns=['Id_x', 'Values_code', 'Id_y', 'Values_Code'], inplace=True)

    return df_generacion

5.5 indicadores()

Obtiene los precios de la bolsa nacional y su promedio ponderado.

@decoratortimeprocess
def indicadores():
    df_PrecBolsNaci = api_XM.request_data('PrecBolsNaci', 'Sistema', dt.date(*periodo_inicial), dt.date(*periodo_final))
    df_PPPrecBolsNaci = api_XM.request_data('PPPrecBolsNaci', 'Sistema', dt.date(*periodo_inicial), dt.date(*periodo_final))

    df_PrecBolsNaci['PrecBolsNaci'] = df_PrecBolsNaci.filter(like='Values_Hour').mean(axis=1)
    df_final = pd.merge(df_PrecBolsNaci, df_PPPrecBolsNaci, on='Date', how='left')
    df_final.rename(columns={'Value': 'PPPrecBolsNaci'}, inplace=True)

    return df_final[['Date', 'PrecBolsNaci', 'PPPrecBolsNaci']]

5.6 main()

Ejecuta el flujo completo y guarda los resultados en un archivo Excel.

@decoratortimeprocess
def main():
    usuario = os.getlogin()
    file_estadisticas = os.path.join(f"C:\\Users\\{usuario}\\OneDrive - GEAM\\Operaciones GEAM\\Gestion\\Despacho Nal", "Estadisticas.xlsx")

    if os.path.exists(file_estadisticas):
        os.remove(file_estadisticas)

    df_consumo = consumo_combustible()
    df_generacion = generacion()
    df_indicadores = indicadores()

    with pd.ExcelWriter(file_estadisticas) as writer:
        df_consumo.to_excel(writer, sheet_name='Consumo_combustible')
        df_generacion.to_excel(writer, sheet_name='Generacion')
        df_indicadores.to_excel(writer, sheet_name='Indicadores')

if __name__ == '__main__':
    main()

6. Conclusión

Este sistema proporciona una automatización eficiente para el análisis de datos energéticos en el mercado eléctrico colombiano. Al integrar la API de XM con herramientas de procesamiento de datos en Python, se logra una recopilación rápida y precisa de información crítica para la toma de decisiones estratégicas.