Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions idessem/dessem/modelos/pdo_cmosist.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from cfinterface.components.integerfield import IntegerField
from cfinterface.components.literalfield import LiteralField
from cfinterface.components.floatfield import FloatField
from cfinterface.components.line import Line
from idessem.dessem.modelos.blocos.tabelacsv import TabelaCSV


class TabelaPdoCmosist(TabelaCSV):
"""
Bloco com as informações da tabela do arquivo PDO_CMOSIST.
"""

BEGIN_PATTERN = "------;-------;"
LINE_MODEL = Line(
[
IntegerField(size=6),
LiteralField(size=7),
LiteralField(size=6),
FloatField(size=15, decimal_digits=2),
FloatField(size=15, decimal_digits=2),
],
delimiter=";",
)
COLUMN_NAMES = [
"estagio",
"nome_patamar",
"nome_submercado",
"cmo",
"pi_demanda",
]
END_PATTERN = ""
39 changes: 39 additions & 0 deletions idessem/dessem/modelos/pdo_elev.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from cfinterface.components.integerfield import IntegerField
from cfinterface.components.literalfield import LiteralField
from cfinterface.components.floatfield import FloatField
from cfinterface.components.line import Line
from idessem.dessem.modelos.blocos.tabelacsv import TabelaCSV


class TabelaPdoElev(TabelaCSV):
"""
Bloco com as informações da tabela do arquivo PDO_ELEV.
"""

BEGIN_PATTERN = "------;-------;"
LINE_MODEL = Line(
[
IntegerField(size=6),
LiteralField(size=7),
IntegerField(size=6),
LiteralField(size=14),
LiteralField(size=6),
FloatField(size=13, decimal_digits=1),
FloatField(size=13, decimal_digits=1),
FloatField(size=13, decimal_digits=1),
FloatField(size=14, decimal_digits=2),
],
delimiter=";",
)
COLUMN_NAMES = [
"estagio",
"nome_patamar",
"codigo_usina",
"nome_usina",
"nome_submercado",
"bombeamento_minimo",
"bombeamento",
"bombeamento_maximo",
"consumo",
]
END_PATTERN = ""
99 changes: 99 additions & 0 deletions idessem/dessem/modelos/pdo_oper_usih.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
from cfinterface.components.integerfield import IntegerField
from cfinterface.components.literalfield import LiteralField
from cfinterface.components.floatfield import FloatField
from cfinterface.components.line import Line
from idessem.dessem.modelos.blocos.tabelacsv import TabelaCSV


class TabelaPdoOperUsih(TabelaCSV):
"""
Bloco com as informações da tabela do arquivo PDO_OPER_USIH.
"""

BEGIN_PATTERN = "-----;-----;"
LINE_MODEL = Line(
[
IntegerField(size=5),
IntegerField(size=5),
IntegerField(size=5),
LiteralField(size=14),
LiteralField(size=8),
FloatField(size=10, decimal_digits=2),
FloatField(size=10, decimal_digits=2),
FloatField(size=10, decimal_digits=2),
FloatField(size=10, decimal_digits=2),
FloatField(size=10, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=12, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=12, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=9, decimal_digits=2),
FloatField(size=12, decimal_digits=2),
FloatField(size=12, decimal_digits=2),
FloatField(size=12, decimal_digits=2),
FloatField(size=12, decimal_digits=2),
FloatField(size=10, decimal_digits=2),
FloatField(size=10, decimal_digits=2),
FloatField(size=10, decimal_digits=2),
FloatField(size=10, decimal_digits=2),
FloatField(size=20, decimal_digits=2),
],
delimiter=";",
)
COLUMN_NAMES = [
"estagio",
"patamar",
"codigo_usina",
"nome_usina",
"nome_submercado",
"volume_util_inicial",
"volume_util_inicial_p",
"volume_util_final",
"volume_util_final_p",
"volume_util_maximo",
"vazao_incremental_natural",
"volume_incremental_natural",
"vazao_retirada_para_usos_alternativos",
"volume_retirado_para_usos_alternativos",
"vazao_evaporada",
"volume_evaporado",
"vazao_montante",
"volume_montante",
"vazao_montante_periodos_passados",
"volume_montante_periodos_passados",
"vazao_turbinada",
"vazao_turbinada_maxima",
"engolimento_maximo",
"volume_turbinado",
"vazao_vertida",
"volume_vertido",
"vazao_desviada",
"volume_desviado",
"vazao_bombeada",
"volume_bombeado",
"taxa_enchimento_volume_morto",
"volume_enchimento_volume_morto",
"taxa_descarga_fundo",
"volume_descaga_fundo",
"geracao",
"geracao_maxima",
"geracao_minima",
"potencia_instalada",
"valor_agua",
]
END_PATTERN = ""
38 changes: 38 additions & 0 deletions idessem/dessem/pdo_cmosist.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from idessem.dessem.modelos.pdo_cmosist import TabelaPdoCmosist
from idessem.dessem.modelos.arquivos.arquivocsv import (
DataEstudo,
VersaoModelo,
ArquivoCSV,
)


class PdoCmosist(ArquivoCSV):
"""
Armazena o custo marginal da operação (CMO) e o valor da variável
dual associada à equação de atendimento à demanda ("Pi" da demanda)
para cada estágio e cada submercado.

Essa classe lida com as informações de saída fornecidas pelo arquivo PDO_CMOSIST.
"""

BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoCmosist]
ENCODING = "iso-8859-1"

@property
def tabela(self):
"""
Obtém a tabela com o custo marginal da operação (CMO) e o valor
da variável dual associada à equação de atendimento à demanda
("Pi" da demanda).

- estagio (`int`)
- nome_patamar (`str`)
- nome_submercado (`str`)
- cmo (`float`)
- pi_demanda (`float`)

:return: A tabela como um dataframe
:rtype: pd.DataFrame | None

"""
return self._tabela()
37 changes: 37 additions & 0 deletions idessem/dessem/pdo_elev.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from idessem.dessem.modelos.pdo_elev import TabelaPdoElev
from idessem.dessem.modelos.arquivos.arquivocsv import (
DataEstudo,
VersaoModelo,
ArquivoCSV,
)


class PdoElev(ArquivoCSV):
"""
Armazena os dados das saídas referentes às usinas elevatórias.

Essa classe lida com as informações de saída fornecidas pelo arquivo PDO_ELEV.
"""

BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoElev]
ENCODING = "iso-8859-1"

@property
def tabela(self):
"""
Obtém a tabela com informações referentes à operação das usinas elevatórias.

- estagio (`int`)
- nome_patamar (`int`),
- codigo_usina (`int`)
- nome_usina (`str`)
- nome_submercado (`str`)
- bombeamento_minimo (`float`)
- bombeamento (`float`)
- bombeamento_maximo (`float`)
- consumo (`float`)

:return: A tabela como um dataframe
:rtype: pd.DataFrame | None
"""
return self._tabela()
67 changes: 67 additions & 0 deletions idessem/dessem/pdo_oper_usih.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from idessem.dessem.modelos.pdo_oper_usih import TabelaPdoOperUsih
from idessem.dessem.modelos.arquivos.arquivocsv import (
DataEstudo,
VersaoModelo,
ArquivoCSV,
)


class PdoOperUsih(ArquivoCSV):
"""
Armazena os dados das saídas referentes às unidades hidrelétricas.

Essa classe lida com as informações de saída fornecidas pelo arquivo PDO_OPER_USIH.
"""

BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoOperUsih]
ENCODING = "iso-8859-1"

@property
def tabela(self):
"""
Obtém a tabela com informações referentes à operação das usinas hidrelétricas.

- estagio (`int`)
- patamar (`int`)
- codigo_usina (`int`)
- nome_usina (`str`)
- nome_submercado (`str`)
- volume_util_inicial (`float`)
- volume_util_inicial_p (`float`)
- volume_util_final (`float`)
- volume_util_final_p (`float`)
- volume_util_maximo (`float`)
- vazao_incremental_natural (`float`)
- volume_incremental_natural (`float`)
- vazao_retirada_para_usos_alternativos (`float`)
- volume_retirado_para_usos_alternativos (`float`)
- vazao_evaporada (`float`)
- volume_evaporado (`float`)
- vazao_montante (`float`)
- volume_montante (`float`)
- vazao_montante_periodos_passados (`float`)
- volume_montante_periodos_passados (`float`)
- vazao_turbinada (`float`)
- vazao_turbinada_maxima (`float`)
- engolimento_maximo (`float`)
- volume_turbinado (`float`)
- vazao_vertida (`float`)
- volume_vertido (`float`)
- vazao_desviada (`float`)
- volume_desviado (`float`)
- vazao_bombeada (`float`)
- volume_bombeado (`float`)
- taxa_enchimento_volume_morto (`float`)
- volume_enchimento_volume_morto (`float`)
- taxa_descarga_fundo (`float`)
- volume_descaga_fundo (`float`)
- geracao (`float`)
- geracao_maxima (`float`)
- geracao_minima (`float`)
- potencia_instalada (`float`)
- valor_agua (`float`)

:return: A tabela como um dataframe
:rtype: pd.DataFrame | None
"""
return self._tabela()
66 changes: 66 additions & 0 deletions tests/dessem/test_pdo_cmosist.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from idessem.dessem.pdo_cmosist import PdoCmosist
from datetime import datetime
from tests.mocks.mock_open import mock_open
from unittest.mock import MagicMock, patch

from tests.mocks.arquivos.pdo_cmosist import MockPdoCmosist

ARQ_TESTE = "./tests/__init__.py"


def test_atributos_encontrados_pdo_cmosist():
m: MagicMock = mock_open(read_data="".join(MockPdoCmosist))
with patch("builtins.open", m):
pdo = PdoCmosist.read(ARQ_TESTE)
assert pdo.versao is not None
assert pdo.data_estudo is not None
assert pdo.tabela is not None


def test_versao_pdo_cmosist():
m: MagicMock = mock_open(read_data="".join(MockPdoCmosist))
with patch("builtins.open", m):
pdo = PdoCmosist.read(ARQ_TESTE)
assert pdo.versao == "21.2.1"


def test_data_estudo_pdo_cmosist():
m: MagicMock = mock_open(read_data="".join(MockPdoCmosist))
with patch("builtins.open", m):
pdo = PdoCmosist.read(ARQ_TESTE)
assert pdo.data_estudo == datetime(year=2025, month=11, day=18)


def test_tabela_pdo_cmosist():
m: MagicMock = mock_open(read_data="".join(MockPdoCmosist))
with patch("builtins.open", m):
pdo = PdoCmosist.read(ARQ_TESTE)

assert pdo.tabela.at[0, "estagio"] == 1
assert pdo.tabela.at[0, "nome_patamar"] == "MEDIA"
assert pdo.tabela.at[0, "nome_submercado"] == "SE"
assert pdo.tabela.at[0, "cmo"] == 316.70
assert pdo.tabela.at[0, "pi_demanda"] == 316.70

assert pdo.tabela.at[11, "estagio"] == 3
assert pdo.tabela.at[11, "nome_patamar"] == "LEVE"
assert pdo.tabela.at[11, "nome_submercado"] == "S"
assert pdo.tabela.at[11, "cmo"] == 302.97
assert pdo.tabela.at[11, "pi_demanda"] == 302.97


def test_eq_pdo_cmosist():
m: MagicMock = mock_open(read_data="".join(MockPdoCmosist))
with patch("builtins.open", m):
pdo1 = PdoCmosist.read(ARQ_TESTE)
pdo2 = PdoCmosist.read(ARQ_TESTE)
assert pdo1 == pdo2


def test_neq_pdo_cmosist():
m: MagicMock = mock_open(read_data="".join(MockPdoCmosist))
with patch("builtins.open", m):
pdo1 = PdoCmosist.read(ARQ_TESTE)
pdo2 = PdoCmosist.read(ARQ_TESTE)
pdo1.tabela.iloc[0, 0] = -1
assert pdo1 != pdo2
Loading