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)

Gallery generated by Sphinx-Gallery