Análise das séries sintéticas de energia afluente

Os arquivos energiafXXX.dat contêm as séries sintéticas de energia natural afluente geradas pelo modelo NEWAVE durante a simulação forward. Estes arquivos são fundamentais para análise de cenários hidrológicos e avaliação da variabilidade energética do sistema. IMPORTANTE: Foi gerado um arquivo energiaf.dat reduzido utlizando o próprio módulo inewave para fins de demonstração com apenas 1 REE. Em um caso real, utilize o arquivo gerado pelo NEWAVE.

import plotly.express as px
import plotly.io as pio

from inewave.newave import Energiaf

pio.templates.default = "ggplot2"

# Leitura do arquivo energiaf
arq_energiaf = Energiaf.read("./newave/energiaf.dat")

Configuração da leitura de arquivos binários

IMPORTANTE: Os arquivos energiaf são binários e requerem configuração específica baseada nas dimensões do estudo. Estes parâmetros normalmente vêm do arquivo forwarh.dat ou são conhecidos do caso de estudo:

# Exemplo de configuração típica (ajustar conforme o caso)
numero_forwards = 200  # Número de séries forward
numero_rees = 12  # Número de REEs
numero_estagios = 60  # Número de estágios de planejamento
numero_estagios_th = 12  # Número de estágios considerados para tendência hidrológica (6 ou 12 geralmente)

print("Configuração da leitura:")
print(f"- Séries forward: {numero_forwards}")
print(f"- REEs: {numero_rees}")
print(f"- Estágios: {numero_estagios}")
print(f"- Estágios térmicos: {numero_estagios_th}")
Configuração da leitura:
- Séries forward: 200
- REEs: 12
- Estágios: 60
- Estágios térmicos: 12

Estrutura dos dados de energia

As séries sintéticas são organizadas por estágio, REE e série forward:

series = arq_energiaf.series
print(f"Total de registros de energia: {len(series)}")
print("\nPrimeiros registros:")
print(series.head())

print("\nEstatísticas básicas:")
print(series.describe())
Total de registros de energia: 172800

Primeiros registros:
   estagio  ree  serie         valor
0      -11    1      1   7274.313246
1      -11    1      2  11945.751618
2      -11    1      3   7437.112877
3      -11    1      4   7687.093101
4      -11    1      5   7788.548023

Estatísticas básicas:
             estagio            ree          serie         valor
count  172800.000000  172800.000000  172800.000000     56.000000
mean       24.500000       6.500000     100.500000   6303.242902
std        20.782665       3.452063      57.734472   2534.614664
min       -11.000000       1.000000       1.000000   3134.981601
25%         6.750000       3.750000      50.750000   3961.181539
50%        24.500000       6.500000     100.500000   5635.625119
75%        42.250000       9.250000     150.250000   7687.093101
max        60.000000      12.000000     200.000000  11945.751618

Análise por REE (Reservatório Equivalente de Energia)

Análise da distribuição de energia por REE:

print("Distribuição de energia por REE:")
energia_por_ree = (
    series.groupby("ree")
    .agg({"valor": ["count", "mean", "std", "min", "max"]})
    .round(2)
)
energia_por_ree.columns = [
    "registros",
    "media",
    "desvio",
    "minimo",
    "maximo",
]
print(energia_por_ree)
Distribuição de energia por REE:
     registros    media   desvio   minimo    maximo
ree
1           56  6303.24  2534.61  3134.98  11945.75
2            0      NaN      NaN      NaN       NaN
3            0      NaN      NaN      NaN       NaN
4            0      NaN      NaN      NaN       NaN
5            0      NaN      NaN      NaN       NaN
6            0      NaN      NaN      NaN       NaN
7            0      NaN      NaN      NaN       NaN
8            0      NaN      NaN      NaN       NaN
9            0      NaN      NaN      NaN       NaN
10           0      NaN      NaN      NaN       NaN
11           0      NaN      NaN      NaN       NaN
12           0      NaN      NaN      NaN       NaN

Análise temporal das séries

Avaliando a evolução da energia ao longo dos estágios:

# Energia média por estágio
energia_por_estagio = (
    series.groupby("estagio")["valor"].agg(["mean", "std"]).reset_index()
)

print("Energia média por estágio (primeiros 10 estágios):")
print(energia_por_estagio.head(10))

# Gráfico da evolução temporal
fig = px.line(
    energia_por_estagio,
    x="estagio",
    y="mean",
    title="Evolução da Energia Afluente Média por Estágio",
    labels={"mean": "Energia Média (MWmes)", "estagio": "Estágio"},
)
fig.add_scatter(
    x=energia_por_estagio["estagio"],
    y=energia_por_estagio["mean"] + energia_por_estagio["std"],
    mode="lines",
    line=dict(width=0),
    showlegend=False,
    hovertemplate=None,
    hoverinfo="skip",
)
fig.add_scatter(
    x=energia_por_estagio["estagio"],
    y=energia_por_estagio["mean"] - energia_por_estagio["std"],
    mode="lines",
    line=dict(width=0),
    fill="tonexty",
    fillcolor="rgba(0,100,80,0.2)",
    name="±1 Desvio Padrão",
    hovertemplate=None,
    hoverinfo="skip",
)
fig
Energia média por estágio (primeiros 10 estágios):
   estagio         mean          std
0      -11  6303.242902  2534.614664
1      -10          NaN          NaN
2       -9          NaN          NaN
3       -8          NaN          NaN
4       -7          NaN          NaN
5       -6          NaN          NaN
6       -5          NaN          NaN
7       -4          NaN          NaN
8       -3          NaN          NaN
9       -2          NaN          NaN


Análise de variabilidade entre séries

Comparando diferentes séries forward para avaliar a incerteza hidrológica:

# Selecionando um REE específico para análise detalhada
ree_analise = 1
series_ree = series[series["ree"] == ree_analise]

if len(series_ree) > 0:
    print(f"Análise de variabilidade - REE {ree_analise}:")

    # Estatísticas por série
    stats_por_serie = (
        series_ree.groupby("serie")["valor"].agg(["mean", "std"]).reset_index()
    )

    print("Estatísticas das séries forward:")
    print(
        f"- Energia média entre séries: {stats_por_serie['mean'].mean():.1f} MWmes"
    )
    print(
        f"- Desvio padrão entre médias: {stats_por_serie['mean'].std():.1f} MWmes"
    )
    print(
        f"- Coeficiente de variação: {stats_por_serie['mean'].std() / stats_por_serie['mean'].mean() * 100:.1f}%"
    )
Análise de variabilidade - REE 1:
Estatísticas das séries forward:
- Energia média entre séries: 6303.2 MWmes
- Desvio padrão entre médias: 2534.6 MWmes
- Coeficiente de variação: 40.2%

Análise sazonal

Identificando padrões sazonais nas séries sintéticas:

# Assumindo que os estágios representam meses (ajustar conforme necessário)
series_com_mes = series.copy()
series_com_mes["mes"] = ((series_com_mes["estagio"] - 1) % 12) + 1

# Energia média por mês
energia_mensal = (
    series_com_mes.groupby("mes")["valor"].agg(["mean", "std"]).reset_index()
)

meses_nomes = [
    "Jan",
    "Fev",
    "Mar",
    "Abr",
    "Mai",
    "Jun",
    "Jul",
    "Ago",
    "Set",
    "Out",
    "Nov",
    "Dez",
]
energia_mensal["mes_nome"] = energia_mensal["mes"].map(
    lambda x: meses_nomes[x - 1]
)

print("Padrão sazonal da energia afluente:")
print(energia_mensal[["mes_nome", "mean", "std"]].round(1))

# Gráfico sazonal
fig = px.bar(
    energia_mensal,
    x="mes_nome",
    y="mean",
    error_y="std",
    title="Padrão Sazonal da Energia Afluente",
    labels={"mean": "Energia Média (MWmes)", "mes_nome": "Mês"},
)
fig
Padrão sazonal da energia afluente:
   mes_nome    mean     std
0       Jan  6303.2  2534.6
1       Fev     NaN     NaN
2       Mar     NaN     NaN
3       Abr     NaN     NaN
4       Mai     NaN     NaN
5       Jun     NaN     NaN
6       Jul     NaN     NaN
7       Ago     NaN     NaN
8       Set     NaN     NaN
9       Out     NaN     NaN
10      Nov     NaN     NaN
11      Dez     NaN     NaN


Análise de cenários extremos

Identificando cenários de energia alta e baixa:

# Energia total por série (somando todos os REEs e estágios)
energia_total_serie = series.groupby("serie")["valor"].sum().reset_index()
energia_total_serie = energia_total_serie.sort_values("valor")

# Identificando cenários extremos
p10 = energia_total_serie["valor"].quantile(0.10)
p90 = energia_total_serie["valor"].quantile(0.90)

cenarios_secos = energia_total_serie[energia_total_serie["valor"] <= p10]
cenarios_umidos = energia_total_serie[energia_total_serie["valor"] >= p90]

print("Análise de cenários extremos:")
print(f"Cenários secos (≤P10): {len(cenarios_secos)} séries")
print(f"Cenários úmidos (≥P90): {len(cenarios_umidos)} séries")
print(f"Energia P10: {p10:.0f} MWmes")
print(f"Energia P90: {p90:.0f} MWmes")
print(f"Relação P90/P10: {p90 / p10:.2f}")
Análise de cenários extremos:
Cenários secos (≤P10): 144 séries
Cenários úmidos (≥P90): 22 séries
Energia P10: 0 MWmes
Energia P90: 7274 MWmes
/home/runner/work/inewave/inewave/examples/plot_energiaf.py:217: RuntimeWarning:

divide by zero encountered in scalar divide

Relação P90/P10: inf

Comparação entre REEs

Analisando correlações e diferenças entre REEs:

# Criando matriz REE x série para análise de correlação
pivot_energia = series.pivot_table(
    index=["serie", "estagio"], columns="ree", values="valor"
)

if len(pivot_energia.columns) > 1:
    # Matriz de correlação entre REEs
    correlacao_rees = pivot_energia.corr()

    print("Correlação entre REEs (primeiros 5x5):")
    print(correlacao_rees.iloc[:5, :5].round(3))

    # Contribuição de cada REE para o total
    contrib_ree = series.groupby("ree")["valor"].sum()
    contrib_ree_pct = (contrib_ree / contrib_ree.sum() * 100).round(1)

    print("\nContribuição percentual por REE:")
    for ree, pct in contrib_ree_pct.items():
        print(f"REE {ree}: {pct}%")

Processamento de dados para análises externas

Preparando dados para exportação ou análises complementares:

# Convertendo para formato pivot para análise em planilha
energia_pivot = series.pivot_table(
    index=["estagio"], columns=["ree", "serie"], values="valor"
)

print("Formato pivot para exportação:")
print(f"Dimensões: {energia_pivot.shape}")
print("Colunas (REE, Série):", energia_pivot.columns[:5].tolist())

# Resumo estatístico por REE
resumo_ree = (
    series.groupby("ree")["valor"]
    .agg([
        "count",
        "mean",
        "std",
        "min",
        "max",
        lambda x: x.quantile(0.1),  # P10
        lambda x: x.quantile(0.5),  # P50
        lambda x: x.quantile(0.9),  # P90
    ])
    .round(2)
)
resumo_ree.columns = [
    "registros",
    "media",
    "desvio",
    "minimo",
    "maximo",
    "P10",
    "P50",
    "P90",
]

print("\nResumo estatístico por REE:")
print(resumo_ree)
Formato pivot para exportação:
Dimensões: (1, 56)
Colunas (REE, Série): [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5)]

Resumo estatístico por REE:
     registros    media   desvio   minimo    maximo      P10      P50       P90
ree
1           56  6303.24  2534.61  3134.98  11945.75  3465.22  5635.63  10097.14
2            0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
3            0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
4            0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
5            0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
6            0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
7            0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
8            0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
9            0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
10           0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
11           0      NaN      NaN      NaN       NaN      NaN      NaN       NaN
12           0      NaN      NaN      NaN       NaN      NaN      NaN       NaN

Exportação de resultados processados

# Exemplo de como exportar dados processados
print("\nOpções de exportação:")
print("1. Séries originais: arq_energiaf.series")
print("2. Formato pivot: energia_pivot")
print("3. Resumo por REE: resumo_ree")
print("4. Energia por estágio: energia_por_estagio")

# Para salver em CSV (exemplo):
# energia_por_estagio.to_csv('energia_por_estagio.csv', index=False)
# resumo_ree.to_csv('resumo_energia_ree.csv')
Opções de exportação:
1. Séries originais: arq_energiaf.series
2. Formato pivot: energia_pivot
3. Resumo por REE: resumo_ree
4. Energia por estágio: energia_por_estagio

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

Gallery generated by Sphinx-Gallery