Perguntas Frequentes (FAQ)¶
Esta página reúne as dúvidas mais comuns dos usuários do inewave, organizadas por tema. Se a sua dúvida não estiver listada aqui, consulte as outras seções da documentação ou abra uma discussão no repositório do projeto.
Ver também
Instalação — instruções detalhadas de instalação.
Tutorial — exemplos de uso dos principais padrões da biblioteca.
Arquitetura do inewave — visão geral da arquitetura interna do inewave.
Instalação¶
Como instalo o inewave?
A forma recomendada é instalar a versão distribuída no PyPI com pip:
pip install inewave
Para garantir que está usando a versão mais recente, adicione a flag --upgrade:
pip install --upgrade inewave
Ver também
Instalação — detalhes completos sobre instalação, incluindo ambientes virtuais.
Como instalo uma versão específica do inewave?
Informe o número da versão desejada diretamente no comando de instalação:
pip install inewave==1.12.0
Versões disponíveis podem ser consultadas na página do projeto no PyPI.
Qual é a versão mínima do Python necessária para usar o inewave?
O inewave requer Python >= 3.11. Versões anteriores não são suportadas. O projeto é testado com Python 3.11, 3.12, 3.13 e 3.14.
Se ao tentar instalar você receber um erro indicando que a versão do Python é incompatível, verifique a versão instalada com:
python --version
Como instalo o inewave usando o uv?
O uv é um gerenciador de pacotes Python de alta
performance e pode ser usado como alternativa ao pip:
uv pip install inewave
Para criar um projeto novo e adicionar o inewave como dependência:
uv init meu-projeto
cd meu-projeto
uv add inewave
Uso Geral¶
Como faço a leitura de um arquivo?
A leitura é sempre feita pelo método de classe read, passando o caminho do arquivo:
from inewave.newave import Dger
arq = Dger.read("./dger.dat")
O método retorna uma instância da classe com todos os dados do arquivo já parseados. A maioria dos arquivos não exige argumentos adicionais além do caminho.
Ver também
Tutorial — exemplos de leitura com e sem argumentos adicionais.
Como faço a escrita de um arquivo de entrada após modificá-lo?
A escrita é feita pelo método de instância write, chamado sobre o objeto retornado
pelo read:
from inewave.newave import Vazoes
arq_vazoes = Vazoes.read("./vazoes.dat")
# Modifica os dados: eleva todas as vazões em 10%
arq_vazoes.vazoes *= 1.1
# Persiste o arquivo modificado
arq_vazoes.write("./vazoes_modificadas.dat")
Note que read é um método de classe (chamado em Vazoes.read(...)), enquanto
write é um método de instância (chamado em arq_vazoes.write(...)).
Por que os arquivos de saída do NWLISTOP e do NWLISTCF não têm método write()?
Os arquivos produzidos pelo NWLISTOP e pelo NWLISTCF são arquivos de saída do modelo NEWAVE — eles são gerados automaticamente pela simulação e não fazem sentido ser reescritos pelo usuário. Por esse motivo, o inewave implementa apenas a leitura para esses arquivos.
Se você tentar chamar write em uma instância de um arquivo de saída, receberá uma
exceção indicando que a operação não é suportada. Consulte a documentação da classe
específica para verificar se write está disponível.
Como acesso os dados de um arquivo como um DataFrame do pandas?
As propriedades das classes retornam DataFrame para dados tabulares.
O nome da propriedade geralmente reflete o conteúdo do dado:
from inewave.newave import Vazoes
arq_vazoes = Vazoes.read("./vazoes.dat")
# Retorna um DataFrame com as vazões históricas
df = arq_vazoes.vazoes
print(df.head())
Para dados escalares (um único valor numérico, string ou data), a propriedade retorna
o tipo Python correspondente (int, float, str, etc.).
Como leio um arquivo que não está na codificação padrão (UTF-8)?
Alguns arquivos gerados por versões antigas do NEWAVE usam a codificação latin-1
(ISO-8859-1). O método read aceita o argumento encoding para esses casos:
from inewave.newave import Hidr
arq_hidr = Hidr.read("./hidr.dat", encoding="latin-1")
Consulte a documentação da classe específica para saber qual encoding ela usa por padrão.
Compatibilidade com Versões do NEWAVE¶
Quais versões do NEWAVE são suportadas pelo inewave?
O inewave suporta os formatos de arquivo de múltiplas versões do modelo NEWAVE. As versões com suporte variam por arquivo — algumas classes oferecem suporte a uma única versão (a mais recente), enquanto outras suportam múltiplos formatos, especialmente quando o layout do arquivo foi alterado entre versões do modelo.
As classes que suportam múltiplos formatos expõem o atributo de classe VERSIONS,
que lista as versões disponíveis:
from inewave.nwlistop import Cmargmed
print(Cmargmed.VERSIONS)
# Exemplo de saída: {'28': ..., '29.4.1': ...}
Como especifico a versão do NEWAVE ao ler um arquivo?
Use o argumento nomeado version= no método read:
from inewave.nwlistop import Cmargmed
# Arquivo gerado com NEWAVE versão 28
arq_v28 = Cmargmed.read("./cmarg001-med.out", version="28")
# Arquivo gerado com a versão mais recente (29.4.1)
arq_atual = Cmargmed.read("./cmarg001-med.out", version="29.4.1")
Se version= for omitido, o inewave utiliza o formato padrão configurado para a
classe, que geralmente corresponde à versão mais recente suportada.
Ver também
Tutorial — exemplo completo de leitura com seleção de versão usando o pmo.dat
para determinar a versão do modelo automaticamente.
Qual é a relação entre a versão do cfinterface e a compatibilidade de versões do NEWAVE?
O cfinterface é o framework subjacente ao inewave
que implementa o mecanismo de suporte a múltiplas versões de arquivo. O atributo
VERSIONS e o argumento version= no read só estão disponíveis a partir da
versão 1.9.0 do cfinterface.
O inewave declara a dependência cfinterface>=1.9.0 para garantir que essa
funcionalidade esteja sempre disponível. Se você vir erros relacionados ao atributo
VERSIONS ou ao argumento version=, verifique a versão instalada do cfinterface:
pip show cfinterface
Resolução de Problemas¶
Recebo ImportError ao tentar importar uma classe do inewave. O que fazer?
Verifique se o inewave está corretamente instalado no ambiente Python ativo:
pip show inewave
Se o pacote não for encontrado, instale-o com pip install inewave.
Caso o erro mencione cfinterface, pode haver um conflito de versão. Verifique a
versão instalada do cfinterface:
pip show cfinterface
A versão instalada deve satisfazer cfinterface>=1.9.0. Se for menor, atualize com:
pip install --upgrade cfinterface
Recebo UnicodeDecodeError ao ler um arquivo. Como resolver?
Esse erro ocorre quando o arquivo foi gerado com uma codificação diferente da esperada
pela classe. Tente passar explicitamente o encoding latin-1:
from inewave.newave import Hidr
arq_hidr = Hidr.read("./hidr.dat", encoding="latin-1")
Se o erro persistir com latin-1, tente cp1252 (Windows-1252), que é comum em
arquivos gerados em ambientes Windows:
arq_hidr = Hidr.read("./hidr.dat", encoding="cp1252")
Recebo AttributeError ou KeyError ao acessar uma propriedade. O que pode ser?
As causas mais comuns são:
Versão incorreta: o arquivo foi lido sem especificar o argumento
version=, mas o formato do arquivo corresponde a uma versão diferente da padrão. Consulte o atributoVERSIONSda classe e passe a versão correta noread.Arquivo corrompido ou incompleto: o arquivo no disco pode estar truncado ou ter sido gerado por uma execução parcial do NEWAVE. Verifique o arquivo com um editor de texto.
Propriedade não disponível nessa versão: algumas propriedades só existem em determinadas versões do formato de arquivo. Consulte a documentação da classe para verificar a disponibilidade por versão.
O arquivo existe em disco, mas o inewave retorna um erro de arquivo não encontrado. Por quê?
Verifique se o caminho passado ao read está correto em relação ao diretório de
trabalho atual. O inewave repassa o caminho diretamente ao cfinterface, que usa a
semântica padrão do sistema operacional para resolução de caminhos.
Uma prática recomendada é usar caminhos absolutos ou construir caminhos com
pathlib.Path:
from pathlib import Path
from inewave.newave import Dger
caminho = Path("/home/usuario/casos/pmo_abril_2024/dger.dat")
arq = Dger.read(caminho)
Desempenho¶
Por que a primeira importação do inewave é lenta?
O inewave utiliza o padrão de lazy import (importação preguiçosa) nos módulos
inewave.newave e inewave.nwlistop. Isso significa que as classes de arquivo
não são carregadas na memória no momento em que você escreve
import inewave.newave — elas são carregadas individualmente apenas quando você
acessa cada classe pela primeira vez.
Portanto, a “lentidão” percebida na primeira importação é, na verdade, o custo de carregar o módulo específico da classe que você está usando. Acessos subsequentes à mesma classe são instantâneos, pois o módulo já está em cache.
Ver também
Mecanismo de Lazy Import — explicação detalhada do mecanismo de lazy import.
Como otimizar o processamento de um grande número de arquivos?
Para processar muitos arquivos do mesmo tipo em sequência, as principais estratégias são:
Reutilize a importação: importe a classe fora do loop para que o custo de lazy import ocorra apenas uma vez:
from inewave.nwlistop import Cmargmed
resultados = []
for caminho in lista_de_arquivos:
arq = Cmargmed.read(caminho)
resultados.append(arq.valores)
Paralelismo com multiprocessing: como cada chamada a
readé independente e não há estado global compartilhado entre instâncias, é seguro paralelizar a leitura usandomultiprocessing.Poolouconcurrent.futures.ProcessPoolExecutor.
Nota
Um guia completo de otimização de desempenho, com benchmarks e estratégias detalhadas de paralelismo, estará disponível na seção Desempenho da documentação.