Síntese da Operação

Para realizar a síntese da operação de um caso do DECOMP é necessário estar em um diretório no qual estão os principais arquivos de saída do modelo. Em geral, as variáveis da operação são extraídas dos arquivos relato.rvX e relato2.rvX. Além dos arquivos dos quais são extraídas as variáveis em si, são lidos também alguns arquivos de entrada do modelo, como o dadger.rvX e hidr.dat`. Neste contexto, basta fazer:

$ sintetizador-decomp operacao

O sintetizador irá exibir o log da sua execução:

>>> 2025-04-07 20:04:41,917 INFO: # Realizando síntese da OPERACAO #
>>> .
>>> .
>>> .
>>> 2025-04-07 20:07:38,946 INFO: Realizando sintese de GTER_UTE
>>> 2025-04-07 20:07:38,981 INFO: Tempo para obtenção dos dados do dec_oper_usit: 0.03 s
>>> 2025-04-07 20:07:39,016 INFO: Tempo para compactacao dos dados: 0.03 s
>>> 2025-04-07 20:07:39,093 INFO: Tempo para calculo dos limites: 0.08 s
>>> 2025-04-07 20:07:39,746 INFO: Tempo para preparacao para exportacao: 0.65 s
>>> 2025-04-07 20:07:39,806 INFO: Tempo para exportacao dos dados: 0.06 s
>>> 2025-04-07 20:07:39,806 INFO: Tempo para sintese de GTER_UTE: 0.86 s
>>> 2025-04-07 20:07:39,806 INFO: Realizando sintese de INT_SBP
>>> 2025-04-07 20:07:39,807 INFO: Lendo arquivo dec_oper_interc.csv
>>> 2025-04-07 20:07:46,525 INFO: Tempo para obtenção dos dados do dec_oper_interc: 6.72 s
>>> 2025-04-07 20:07:46,531 INFO: Tempo para compactacao dos dados: 0.01 s
>>> 2025-04-07 20:07:46,546 INFO: Tempo para calculo dos limites: 0.01 s
>>> 2025-04-07 20:07:46,657 INFO: Tempo para preparacao para exportacao: 0.11 s
>>> 2025-04-07 20:07:46,670 INFO: Tempo para exportacao dos dados: 0.01 s
>>> 2025-04-07 20:07:46,670 INFO: Tempo para sintese de INT_SBP: 6.86 s
>>> 2025-04-07 20:07:46,670 INFO: Realizando sintese de INTL_SBP
>>> 2025-04-07 20:07:46,793 INFO: Tempo para obtenção dos dados do dec_oper_interc: 0.12 s
>>> 2025-04-07 20:07:46,797 INFO: Tempo para compactacao dos dados: 0.00 s
>>> 2025-04-07 20:07:46,798 INFO: Tempo para calculo dos limites: 0.00 s
>>> 2025-04-07 20:07:46,862 INFO: Tempo para preparacao para exportacao: 0.06 s
>>> 2025-04-07 20:07:46,870 INFO: Tempo para exportacao dos dados: 0.01 s
>>> 2025-04-07 20:07:46,870 INFO: Tempo para sintese de INTL_SBP: 0.20 s
>>> 2025-04-07 20:07:47,894 INFO: Tempo para sintese da operacao: 185.98 s
>>> 2025-04-07 20:07:47,894 INFO: # Fim da síntese #

Os arquivos serão salvos no subdiretório sintese. Para realizar o processamento, pode ser utilizado o próprio python:

import plotly.express as px
import plotly.graph_objects as go
import pandas as pd

Para a síntese da operação é produzido um arquivo com as informações das sínteses que foram realizadas:

metadados = pd.read_parquet("sintese/METADADOS_OPERACAO.parquet")
print(metadados.head(10))
       chave     nome_curto_variavel  ... calculado limitado
0    CMO_SBM                     CMO  ...     False    False
1   CTER_UTE             Custo de GT  ...     False     True
2   CTER_SIN             Custo de GT  ...     False     True
3    COP_SIN                   COPER  ...     False     True
4    CFU_SIN                     CFU  ...     False     True
5  EARMI_REE             EAR Inicial  ...     False     True
6  EARMI_SBM             EAR Inicial  ...     False     True
7  EARMI_SIN             EAR Inicial  ...      True     True
8  EARPI_REE  EAR Percentual Inicial  ...     False     True
9  EARPI_SBM  EAR Percentual Inicial  ...     False     True

[10 rows x 8 columns]

Os arquivos com os nomes das sínteses de operação armazenam os dados de todos os cenários simulados.

cmo = pd.read_parquet("sintese/CMO_SBM.parquet")
earmf = pd.read_parquet("sintese/EARMF_SIN.parquet")
varpf = pd.read_parquet("sintese/VARPF_UHE.parquet")

O formato dos dados de CMO:

print(cmo.head(10))
   codigo_submercado  estagio  ... limite_inferior limite_superior
0                  1        1  ...            -inf             inf
1                  1        1  ...            -inf             inf
2                  1        1  ...            -inf             inf
3                  1        1  ...            -inf             inf
4                  1        1  ...            -inf             inf
5                  1        1  ...            -inf             inf
6                  1        1  ...            -inf             inf
7                  1        1  ...            -inf             inf
8                  1        1  ...            -inf             inf
9                  1        1  ...            -inf             inf

[10 rows x 10 columns]

Os tipos de dados da síntese de CMO:

codigo_submercado                  int64
estagio                            int64
data_inicio          datetime64[ns, UTC]
data_fim             datetime64[ns, UTC]
cenario                            int64
patamar                            int64
duracao_patamar                  float64
valor                            float64
limite_inferior                  float64
limite_superior                  float64
dtype: object

O formato dos dados de EARMF:

print(earmf.head(10))
   estagio               data_inicio  ... limite_inferior  limite_superior
0        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0
1        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0
2        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0
3        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0
4        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0
5        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0
6        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0
7        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0
8        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0
9        1 2025-03-01 00:00:00+00:00  ...         61475.0         291922.0

[10 rows x 9 columns]

Os tipos de dados da síntese de EARMF:

estagio                          int64
data_inicio        datetime64[ns, UTC]
data_fim           datetime64[ns, UTC]
cenario                          int64
patamar                          int64
duracao_patamar                float64
valor                          float64
limite_inferior                float64
limite_superior                float64
dtype: object

O formato dos dados de VARPF:

print(varpf.head(10))
   codigo_usina  codigo_ree  ...  limite_inferior  limite_superior
0             1          10  ...             -inf              inf
1             1          10  ...             -inf              inf
2             1          10  ...             -inf              inf
3             1          10  ...             -inf              inf
4             1          10  ...             -inf              inf
5             1          10  ...             -inf              inf
6             1          10  ...             -inf              inf
7             1          10  ...             -inf              inf
8             1          10  ...             -inf              inf
9             1          10  ...             -inf              inf

[10 rows x 12 columns]

Os tipos de dados da síntese de VARPF:

codigo_usina                       int64
codigo_ree                         int64
codigo_submercado                  int64
estagio                            int64
data_inicio          datetime64[ns, UTC]
data_fim             datetime64[ns, UTC]
cenario                            int64
patamar                            int64
duracao_patamar                  float64
valor                            float64
limite_inferior                  float64
limite_superior                  float64
dtype: object

De modo geral, os arquivos das sínteses de operação sempre possuem as colunas estagio, data_inicio, data_fim, cenario, patamar e valor. A depender se o arquivo é relativo a uma agregação espacial diferente de todo o SIN ou agregação temporal diferente do valor médio por estágio, existirão outras colunas adicionais para determinar de qual subconjunto da agregação o dado pertence. Por exemplo, no arquivo da síntese de CMO_SBM, existe uma coluna adicional de nome codigo_submercado.

A coluna de cenários contém não somente inteiros de 1 a N, onde N é o número de séries da simulação final do modelo.

cenarios = earmf["cenario"].unique().tolist()
print(cenarios)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143]

Através das estatísticas é possível fazer um gráfico de caixas, para ilustrar a dispersão da variável da operação com os cenários:

fig = px.box(earmf, x="data_inicio", y="valor")
fig


Para variáveis da operação que possuam diferentes subconjuntos, como os submercados, podem ser utilizados gráficos de violino para avaliação da dispersão nos cenários do 2º mês:

ultimo_estagio = cmo["estagio"].max()
cmos_2omes = cmo.loc[cmo["estagio"] == ultimo_estagio]
fig = px.violin(
    cmos_2omes,
    y="valor",
    color="codigo_submercado",
    box=True,
)
fig


Para dados por UHE, como o número de subconjuntos é muito grande, é possível fazer um subconjunto dos elementos de interesse para a visualização:

varpf_1omes = varpf.loc[
    (varpf["estagio"] < ultimo_estagio)
    & varpf["codigo_usina"].isin([6, 169, 251, 275])
]
fig = px.line(
    varpf_1omes,
    x="data_inicio",
    y="valor",
    facet_col_wrap=2,
    facet_col="codigo_usina",
)
fig


Além dos arquivos com as sínteses dos cenários, estão disponíveis também os arquivos que agregam estatísticas das previsões:

estatisticas_uhe = pd.read_parquet("sintese/ESTATISTICAS_OPERACAO_UHE.parquet")
print(estatisticas_uhe.head(10))
  variavel  codigo_usina  codigo_ree  ...  valor  limite_inferior limite_superior
0     EVER             1          10  ...    0.0              0.0             inf
1     EVER             1          10  ...    0.0              0.0             inf
2     EVER             1          10  ...    0.0              0.0             inf
3     EVER             1          10  ...    0.0              0.0             inf
4     EVER             1          10  ...    0.0              0.0             inf
5     EVER             1          10  ...    0.0              0.0             inf
6     EVER             1          10  ...    0.0              0.0             inf
7     EVER             1          10  ...    0.0              0.0             inf
8     EVER             1          10  ...    0.0              0.0             inf
9     EVER             1          10  ...    0.0              0.0             inf

[10 rows x 13 columns]

As informações dos arquivos de estatísticas são:

Index(['variavel', 'codigo_usina', 'codigo_ree', 'codigo_submercado',
       'estagio', 'data_inicio', 'data_fim', 'cenario', 'patamar',
       'duracao_patamar', 'valor', 'limite_inferior', 'limite_superior'],
      dtype='object')

Um arquivo único é gerado para as estatísticas de todas as variáveis, agregadas por cada elemento do sistema.:

print(estatisticas_uhe["variavel"].unique())
<StringArray>
[  'EVER', 'EVERNT',  'EVERT',   'GHID',   'QAFL',   'QDEF',   'QDES',
   'QEVP',   'QINC',   'QRET',   'QTUR',   'QVER',  'VARMF',  'VARMI',
  'VARPF',  'VARPI']
Length: 16, dtype: string

As estatísticas disponíveis são os valores mínimos, máximos, médios e quantis a cada 5 percentis para cada variável de cada elemento de sistema. No caso das UHEs:

print(estatisticas_uhe["cenario"].unique())
['max' 'mean' 'median' 'min' 'p10' 'p15' 'p20' 'p25' 'p30' 'p35' 'p40'
 'p45' 'p5' 'p55' 'p60' 'p65' 'p70' 'p75' 'p80' 'p85' 'p90' 'p95' 'std']

Através das estatísticas é possível fazer um gráfico de quantis, para ilustrar a dispersão da variável da operação com os cenários:

estatisticas_sin = pd.read_parquet("sintese/ESTATISTICAS_OPERACAO_SIN.parquet")
percentis = [col for col in estatisticas_sin["cenario"].unique() if "p" in col]
estatisticas_earmf = estatisticas_sin.loc[
    estatisticas_sin["variavel"] == "EARMF"
]
fig = go.Figure()
for p in percentis:
    earmf_p = estatisticas_earmf.loc[estatisticas_earmf["cenario"] == f"{p}"]
    print(earmf_p)
    fig.add_trace(
        go.Scatter(
            x=earmf_p["data_fim"],
            y=earmf_p["valor"],
            line={
                "color": "rgba(66, 135, 245, 0.3)",
                "width": 2,
            },
            name=f"p{p}",
            showlegend=False,
        )
    )
fig
     variavel  estagio  ... limite_inferior limite_superior
970     EARMF        1  ...         61475.0        291922.0
993     EARMF        2  ...         61475.0        291922.0
1016    EARMF        3  ...         61475.0        291922.0
1039    EARMF        4  ...         61475.0        291922.0
1062    EARMF        5  ...         61475.0        291922.0
1085    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
971     EARMF        1  ...         61475.0        291922.0
994     EARMF        2  ...         61475.0        291922.0
1017    EARMF        3  ...         61475.0        291922.0
1040    EARMF        4  ...         61475.0        291922.0
1063    EARMF        5  ...         61475.0        291922.0
1086    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
972     EARMF        1  ...         61475.0        291922.0
995     EARMF        2  ...         61475.0        291922.0
1018    EARMF        3  ...         61475.0        291922.0
1041    EARMF        4  ...         61475.0        291922.0
1064    EARMF        5  ...         61475.0        291922.0
1087    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
973     EARMF        1  ...         61475.0        291922.0
996     EARMF        2  ...         61475.0        291922.0
1019    EARMF        3  ...         61475.0        291922.0
1042    EARMF        4  ...         61475.0        291922.0
1065    EARMF        5  ...         61475.0        291922.0
1088    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
974     EARMF        1  ...         61475.0        291922.0
997     EARMF        2  ...         61475.0        291922.0
1020    EARMF        3  ...         61475.0        291922.0
1043    EARMF        4  ...         61475.0        291922.0
1066    EARMF        5  ...         61475.0        291922.0
1089    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
975     EARMF        1  ...         61475.0        291922.0
998     EARMF        2  ...         61475.0        291922.0
1021    EARMF        3  ...         61475.0        291922.0
1044    EARMF        4  ...         61475.0        291922.0
1067    EARMF        5  ...         61475.0        291922.0
1090    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
976     EARMF        1  ...         61475.0        291922.0
999     EARMF        2  ...         61475.0        291922.0
1022    EARMF        3  ...         61475.0        291922.0
1045    EARMF        4  ...         61475.0        291922.0
1068    EARMF        5  ...         61475.0        291922.0
1091    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
977     EARMF        1  ...         61475.0        291922.0
1000    EARMF        2  ...         61475.0        291922.0
1023    EARMF        3  ...         61475.0        291922.0
1046    EARMF        4  ...         61475.0        291922.0
1069    EARMF        5  ...         61475.0        291922.0
1092    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
978     EARMF        1  ...         61475.0        291922.0
1001    EARMF        2  ...         61475.0        291922.0
1024    EARMF        3  ...         61475.0        291922.0
1047    EARMF        4  ...         61475.0        291922.0
1070    EARMF        5  ...         61475.0        291922.0
1093    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
979     EARMF        1  ...         61475.0        291922.0
1002    EARMF        2  ...         61475.0        291922.0
1025    EARMF        3  ...         61475.0        291922.0
1048    EARMF        4  ...         61475.0        291922.0
1071    EARMF        5  ...         61475.0        291922.0
1094    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
980     EARMF        1  ...         61475.0        291922.0
1003    EARMF        2  ...         61475.0        291922.0
1026    EARMF        3  ...         61475.0        291922.0
1049    EARMF        4  ...         61475.0        291922.0
1072    EARMF        5  ...         61475.0        291922.0
1095    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
981     EARMF        1  ...         61475.0        291922.0
1004    EARMF        2  ...         61475.0        291922.0
1027    EARMF        3  ...         61475.0        291922.0
1050    EARMF        4  ...         61475.0        291922.0
1073    EARMF        5  ...         61475.0        291922.0
1096    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
982     EARMF        1  ...         61475.0        291922.0
1005    EARMF        2  ...         61475.0        291922.0
1028    EARMF        3  ...         61475.0        291922.0
1051    EARMF        4  ...         61475.0        291922.0
1074    EARMF        5  ...         61475.0        291922.0
1097    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
983     EARMF        1  ...         61475.0        291922.0
1006    EARMF        2  ...         61475.0        291922.0
1029    EARMF        3  ...         61475.0        291922.0
1052    EARMF        4  ...         61475.0        291922.0
1075    EARMF        5  ...         61475.0        291922.0
1098    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
984     EARMF        1  ...         61475.0        291922.0
1007    EARMF        2  ...         61475.0        291922.0
1030    EARMF        3  ...         61475.0        291922.0
1053    EARMF        4  ...         61475.0        291922.0
1076    EARMF        5  ...         61475.0        291922.0
1099    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
985     EARMF        1  ...         61475.0        291922.0
1008    EARMF        2  ...         61475.0        291922.0
1031    EARMF        3  ...         61475.0        291922.0
1054    EARMF        4  ...         61475.0        291922.0
1077    EARMF        5  ...         61475.0        291922.0
1100    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
986     EARMF        1  ...         61475.0        291922.0
1009    EARMF        2  ...         61475.0        291922.0
1032    EARMF        3  ...         61475.0        291922.0
1055    EARMF        4  ...         61475.0        291922.0
1078    EARMF        5  ...         61475.0        291922.0
1101    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]
     variavel  estagio  ... limite_inferior limite_superior
987     EARMF        1  ...         61475.0        291922.0
1010    EARMF        2  ...         61475.0        291922.0
1033    EARMF        3  ...         61475.0        291922.0
1056    EARMF        4  ...         61475.0        291922.0
1079    EARMF        5  ...         61475.0        291922.0
1102    EARMF        6  ...         61514.0        292129.0

[6 rows x 10 columns]


Também é possível fazer uma análise por meio de gráficos de linhas com áreas sombreadas, para ilustrar a cobertura dos cenários no domínio da variável:

fig = go.Figure()
earm_mean = estatisticas_earmf.loc[estatisticas_earmf["cenario"] == "mean"]
earm_max = estatisticas_earmf.loc[estatisticas_earmf["cenario"] == "max"]
earm_min = estatisticas_earmf.loc[estatisticas_earmf["cenario"] == "min"]
fig.add_trace(
    go.Scatter(
        x=earm_mean["data_fim"],
        y=earm_mean["valor"],
        line={
            "color": "rgba(66, 135, 245, 0.9)",
            "width": 4,
        },
        name="mean",
    )
)
fig.add_trace(
    go.Scatter(
        x=earm_min["data_fim"],
        y=earm_min["valor"],
        line={
            "color": "rgba(66, 135, 245, 0.9)",
            "width": 4,
        },
        line_color="rgba(66, 135, 245, 0.3)",
        fillcolor="rgba(66, 135, 245, 0.3)",
        name="min",
    )
)
fig.add_trace(
    go.Scatter(
        x=earm_max["data_fim"],
        y=earm_max["valor"],
        line={
            "color": "rgba(66, 135, 245, 0.9)",
            "width": 4,
        },
        line_color="rgba(66, 135, 245, 0.3)",
        fill="tonexty",
        name="max",
    )
)
fig


Total running time of the script: (0 minutes 0.564 seconds)

Gallery generated by Sphinx-Gallery