Nota
Go to the end to download the full example code.
Síntese da Execução¶
Para realizar a síntese da execução de um caso do NEWAVE é necessário estar em um diretório
no qual estão os principais arquivos de saída do modelo. Por exemplo, para se realizar a
síntese de tempo de execução, é necessario o newave.tim. Para a síntese da convergência,
o pmo.dat. Neste contexto, basta fazer:
$ sintetizador-newave execucao
O sintetizador irá exibir o log da sua execução:
>>> 2024-04-22 10:33:42,304 INFO: # Realizando síntese da EXECUÇÃO #
>>> 2024-04-22 10:33:42,306 INFO: Realizando síntese de PROGRAMA
>>> 2024-04-22 10:33:42,315 INFO: Tempo para sintese de PROGRAMA: 0.01 s
>>> 2024-04-22 10:33:42,315 INFO: Realizando síntese de CONVERGENCIA
>>> 2024-04-22 10:33:42,941 INFO: Tempo para sintese de CONVERGENCIA: 0.63 s
>>> 2024-04-22 10:33:42,942 INFO: Realizando síntese de TEMPO
>>> 2024-04-22 10:33:42,946 INFO: Tempo para sintese de TEMPO: 0.00 s
>>> 2024-04-22 10:33:42,946 INFO: Realizando síntese de CUSTOS
>>> 2024-04-22 10:33:42,948 INFO: Tempo para sintese de CUSTOS: 0.00 s
>>> 2024-04-22 10:33:42,951 INFO: Tempo para sintese da execucao: 0.65 s
>>> 2024-04-22 10:33:42,951 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. Os dados são lidos como Polars DataFrames:
import polars as pl
import plotly.express as px
convergencia = pl.read_parquet("sintese/CONVERGENCIA.parquet")
custos = pl.read_parquet("sintese/CUSTOS.parquet")
tempo = pl.read_parquet("sintese/TEMPO.parquet")
O formato dos dados de CONVERGÊNCIA:
print(convergencia.head(10))
shape: (10, 5)
┌──────────┬──────────┬────────────┬──────────┬───────┐
│ iteracao ┆ zinf ┆ delta_zinf ┆ zsup ┆ tempo │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ f64 ┆ f64 ┆ f64 ┆ i64 │
╞══════════╪══════════╪════════════╪══════════╪═══════╡
│ 1 ┆ 38352.81 ┆ null ┆ 45186.18 ┆ 8 │
│ 2 ┆ 39662.03 ┆ 3.414 ┆ 41338.57 ┆ 5 │
│ 3 ┆ 39665.26 ┆ 0.008 ┆ 39660.48 ┆ 6 │
│ 4 ┆ 40458.95 ┆ 2.001 ┆ 35665.87 ┆ 6 │
│ 5 ┆ 40510.69 ┆ 0.128 ┆ 35470.21 ┆ 6 │
│ 6 ┆ 40619.3 ┆ 0.268 ┆ 39362.9 ┆ 6 │
│ 7 ┆ 40620.26 ┆ 0.002 ┆ 38210.32 ┆ 8 │
│ 8 ┆ 40621.08 ┆ 0.002 ┆ 46657.1 ┆ 9 │
│ 9 ┆ 40789.08 ┆ 0.414 ┆ 52822.94 ┆ 7 │
│ 10 ┆ 40805.4 ┆ 0.04 ┆ 40996.3 ┆ 10 │
└──────────┴──────────┴────────────┴──────────┴───────┘
O formato dos dados de CUSTOS:
print(custos.head(10))
shape: (10, 3)
┌───────────────────┬────────────────┬───────────────┐
│ parcela ┆ valor_esperado ┆ desvio_padrao │
│ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ f64 │
╞═══════════════════╪════════════════╪═══════════════╡
│ GERACAO TERMICA ┆ 21045.13 ┆ 0.0 │
│ DEFICIT ┆ 0.0 ┆ 0.0 │
│ VERTIMENTO ┆ 0.0 ┆ 0.0 │
│ EXCESSO ENERGIA ┆ 0.0 ┆ 0.0 │
│ VIOLACAO CAR ┆ 0.0 ┆ 0.0 │
│ VIOLACAO SAR ┆ 0.0 ┆ 0.0 │
│ VIOL. OUTROS USOS ┆ 0.0 ┆ 0.0 │
│ VIOLACAO EVMIN ┆ 0.0 ┆ 0.0 │
│ VIOLACAO VZMIN ┆ 2976.33 ┆ 611.93 │
│ INTERCAMBIO ┆ 0.97 ┆ 0.04 │
└───────────────────┴────────────────┴───────────────┘
O formato dos dados de TEMPO:
print(tempo.head(5))
shape: (4, 3)
┌─────────────────────┬────────┬───────────────────┐
│ etapa ┆ tempo ┆ __index_level_0__ │
│ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ i64 │
╞═════════════════════╪════════╪═══════════════════╡
│ Leitura de Dados ┆ 0.0 ┆ 0 │
│ Calculos Iniciais ┆ 905.0 ┆ 1 │
│ Calculo da Politica ┆ 6131.0 ┆ 2 │
│ Simulacao Final ┆ 901.0 ┆ 3 │
└─────────────────────┴────────┴───────────────────┘
Cada arquivo pode ser visualizado de diferentes maneiras, a depender da aplicação. Por exemplo, é comum avaliar a convergência do modelo através da variação do Zinf. O plotly aceita Polars DataFrames diretamente:
fig = px.line(
convergencia,
x="iteracao",
y="delta_zinf",
)
fig
Quando se analisam os custos de cada fonte, geralmente são feitos gráficos de barras empilhadas ou setores:
fig = px.pie(
custos.filter(pl.col("valor_esperado") > 0),
values="valor_esperado",
names="parcela",
)
fig
Uma abordagem semelhante é utilizada na análise do tempo de execução.
A coluna tempo está em segundos (float64); a conversão para horas e o label
formatado são calculados com expressões nativas do Polars:
from datetime import timedelta # noqa: E402
tempo = tempo.with_columns(
(pl.col("tempo") / 3600).alias("tempo_horas"),
pl.col("tempo")
.map_elements(
lambda s: str(timedelta(seconds=int(s))), return_dtype=pl.String
)
.alias("label"),
)
fig = px.bar(
tempo,
x="etapa",
y="tempo_horas",
text="label",
barmode="group",
)
fig
Total running time of the script: (0 minutes 0.104 seconds)