Nota
Go to the end to download the full example code.
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.
[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:
print(estatisticas_uhe.columns)
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)