From 1fcd4aaea2f4efacda46e73531b7ca27edad4a6d Mon Sep 17 00:00:00 2001 From: Rogerio Alves Date: Fri, 21 Feb 2025 16:25:39 -0300 Subject: [PATCH 1/6] atualiza docs --- docs/source/referencia/dessem/index.rst | 1 - .../referencia/{dessem => libs}/arquivos/uch.rst | 6 ++++-- .../referencia/libs/arquivos/usinas_hidreletricas.rst | 2 +- docs/source/referencia/libs/index.rst | 10 ++++++++++ 4 files changed, 15 insertions(+), 4 deletions(-) rename docs/source/referencia/{dessem => libs}/arquivos/uch.rst (57%) create mode 100644 docs/source/referencia/libs/index.rst diff --git a/docs/source/referencia/dessem/index.rst b/docs/source/referencia/dessem/index.rst index a488cd3b..1a3f1768 100644 --- a/docs/source/referencia/dessem/index.rst +++ b/docs/source/referencia/dessem/index.rst @@ -45,4 +45,3 @@ DESSEM arquivos/renovaveis arquivos/respot arquivos/termdat - arquivos/uch diff --git a/docs/source/referencia/dessem/arquivos/uch.rst b/docs/source/referencia/libs/arquivos/uch.rst similarity index 57% rename from docs/source/referencia/dessem/arquivos/uch.rst rename to docs/source/referencia/libs/arquivos/uch.rst index 5ba076bc..910de5e0 100644 --- a/docs/source/referencia/dessem/arquivos/uch.rst +++ b/docs/source/referencia/libs/arquivos/uch.rst @@ -1,12 +1,14 @@ .. _uch: ======================================================= -Dados de Unit Commitment Hidráulico (uch.csv) +Dados de Unit Commitment Hidráulico ======================================================= -.. currentmodule:: idessem.dessem.uch +.. currentmodule:: idessem.libs.uch Os dados de unit commitment hidráulico do DESSEM +localizados no arquivos das LIBS que são indicados +no indices.csv com as respectivas funcionalidades, são armazenados na classe: .. autoclass:: Uch diff --git a/docs/source/referencia/libs/arquivos/usinas_hidreletricas.rst b/docs/source/referencia/libs/arquivos/usinas_hidreletricas.rst index ce093201..96fec0f5 100644 --- a/docs/source/referencia/libs/arquivos/usinas_hidreletricas.rst +++ b/docs/source/referencia/libs/arquivos/usinas_hidreletricas.rst @@ -4,7 +4,7 @@ Dados das Usinas Hidrelétricas ======================================================= -.. currentmodule:: idecomp.libs.usinas_hidreletricas +.. currentmodule:: idessem.libs.usinas_hidreletricas As informações de usinas hidrelétricas no DESSEM, localizadas no arquivos das LIBS que são indicados diff --git a/docs/source/referencia/libs/index.rst b/docs/source/referencia/libs/index.rst new file mode 100644 index 00000000..89a3339c --- /dev/null +++ b/docs/source/referencia/libs/index.rst @@ -0,0 +1,10 @@ +.. _libs: + +LIBS +======= + +.. toctree:: + :maxdepth: 2 + + arquivos/uch + arquivos/usinas_hidreletricas \ No newline at end of file From ffddd7e61c9a9b978573f172efaff7626ff16cc1 Mon Sep 17 00:00:00 2001 From: Rogerio Alves Date: Fri, 21 Feb 2025 16:30:48 -0300 Subject: [PATCH 2/6] reverte docs arquivo uch --- docs/source/referencia/{libs => dessem}/arquivos/uch.rst | 6 ++---- docs/source/referencia/dessem/index.rst | 1 + docs/source/referencia/libs/index.rst | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) rename docs/source/referencia/{libs => dessem}/arquivos/uch.rst (59%) diff --git a/docs/source/referencia/libs/arquivos/uch.rst b/docs/source/referencia/dessem/arquivos/uch.rst similarity index 59% rename from docs/source/referencia/libs/arquivos/uch.rst rename to docs/source/referencia/dessem/arquivos/uch.rst index 910de5e0..035c6a4a 100644 --- a/docs/source/referencia/libs/arquivos/uch.rst +++ b/docs/source/referencia/dessem/arquivos/uch.rst @@ -4,12 +4,10 @@ Dados de Unit Commitment Hidráulico ======================================================= -.. currentmodule:: idessem.libs.uch +.. currentmodule:: idessem.dessem.uch Os dados de unit commitment hidráulico do DESSEM -localizados no arquivos das LIBS que são indicados -no indices.csv com as respectivas funcionalidades, -são armazenados na classe: +localizados no arquivos uch.csv são armazenados na classe: .. autoclass:: Uch :members: diff --git a/docs/source/referencia/dessem/index.rst b/docs/source/referencia/dessem/index.rst index 1a3f1768..db915cb3 100644 --- a/docs/source/referencia/dessem/index.rst +++ b/docs/source/referencia/dessem/index.rst @@ -45,3 +45,4 @@ DESSEM arquivos/renovaveis arquivos/respot arquivos/termdat + arquivos/uch \ No newline at end of file diff --git a/docs/source/referencia/libs/index.rst b/docs/source/referencia/libs/index.rst index 89a3339c..2aaae83a 100644 --- a/docs/source/referencia/libs/index.rst +++ b/docs/source/referencia/libs/index.rst @@ -6,5 +6,4 @@ LIBS .. toctree:: :maxdepth: 2 - arquivos/uch arquivos/usinas_hidreletricas \ No newline at end of file From f803fe55ffc6fa0aeac64d5301e187217f77b1b6 Mon Sep 17 00:00:00 2001 From: marianasnoel Date: Fri, 21 Feb 2025 17:08:00 -0300 Subject: [PATCH 3/6] remove metodos deprecados e atualiza metodos cfi --- idessem/dessem/avl_altqueda.py | 15 - idessem/dessem/avl_desvfpha.py | 15 - idessem/dessem/avl_estatfpha.py | 49 +- idessem/dessem/avl_fpha1.py | 15 - idessem/dessem/avl_fpha2.py | 15 - idessem/dessem/avl_fpha3.py | 15 - idessem/dessem/des_log_relato.py | 53 +- idessem/dessem/dessemarq.py | 273 ++++--- idessem/dessem/dessopc.py | 142 ++-- idessem/dessem/entdados.py | 710 ++++++++---------- idessem/dessem/hidr.py | 22 - idessem/dessem/log_inviab.py | 16 - idessem/dessem/log_matriz.py | 15 - idessem/dessem/modelos/arquivos/arquivocsv.py | 34 +- idessem/dessem/operuh.py | 202 ++--- idessem/dessem/operut.py | 160 ++-- idessem/dessem/pdo_aval_qmaxusih.py | 15 - idessem/dessem/pdo_cmobar.py | 14 - idessem/dessem/pdo_eco_fcfcortes.py | 15 - idessem/dessem/pdo_eco_usih.py | 15 - idessem/dessem/pdo_eco_usih_conj.py | 15 - idessem/dessem/pdo_eco_usih_polin.py | 15 - idessem/dessem/pdo_eolica.py | 15 - idessem/dessem/pdo_hidr.py | 15 - idessem/dessem/pdo_inter.py | 15 - idessem/dessem/pdo_oper_term.py | 15 - .../dessem/pdo_oper_titulacao_contratos.py | 15 - idessem/dessem/pdo_oper_titulacao_usinas.py | 15 - idessem/dessem/pdo_oper_tviag_calha.py | 15 - idessem/dessem/pdo_oper_uct.py | 15 - idessem/dessem/pdo_operacao.py | 51 +- idessem/dessem/pdo_reserva.py | 15 - idessem/dessem/pdo_sist.py | 15 - idessem/dessem/pdo_somflux.py | 14 - idessem/dessem/pdo_term.py | 15 - idessem/dessem/renovaveis.py | 171 +---- idessem/dessem/termdat.py | 173 +---- idessem/libs/uch.py | 508 +++++-------- 38 files changed, 900 insertions(+), 2022 deletions(-) diff --git a/idessem/dessem/avl_altqueda.py b/idessem/dessem/avl_altqueda.py index 8e6b9bb9..c6569a3b 100644 --- a/idessem/dessem/avl_altqueda.py +++ b/idessem/dessem/avl_altqueda.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class AvlAltQueda(ArquivoCSV): """ @@ -20,17 +16,6 @@ class AvlAltQueda(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaAvlAltQueda] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="AVL_ALTQUEDA.DAT" - ) -> "AvlAltQueda": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/avl_desvfpha.py b/idessem/dessem/avl_desvfpha.py index 481e80b7..a1672964 100644 --- a/idessem/dessem/avl_desvfpha.py +++ b/idessem/dessem/avl_desvfpha.py @@ -8,10 +8,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class AvlDesvFpha(ArquivoCSV): """ @@ -27,17 +23,6 @@ class AvlDesvFpha(ArquivoCSV): } ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="AVL_DESVFPHA.DAT" - ) -> "AvlDesvFpha": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/avl_estatfpha.py b/idessem/dessem/avl_estatfpha.py index c18eba6d..916150c5 100644 --- a/idessem/dessem/avl_estatfpha.py +++ b/idessem/dessem/avl_estatfpha.py @@ -6,14 +6,10 @@ VersaoModelo, ) from cfinterface.files.blockfile import BlockFile -from typing import Optional, Type, TypeVar +from typing import Optional, TypeVar from datetime import datetime import pandas as pd # type: ignore -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class AvlEstatFpha(BlockFile): """ @@ -30,37 +26,6 @@ class AvlEstatFpha(BlockFile): ENCODING = "iso-8859-1" T = TypeVar("T") - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="AVL_ESTATFPHA.DAT" - ) -> "AvlEstatFpha": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def _bloco_por_tipo(self, bloco: Type[T], indice: int) -> Optional[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - :return: O gerador de blocos, se houver - :rtype: Optional[Generator[T], None, None] - """ - try: - return next( - b - for i, b in enumerate(self.data.of_type(bloco)) - if i == indice - ) - except StopIteration: - return None - @property def versao(self) -> Optional[str]: """ @@ -69,8 +34,8 @@ def versao(self) -> Optional[str]: :return: A versão do modelo :rtype: str | None """ - b = self._bloco_por_tipo(VersaoModelo, 0) - if b is not None: + b = self.data.get_blocks_of_type(VersaoModelo) + if isinstance(b, VersaoModelo): return b.data return None @@ -82,8 +47,8 @@ def data_estudo(self) -> Optional[datetime]: :return: A data como objeto :rtype: datetime | None """ - b = self._bloco_por_tipo(DataEstudo, 0) - if b is not None: + b = self.data.get_blocks_of_type(DataEstudo) + if isinstance(b, DataEstudo): return b.data return None @@ -99,7 +64,7 @@ def estatisticas_desvios(self) -> pd.DataFrame: :return: As variáveis como um dataframe :rtype: pd.DataFrame | None """ - b = self._bloco_por_tipo(BlocoDesvios, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoDesvios) + if isinstance(b, BlocoDesvios): return b.data return None diff --git a/idessem/dessem/avl_fpha1.py b/idessem/dessem/avl_fpha1.py index 4204011d..68875c58 100644 --- a/idessem/dessem/avl_fpha1.py +++ b/idessem/dessem/avl_fpha1.py @@ -8,10 +8,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class AvlFpha1(ArquivoCSV): """ @@ -27,17 +23,6 @@ class AvlFpha1(ArquivoCSV): } ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="AVL_FPHA1.DAT" - ) -> "AvlFpha1": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/avl_fpha2.py b/idessem/dessem/avl_fpha2.py index c41d0ed4..356e2d24 100644 --- a/idessem/dessem/avl_fpha2.py +++ b/idessem/dessem/avl_fpha2.py @@ -8,10 +8,6 @@ import pandas as pd # type: ignore from datetime import datetime -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class AvlFpha2(BlockFile): """ @@ -30,17 +26,6 @@ def __init__(self, data=...) -> None: super().__init__(data) self.__df_completo: Optional[pd.DataFrame] = None - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="AVL_FPHA2.DAT" - ) -> "AvlFpha2": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/avl_fpha3.py b/idessem/dessem/avl_fpha3.py index 5002dd52..4ce564e6 100644 --- a/idessem/dessem/avl_fpha3.py +++ b/idessem/dessem/avl_fpha3.py @@ -8,10 +8,6 @@ import pandas as pd # type: ignore from datetime import datetime -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class AvlFpha3(BlockFile): """ @@ -30,17 +26,6 @@ def __init__(self, data=...) -> None: super().__init__(data) self.__df_completo: Optional[pd.DataFrame] = None - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="AVL_FPHA3.DAT" - ) -> "AvlFpha3": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/des_log_relato.py b/idessem/dessem/des_log_relato.py index 3cd10640..6568304b 100644 --- a/idessem/dessem/des_log_relato.py +++ b/idessem/dessem/des_log_relato.py @@ -7,14 +7,10 @@ VersaoModelo, ) from cfinterface.files.blockfile import BlockFile -from typing import Optional, Type, TypeVar +from typing import Optional, TypeVar from datetime import datetime import pandas as pd # type: ignore -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class DesLogRelato(BlockFile): """ @@ -32,37 +28,6 @@ class DesLogRelato(BlockFile): ENCODING = "iso-8859-1" T = TypeVar("T") - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="DES_LOG_RELATO.DAT" - ) -> "DesLogRelato": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def _bloco_por_tipo(self, bloco: Type[T], indice: int) -> Optional[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - :return: O gerador de blocos, se houver - :rtype: Optional[Generator[T], None, None] - """ - try: - return next( - b - for i, b in enumerate(self.data.of_type(bloco)) - if i == indice - ) - except StopIteration: - return None - @property def versao(self) -> Optional[str]: """ @@ -71,8 +36,8 @@ def versao(self) -> Optional[str]: :return: A versão do modelo :rtype: str | None """ - b = self._bloco_por_tipo(VersaoModelo, 0) - if b is not None: + b = self.data.get_blocks_of_type(VersaoModelo) + if isinstance(b, VersaoModelo): return b.data return None @@ -84,8 +49,8 @@ def data_estudo(self) -> Optional[datetime]: :return: A data como objeto :rtype: datetime | None """ - b = self._bloco_por_tipo(DataEstudo, 0) - if b is not None: + b = self.data.get_blocks_of_type(DataEstudo) + if isinstance(b, DataEstudo): return b.data return None @@ -97,8 +62,8 @@ def tempo_processamento(self): :return: O tempo como objeto :rtype: timedelta | None """ - b = self._bloco_por_tipo(BlocoTempoProcessamento, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoTempoProcessamento) + if isinstance(b, BlocoTempoProcessamento): return b.data return None @@ -113,7 +78,7 @@ def variaveis_otimizacao(self) -> pd.DataFrame: :return: As variáveis como um dataframe :rtype: pd.DataFrame | None """ - b = self._bloco_por_tipo(BlocoVariaveisOtimizacao, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoVariaveisOtimizacao) + if isinstance(b, BlocoVariaveisOtimizacao): return b.data return None diff --git a/idessem/dessem/dessemarq.py b/idessem/dessem/dessemarq.py index 073b5066..86da4663 100644 --- a/idessem/dessem/dessemarq.py +++ b/idessem/dessem/dessemarq.py @@ -34,12 +34,7 @@ ) from cfinterface.files.registerfile import RegisterFile -from cfinterface.components.register import Register -from typing import Type, List, Optional, TypeVar - -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings +from typing import Optional, TypeVar class DessemArq(RegisterFile): @@ -50,9 +45,6 @@ class DessemArq(RegisterFile): DESSEM no `dessem.arq`. Possui métodos para acessar individualmente cada nome e editá-lo. - É possível ler as informações existentes em arquivos a partir do - método `le_arquivo()` e escreve um novo arquivo a partir do método - `escreve_arquivo()`. """ @@ -96,77 +88,6 @@ class DessemArq(RegisterFile): def __init__(self, data=...) -> None: super().__init__(data) - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="dessem.arq" - ) -> "DessemArq": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def escreve_arquivo(self, diretorio: str, nome_arquivo="dessem.arq"): - msg = ( - "O método escreve_arquivo(diretorio, nome_arquivo) será" - + " descontinuado na versão 1.0.0 -" - + " use o método write(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - self.write(join(diretorio, nome_arquivo)) - - def __obtem_registro(self, tipo: Type[T]) -> Optional[T]: - r = [b for b in self.data.of_type(tipo)] - return r[0] if len(r) > 0 else None - - def cria_registro(self, anterior: Register, registro: Register): - """ - Adiciona um registro ao arquivo após um outro registro previamente - existente. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.add_after(anterior, registro) - - def deleta_registro(self, registro: Register): - """ - Remove um registro existente no arquivo. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.remove(registro) - - def lista_registros(self, tipo: Type[T]) -> List[T]: - """ - Lista todos os registros presentes no arquivo que tenham o tipo `T`. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - return [r for r in self.data.of_type(tipo)] - - def append_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na última posição. - - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.append(registro) - - def preppend_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na primeira posição. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.preppend(registro) - @property def caso(self) -> Optional[RegistroCaso]: """ @@ -175,7 +96,11 @@ def caso(self) -> Optional[RegistroCaso]: :return: Um registro, se existir. :rtype: :class:`RegistroCaso` | None. """ - return self.__obtem_registro(RegistroCaso) + r = self.data.get_registers_of_type(RegistroCaso) + if isinstance(r, RegistroCaso): + return r + else: + return None @property def titulo(self) -> Optional[RegistroTitulo]: @@ -185,7 +110,11 @@ def titulo(self) -> Optional[RegistroTitulo]: :return: Um registro, se existir. :rtype: :class:`RegistroTitulo` | None. """ - return self.__obtem_registro(RegistroTitulo) + r = self.data.get_registers_of_type(RegistroTitulo) + if isinstance(r, RegistroTitulo): + return r + else: + return None @property def vazoes(self) -> Optional[RegistroVazoes]: @@ -195,7 +124,11 @@ def vazoes(self) -> Optional[RegistroVazoes]: :return: Um registro, se existir. :rtype: :class:`RegistroVazoes` | None. """ - return self.__obtem_registro(RegistroVazoes) + r = self.data.get_registers_of_type(RegistroVazoes) + if isinstance(r, RegistroVazoes): + return r + else: + return None @property def dadger(self) -> Optional[RegistroDadger]: @@ -205,7 +138,11 @@ def dadger(self) -> Optional[RegistroDadger]: :return: Um registro, se existir. :rtype: :class:`RegistroDadger` | None. """ - return self.__obtem_registro(RegistroDadger) + r = self.data.get_registers_of_type(RegistroDadger) + if isinstance(r, RegistroDadger): + return r + else: + return None @property def mapfcf(self) -> Optional[RegistroMapfcf]: @@ -215,7 +152,11 @@ def mapfcf(self) -> Optional[RegistroMapfcf]: :return: Um registro, se existir. :rtype: :class:`RegistroMapfcf` | None. """ - return self.__obtem_registro(RegistroMapfcf) + r = self.data.get_registers_of_type(RegistroMapfcf) + if isinstance(r, RegistroMapfcf): + return r + else: + return None @property def cortfcf(self) -> Optional[RegistroCortfcf]: @@ -225,7 +166,11 @@ def cortfcf(self) -> Optional[RegistroCortfcf]: :return: Um registro, se existir. :rtype: :class:`RegistroCortfcf` | None. """ - return self.__obtem_registro(RegistroCortfcf) + r = self.data.get_registers_of_type(RegistroCortfcf) + if isinstance(r, RegistroCortfcf): + return r + else: + return None @property def cadusih(self) -> Optional[RegistroCadusih]: @@ -235,7 +180,11 @@ def cadusih(self) -> Optional[RegistroCadusih]: :return: Um registro, se existir. :rtype: :class:`RegistroCadusih` | None. """ - return self.__obtem_registro(RegistroCadusih) + r = self.data.get_registers_of_type(RegistroCadusih) + if isinstance(r, RegistroCadusih): + return r + else: + return None @property def operuh(self) -> Optional[RegistroOperuh]: @@ -246,7 +195,11 @@ def operuh(self) -> Optional[RegistroOperuh]: :return: Um registro, se existir. :rtype: :class:`RegistroOperuh` | None. """ - return self.__obtem_registro(RegistroOperuh) + r = self.data.get_registers_of_type(RegistroOperuh) + if isinstance(r, RegistroOperuh): + return r + else: + return None @property def deflant(self) -> Optional[RegistroDeflant]: @@ -257,7 +210,11 @@ def deflant(self) -> Optional[RegistroDeflant]: :return: Um registro, se existir. :rtype: :class:`RegistroDeflant` | None. """ - return self.__obtem_registro(RegistroDeflant) + r = self.data.get_registers_of_type(RegistroDeflant) + if isinstance(r, RegistroDeflant): + return r + else: + return None @property def cadterm(self) -> Optional[RegistroCadterm]: @@ -267,7 +224,11 @@ def cadterm(self) -> Optional[RegistroCadterm]: :return: Um registro, se existir. :rtype: :class:`RegistroCadterm` | None. """ - return self.__obtem_registro(RegistroCadterm) + r = self.data.get_registers_of_type(RegistroCadterm) + if isinstance(r, RegistroCadterm): + return r + else: + return None @property def operut(self) -> Optional[RegistroOperut]: @@ -277,7 +238,11 @@ def operut(self) -> Optional[RegistroOperut]: :return: Um registro, se existir. :rtype: :class:`RegistroOperut` | None. """ - return self.__obtem_registro(RegistroOperut) + r = self.data.get_registers_of_type(RegistroOperut) + if isinstance(r, RegistroOperut): + return r + else: + return None @property def indelet(self) -> Optional[RegistroIndelet]: @@ -287,7 +252,11 @@ def indelet(self) -> Optional[RegistroIndelet]: :return: Um registro, se existir. :rtype: :class:`RegistroIndelet` | None. """ - return self.__obtem_registro(RegistroIndelet) + r = self.data.get_registers_of_type(RegistroIndelet) + if isinstance(r, RegistroIndelet): + return r + else: + return None @property def ilstri(self) -> Optional[RegistroIlstri]: @@ -297,7 +266,11 @@ def ilstri(self) -> Optional[RegistroIlstri]: :return: Um registro, se existir. :rtype: :class:`RegistroIlstri` | None. """ - return self.__obtem_registro(RegistroIlstri) + r = self.data.get_registers_of_type(RegistroIlstri) + if isinstance(r, RegistroIlstri): + return r + else: + return None @property def cotasr11(self) -> Optional[RegistroCotasR11]: @@ -307,7 +280,11 @@ def cotasr11(self) -> Optional[RegistroCotasR11]: :return: Um registro, se existir. :rtype: :class:`RegistroCotasR11` | None. """ - return self.__obtem_registro(RegistroCotasR11) + r = self.data.get_registers_of_type(RegistroCotasR11) + if isinstance(r, RegistroCotasR11): + return r + else: + return None @property def simul(self) -> Optional[RegistroSimul]: @@ -317,7 +294,11 @@ def simul(self) -> Optional[RegistroSimul]: :return: Um registro, se existir. :rtype: :class:`RegistroSimul` | None. """ - return self.__obtem_registro(RegistroSimul) + r = self.data.get_registers_of_type(RegistroSimul) + if isinstance(r, RegistroSimul): + return r + else: + return None @property def areacont(self) -> Optional[RegistroAreacont]: @@ -327,7 +308,11 @@ def areacont(self) -> Optional[RegistroAreacont]: :return: Um registro, se existir. :rtype: :class:`RegistroAreacont` | None. """ - return self.__obtem_registro(RegistroAreacont) + r = self.data.get_registers_of_type(RegistroAreacont) + if isinstance(r, RegistroAreacont): + return r + else: + return None @property def respot(self) -> Optional[RegistroRespot]: @@ -337,7 +322,11 @@ def respot(self) -> Optional[RegistroRespot]: :return: Um registro, se existir. :rtype: :class:`RegistroRespot` | None. """ - return self.__obtem_registro(RegistroRespot) + r = self.data.get_registers_of_type(RegistroRespot) + if isinstance(r, RegistroRespot): + return r + else: + return None @property def mlt(self) -> Optional[RegistroMlt]: @@ -347,7 +336,11 @@ def mlt(self) -> Optional[RegistroMlt]: :return: Um registro, se existir. :rtype: :class:`RegistroMlt` | None. """ - return self.__obtem_registro(RegistroMlt) + r = self.data.get_registers_of_type(RegistroMlt) + if isinstance(r, RegistroMlt): + return r + else: + return None @property def tolperd(self) -> Optional[RegistroTolperd]: @@ -357,7 +350,11 @@ def tolperd(self) -> Optional[RegistroTolperd]: :return: Um registro, se existir. :rtype: :class:`RegistroTolperd` | None. """ - return self.__obtem_registro(RegistroTolperd) + r = self.data.get_registers_of_type(RegistroTolperd) + if isinstance(r, RegistroTolperd): + return r + else: + return None @property def curvtviag(self) -> Optional[RegistroCurvtviag]: @@ -368,7 +365,11 @@ def curvtviag(self) -> Optional[RegistroCurvtviag]: :return: Um registro, se existir. :rtype: :class:`RegistroCurvtviag` | None. """ - return self.__obtem_registro(RegistroCurvtviag) + r = self.data.get_registers_of_type(RegistroCurvtviag) + if isinstance(r, RegistroCurvtviag): + return r + else: + return None @property def ptoper(self) -> Optional[RegistroPtoper]: @@ -379,7 +380,11 @@ def ptoper(self) -> Optional[RegistroPtoper]: :return: Um registro, se existir. :rtype: :class:`RegistroPtoper` | None. """ - return self.__obtem_registro(RegistroPtoper) + r = self.data.get_registers_of_type(RegistroPtoper) + if isinstance(r, RegistroPtoper): + return r + else: + return None @property def infofcf(self) -> Optional[RegistroInfofcf]: @@ -389,7 +394,11 @@ def infofcf(self) -> Optional[RegistroInfofcf]: :return: Um registro, se existir. :rtype: :class:`RegistroInfofcf` | None. """ - return self.__obtem_registro(RegistroInfofcf) + r = self.data.get_registers_of_type(RegistroInfofcf) + if isinstance(r, RegistroInfofcf): + return r + else: + return None @property def meta(self) -> Optional[RegistroMetas]: @@ -399,7 +408,11 @@ def meta(self) -> Optional[RegistroMetas]: :return: Um registro, se existir. :rtype: :class:`RegistroMetas` | None. """ - return self.__obtem_registro(RegistroMetas) + r = self.data.get_registers_of_type(RegistroMetas) + if isinstance(r, RegistroMetas): + return r + else: + return None @property def ree(self) -> Optional[RegistroREE]: @@ -410,7 +423,11 @@ def ree(self) -> Optional[RegistroREE]: :return: Um registro, se existir. :rtype: :class:`RegistroREE` | None. """ - return self.__obtem_registro(RegistroREE) + r = self.data.get_registers_of_type(RegistroREE) + if isinstance(r, RegistroREE): + return r + else: + return None @property def eolica(self) -> Optional[RegistroEolica]: @@ -420,7 +437,11 @@ def eolica(self) -> Optional[RegistroEolica]: :return: Um registro, se existir. :rtype: :class:`RegistroEolica` | None. """ - return self.__obtem_registro(RegistroEolica) + r = self.data.get_registers_of_type(RegistroEolica) + if isinstance(r, RegistroEolica): + return r + else: + return None @property def rampas(self) -> Optional[RegistroRampas]: @@ -430,7 +451,11 @@ def rampas(self) -> Optional[RegistroRampas]: :return: Um registro, se existir. :rtype: :class:`RegistroRampas` | None. """ - return self.__obtem_registro(RegistroRampas) + r = self.data.get_registers_of_type(RegistroRampas) + if isinstance(r, RegistroRampas): + return r + else: + return None @property def rstlpp(self) -> Optional[RegistroRstlpp]: @@ -440,7 +465,11 @@ def rstlpp(self) -> Optional[RegistroRstlpp]: :return: Um registro, se existir. :rtype: :class:`RegistroRstlpp` | None. """ - return self.__obtem_registro(RegistroRstlpp) + r = self.data.get_registers_of_type(RegistroRstlpp) + if isinstance(r, RegistroRstlpp): + return r + else: + return None @property def restseg(self) -> Optional[RegistroRestseg]: @@ -450,7 +479,11 @@ def restseg(self) -> Optional[RegistroRestseg]: :return: Um registro, se existir. :rtype: :class:`RegistroRestseg` | None. """ - return self.__obtem_registro(RegistroRestseg) + r = self.data.get_registers_of_type(RegistroRestseg) + if isinstance(r, RegistroRestseg): + return r + else: + return None @property def respotele(self) -> Optional[RegistroRespotele]: @@ -461,7 +494,11 @@ def respotele(self) -> Optional[RegistroRespotele]: :return: Um registro, se existir. :rtype: :class:`RegistroRespotele` | None. """ - return self.__obtem_registro(RegistroRespotele) + r = self.data.get_registers_of_type(RegistroRespotele) + if isinstance(r, RegistroRespotele): + return r + else: + return None @property def ilibs(self) -> Optional[RegistroIlibs]: @@ -471,7 +508,11 @@ def ilibs(self) -> Optional[RegistroIlibs]: :return: Um registro, se existir. :rtype: :class:`RegistroIlibs` | None. """ - return self.__obtem_registro(RegistroIlibs) + r = self.data.get_registers_of_type(RegistroIlibs) + if isinstance(r, RegistroIlibs): + return r + else: + return None @property def uch(self) -> Optional[RegistroUch]: @@ -482,7 +523,11 @@ def uch(self) -> Optional[RegistroUch]: :return: Um registro, se existir. :rtype: :class:`RegistroUch` | None. """ - return self.__obtem_registro(RegistroUch) + r = self.data.get_registers_of_type(RegistroUch) + if isinstance(r, RegistroUch): + return r + else: + return None @property def dessopc(self) -> Optional[RegistroDessopc]: @@ -492,4 +537,8 @@ def dessopc(self) -> Optional[RegistroDessopc]: :return: Um registro, se existir. :rtype: :class:`RegistroDessopc` | None. """ - return self.__obtem_registro(RegistroDessopc) + r = self.data.get_registers_of_type(RegistroDessopc) + if isinstance(r, RegistroDessopc): + return r + else: + return None diff --git a/idessem/dessem/dessopc.py b/idessem/dessem/dessopc.py index 51922e8f..76e846ef 100644 --- a/idessem/dessem/dessopc.py +++ b/idessem/dessem/dessopc.py @@ -16,11 +16,7 @@ ) from cfinterface.files.blockfile import BlockFile -from typing import Type, TypeVar, Optional, List - -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings +from typing import TypeVar, Optional, List class Dessopc(BlockFile): @@ -51,46 +47,6 @@ class Dessopc(BlockFile): def __init__(self, data=...) -> None: super().__init__(data) - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="dessopc.dat" - ) -> "Dessopc": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def escreve_arquivo(self, diretorio: str, nome_arquivo="dessopc.dat"): - msg = ( - "O método escreve_arquivo(diretorio, nome_arquivo) será" - + " descontinuado na versão 1.0.0 -" - + " use o método write(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - self.write(join(diretorio, nome_arquivo)) - - def __bloco_por_tipo(self, bloco: Type[T], indice: int) -> Optional[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - :return: O gerador de blocos, se houver - :rtype: Optional[Generator[T], None, None] - """ - try: - return next( - b - for i, b in enumerate(self.data.of_type(bloco)) - if i == indice - ) - except StopIteration: - return None - @property def uctpar(self) -> Optional[int]: """ @@ -99,14 +55,14 @@ def uctpar(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoUctPar, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUctPar) + if isinstance(b, BlocoUctPar): return b.data return None @uctpar.setter def uctpar(self, valor: int): - b = self.__bloco_por_tipo(BlocoUctPar, 0) + b = self.data.get_blocks_of_type(BlocoUctPar) if b is not None: b.data = valor else: @@ -120,14 +76,14 @@ def ucterm(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoUcTerm, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUcTerm) + if isinstance(b, BlocoUcTerm): return b.data return None @ucterm.setter def ucterm(self, valor: int): - b = self.__bloco_por_tipo(BlocoUcTerm, 0) + b = self.data.get_blocks_of_type(BlocoUcTerm) if b is not None: b.data = valor else: @@ -141,8 +97,8 @@ def pint(self) -> Optional[str]: :return: O flag :rtype: str | None """ - b = self.__bloco_por_tipo(BlocoPint, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoPint) + if isinstance(b, BlocoPint): return "PINT" return None @@ -155,15 +111,15 @@ def regranptv(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoRegraNPTV, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoRegraNPTV) + if isinstance(b, BlocoRegraNPTV): return b.data return None @regranptv.setter def regranptv(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoRegraNPTV, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoRegraNPTV) + if isinstance(b, BlocoRegraNPTV): b.data = valor else: raise ValueError("Campo não lido") @@ -176,15 +132,15 @@ def avlcmo(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoAvlCmo, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoAvlCmo) + if isinstance(b, BlocoAvlCmo): return b.data return None @avlcmo.setter def avlcmo(self, valor: int): - b = self.__bloco_por_tipo(BlocoAvlCmo, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoAvlCmo) + if isinstance(b, BlocoAvlCmo): b.data = valor else: raise ValueError("Campo não lido") @@ -197,8 +153,8 @@ def cplexlog(self) -> Optional[str]: :return: O flag :rtype: str | None """ - b = self.__bloco_por_tipo(BlocoCplexLog, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoCplexLog) + if isinstance(b, BlocoCplexLog): return "CPLEXLOG" return None @@ -210,8 +166,8 @@ def uctbusloc(self) -> Optional[str]: :return: O flag :rtype: str | None """ - b = self.__bloco_por_tipo(BlocoUctBusLoc, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUctBusLoc) + if isinstance(b, BlocoUctBusLoc): return "UCTBUSLOC" return None @@ -224,15 +180,15 @@ def uctheurfp(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoUctHeurFp, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUctHeurFp) + if isinstance(b, BlocoUctHeurFp): return b.data return None @uctheurfp.setter def uctheurfp(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoUctHeurFp, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUctHeurFp) + if isinstance(b, BlocoUctHeurFp): b.data = valor else: raise ValueError("Campo não lido") @@ -245,15 +201,15 @@ def constdados(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoConstDados, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoConstDados) + if isinstance(b, BlocoConstDados): return b.data return None @constdados.setter def constdados(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoConstDados, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoConstDados) + if isinstance(b, BlocoConstDados): b.data = valor else: raise ValueError("Campo não lido") @@ -266,15 +222,15 @@ def ajustefcf(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoAjusteFcf, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoAjusteFcf) + if isinstance(b, BlocoAjusteFcf): return b.data return None @ajustefcf.setter def ajustefcf(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoAjusteFcf, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoAjusteFcf) + if isinstance(b, BlocoAjusteFcf): b.data = valor else: raise ValueError("Campo não lido") @@ -287,15 +243,15 @@ def tolerilh(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoTolerIlh, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoTolerIlh) + if isinstance(b, BlocoTolerIlh): return b.data return None @tolerilh.setter def tolerilh(self, valor: int): - b = self.__bloco_por_tipo(BlocoTolerIlh, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoTolerIlh) + if isinstance(b, BlocoTolerIlh): b.data = valor else: raise ValueError("Campo não lido") @@ -309,15 +265,15 @@ def crossover(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoCrossover, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoCrossover) + if isinstance(b, BlocoCrossover): return b.data return None @crossover.setter def crossover(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoCrossover, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoCrossover) + if isinstance(b, BlocoCrossover): b.data = valor else: raise ValueError("Campo não lido") @@ -330,15 +286,15 @@ def engolimento(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoEngolimento, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoEngolimento) + if isinstance(b, BlocoEngolimento): return b.data return None @engolimento.setter def engolimento(self, valor: int): - b = self.__bloco_por_tipo(BlocoEngolimento, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoEngolimento) + if isinstance(b, BlocoEngolimento): b.data = valor else: raise ValueError("Campo não lido") @@ -351,15 +307,15 @@ def tratainviabilha(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoTrataInviabIlha, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoTrataInviabIlha) + if isinstance(b, BlocoTrataInviabIlha): return b.data return None @tratainviabilha.setter def tratainviabilha(self, valor: int): - b = self.__bloco_por_tipo(BlocoTrataInviabIlha, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoTrataInviabIlha) + if isinstance(b, BlocoTrataInviabIlha): b.data = valor else: raise ValueError("Campo não lido") diff --git a/idessem/dessem/entdados.py b/idessem/dessem/entdados.py index 590f49be..7a38999e 100644 --- a/idessem/dessem/entdados.py +++ b/idessem/dessem/entdados.py @@ -57,13 +57,8 @@ ) import pandas as pd # type: ignore from cfinterface.files.registerfile import RegisterFile -from cfinterface.components.register import Register from typing import Type, List, Optional, TypeVar, Union, Any - - -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings +import numpy as np class Entdados(RegisterFile): @@ -74,10 +69,6 @@ class Entdados(RegisterFile): DESSEM no `entdados.dat`. Possui métodos para acessar individualmente cada registro, editá-lo e também cria alguns novos registros. - É possível ler as informações existentes em arquivos a partir do - método `le_arquivo()` e escreve um novo arquivo a partir do método - `escreve_arquivo()`. - """ T = TypeVar("T") @@ -162,110 +153,31 @@ class Entdados(RegisterFile): def __init__(self, data=...) -> None: super().__init__(data) - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="entdados.dat" - ) -> "Entdados": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def escreve_arquivo(self, diretorio: str, nome_arquivo="entdados.dat"): - msg = ( - "O método escreve_arquivo(diretorio, nome_arquivo) será" - + " descontinuado na versão 1.0.0 -" - + " use o método write(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - self.write(join(diretorio, nome_arquivo)) - - def __registros_por_tipo(self, registro: Type[T]) -> List[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - """ - return [b for b in self.data.of_type(registro)] - - def __obtem_registro(self, tipo: Type[T]) -> Optional[T]: - """ """ - r = self.__obtem_registros(tipo) - return r[0] if len(r) > 0 else None - - def __obtem_registros(self, tipo: Type[T]) -> List[T]: - return self.__registros_por_tipo(tipo) - - def __obtem_registros_com_filtros( - self, tipo_registro: Type[T], **kwargs - ) -> Optional[Union[T, List[T]]]: - def __atende(r) -> bool: - condicoes: List[bool] = [] - for k, v in kwargs.items(): - if v is not None: - condicoes.append(getattr(r, k) == v) - return all(condicoes) - - regs_filtro = [ - r for r in self.__obtem_registros(tipo_registro) if __atende(r) + def __expande_colunas_df(self, df: pd.DataFrame) -> pd.DataFrame: + colunas_com_listas = df.map(lambda linha: isinstance(linha, list)).all() + nomes_colunas = [ + c for c in colunas_com_listas[colunas_com_listas].index ] - if len(regs_filtro) == 0: - return None - elif len(regs_filtro) == 1: - return regs_filtro[0] + for c in nomes_colunas: + num_elementos = len(df.at[0, c]) + particoes_coluna = [f"{c}_{i}" for i in range(1, num_elementos + 1)] + df[particoes_coluna] = df.apply( + lambda linha: linha[c] + + [np.nan] * max(0, num_elementos - len(linha[c])), + axis=1, + result_type="expand", + ) + df.drop(columns=[c], inplace=True) + return df + + def __registros_ou_df( + self, t: Type[T], **kwargs + ) -> Optional[Union[T, List[T], pd.DataFrame]]: + if kwargs.get("df"): + return self.__expande_colunas_df(self._as_df(t)) else: - return regs_filtro - - def cria_registro(self, anterior: Register, registro: Register): - """ - Adiciona um registro ao arquivo após um outro registro previamente - existente. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.add_after(anterior, registro) - - def deleta_registro(self, registro: Register): - """ - Remove um registro existente no arquivo. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.remove(registro) - - def lista_registros(self, tipo: Type[T]) -> List[T]: - """ - Lista todos os registros presentes no arquivo que tenham o tipo `T`. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - return [r for r in self.data.of_type(tipo)] - - def append_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na última posição. - - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.append(registro) - - def preppend_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na primeira posição. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.preppend(registro) + kwargs_sem_df = {k: v for k, v in kwargs.items() if k != "df"} + return self.data.get_registers_of_type(t, **kwargs_sem_df) @property def rd(self) -> Optional[RD]: @@ -276,7 +188,11 @@ def rd(self) -> Optional[RD]: :return: Um registro, se existir. :rtype: :class:`RD` | None """ - return self.__obtem_registro(RD) + r = self.data.get_registers_of_type(RD) + if isinstance(r, RD): + return r + else: + return None def rivar( self, @@ -300,14 +216,13 @@ def rivar( :return: Um ou mais registros, se existirem. :rtype: :class:`RIVAR` | list[:class:`RIVAR`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(RIVAR) - else: - return self.__obtem_registros_com_filtros( - RIVAR, - codigo_entidade=codigo_entidade, - tipo_variavel=tipo_variavel, - ) + + return self.__registros_ou_df( + RIVAR, + codigo_entidade=codigo_entidade, + tipo_variavel=tipo_variavel, + df=df, + ) def tm( self, @@ -335,15 +250,14 @@ def tm( :return: Um ou mais registros, se existirem. :rtype: :class:`TM` | list[:class:`TM`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(TM) - else: - return self.__obtem_registros_com_filtros( - TM, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - ) + + return self.__registros_ou_df( + TM, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + df=df, + ) def sist( self, @@ -362,14 +276,12 @@ def sist( :return: Um ou mais registros, se existirem. :rtype: :class:`SIST` | list[:class:`SIST`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(SIST) - else: - return self.__obtem_registros_com_filtros( - SIST, - codigo_submercado=codigo_submercado, - nome_submercado=nome_submercado, - ) + return self.__registros_ou_df( + SIST, + codigo_submercado=codigo_submercado, + nome_submercado=nome_submercado, + df=df, + ) def ree( self, @@ -391,15 +303,14 @@ def ree( :return: Um ou mais registros, se existirem. :rtype: :class:`REE` | list[:class:`REE`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(REE) - else: - return self.__obtem_registros_com_filtros( - REE, - codigo_ree=codigo_ree, - codigo_submercado=codigo_submercado, - nome_ree=nome_ree, - ) + + return self.__registros_ou_df( + REE, + codigo_ree=codigo_ree, + codigo_submercado=codigo_submercado, + nome_ree=nome_ree, + df=df, + ) def uh( self, @@ -431,17 +342,16 @@ def uh( :return: Um ou mais registros, se existirem. :rtype: :class:`UH` | list[:class:`UH`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(UH) - else: - return self.__obtem_registros_com_filtros( - UH, - codigo_usina=codigo_usina, - nome_usina=nome_usina, - codigo_ree=codigo_ree, - volume_inicial=volume_inicial, - evaporacao=evaporacao, - ) + + return self.__registros_ou_df( + UH, + codigo_usina=codigo_usina, + nome_usina=nome_usina, + codigo_ree=codigo_ree, + volume_inicial=volume_inicial, + evaporacao=evaporacao, + df=df, + ) def tviag( self, @@ -474,17 +384,16 @@ def tviag( :return: Um ou mais registros, se existirem. :rtype: :class:`TVIAG` | list[:class:`TVIAG`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(TVIAG) - else: - return self.__obtem_registros_com_filtros( - TVIAG, - codigo_usina_montante=codigo_usina_montante, - codigo_elemento_jusante=codigo_elemento_jusante, - tipo_elemento_jusante=tipo_elemento_jusante, - duracao=duracao, - tipo_tempo_viagem=tipo_tempo_viagem, - ) + + return self.__registros_ou_df( + TVIAG, + codigo_usina_montante=codigo_usina_montante, + codigo_elemento_jusante=codigo_elemento_jusante, + tipo_elemento_jusante=tipo_elemento_jusante, + duracao=duracao, + tipo_tempo_viagem=tipo_tempo_viagem, + df=df, + ) def ut( self, @@ -521,18 +430,16 @@ def ut( :return: Um ou mais registros, se existirem. :rtype: :class:`UT` | list[:class:`UT`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(UT) - else: - return self.__obtem_registros_com_filtros( - UT, - codigo_usina=codigo_usina, - nome_usina=nome_usina, - codigo_submercado=codigo_submercado, - tipo_restricao=tipo_restricao, - geracao_minima=geracao_minima, - geracao_maxima=geracao_maxima, - ) + return self.__registros_ou_df( + UT, + codigo_usina=codigo_usina, + nome_usina=nome_usina, + codigo_submercado=codigo_submercado, + tipo_restricao=tipo_restricao, + geracao_minima=geracao_minima, + geracao_maxima=geracao_maxima, + df=df, + ) def usie( self, @@ -560,17 +467,16 @@ def usie( :return: Um ou mais registros, se existirem. :rtype: :class:`USIE` | list[:class:`USIE`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(USIE) - else: - return self.__obtem_registros_com_filtros( - USIE, - codigo_usina=codigo_usina, - codigo_submercado=codigo_submercado, - nome_usina=nome_usina, - codigo_usina_montante=codigo_usina_montante, - codigo_usina_jusante=codigo_usina_jusante, - ) + + return self.__registros_ou_df( + USIE, + codigo_usina=codigo_usina, + codigo_submercado=codigo_submercado, + nome_usina=nome_usina, + codigo_usina_montante=codigo_usina_montante, + codigo_usina_jusante=codigo_usina_jusante, + df=df, + ) def dp( self, @@ -594,13 +500,9 @@ def dp( :rtype: :class:`DP` | list[:class:`DP`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(DP) - else: - return self.__obtem_registros_com_filtros( - DP, - codigo_submercado=codigo_submercado, - ) + return self.__registros_ou_df( + DP, codigo_submercado=codigo_submercado, df=df + ) def de( self, @@ -622,13 +524,9 @@ def de( :rtype: :class:`DE` | list[:class:`DE`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(DE) - else: - return self.__obtem_registros_com_filtros( - DE, - codigo_demanda_especial=codigo_demanda_especial, - ) + return self.__registros_ou_df( + DE, codigo_demanda_especial=codigo_demanda_especial, df=df + ) def cd( self, @@ -651,14 +549,12 @@ def cd( :return: Um ou mais registros, se existirem. :rtype: :class:`CD` | list[:class:`CD`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(CD) - else: - return self.__obtem_registros_com_filtros( - CD, - codigo_submercado=codigo_submercado, - numero_curva=numero_curva, - ) + return self.__registros_ou_df( + CD, + codigo_submercado=codigo_submercado, + numero_curva=numero_curva, + df=df, + ) def pq( self, @@ -685,15 +581,13 @@ def pq( :return: Um ou mais registros, se existirem. :rtype: :class:`PQ` | list[:class:`PQ`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(PQ) - else: - return self.__obtem_registros_com_filtros( - PQ, - codigo_usina=codigo_usina, - nome_usina=nome_usina, - localizacao=localizacao, - ) + return self.__registros_ou_df( + PQ, + codigo_usina=codigo_usina, + nome_usina=nome_usina, + localizacao=localizacao, + df=df, + ) @property def it(self) -> Optional[IT]: @@ -706,7 +600,11 @@ def it(self) -> Optional[IT]: :return: Um registro, se existir. :rtype: :class:`IT` | None. """ - return self.__obtem_registro(IT) + r = self.data.get_registers_of_type(IT) + if isinstance(r, IT): + return r + else: + return None def ri( self, @@ -723,12 +621,7 @@ def ri( :return: Um ou mais registros, se existirem. :rtype: :class:`RI` | list[:class:`RI`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(RI) - else: - return self.__obtem_registros_com_filtros( - RI, - ) + return self.__registros_ou_df(RI, df=df) def ia( self, @@ -751,14 +644,12 @@ def ia( :return: Um ou mais registros, se existirem. :rtype: :class:`IA` | list[:class:`IA`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(IA) - else: - return self.__obtem_registros_com_filtros( - IA, - nome_submercado_de=nome_submercado_de, - nome_submercado_para=nome_submercado_para, - ) + return self.__registros_ou_df( + IA, + nome_submercado_de=nome_submercado_de, + nome_submercado_para=nome_submercado_para, + df=df, + ) @property def gp(self) -> Optional[GP]: @@ -769,7 +660,11 @@ def gp(self) -> Optional[GP]: :return: Um registro, se existir. :rtype: :class:`GP` | None. """ - return self.__obtem_registro(GP) + r = self.data.get_registers_of_type(GP) + if isinstance(r, GP): + return r + else: + return None def ac( self, @@ -793,12 +688,9 @@ def ac( :return: Um ou mais registros, se existirem. :rtype: `AC` | list[`AC`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(modificacao) - else: - return self.__obtem_registros_com_filtros( - modificacao, **{"codigo_usina": codigo_usina, **kwargs} - ) + return self.__registros_ou_df( + modificacao, **{"codigo_usina": codigo_usina, **kwargs, "df": df} + ) @property def ni(self) -> Optional[NI]: @@ -810,7 +702,11 @@ def ni(self) -> Optional[NI]: :return: Um registro, se existir. :rtype: :class:`NI` | None. """ - return self.__obtem_registro(NI) + r = self.data.get_registers_of_type(NI) + if isinstance(r, NI): + return r + else: + return None def ve( self, codigo_usina: Optional[int] = None, df: bool = False @@ -828,10 +724,7 @@ def ve( :return: Um ou mais registros, se existirem. :rtype: :class:`VE` | list[:class:`VE`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(VE) - else: - return self.__obtem_registros_com_filtros(VE, codigo_usina=codigo_usina) + return self.__registros_ou_df(VE, codigo_usina=codigo_usina, df=df) def fp( self, @@ -877,20 +770,19 @@ def fp( :return: Um ou mais registros, se existirem. :rtype: :class:`FP` | list[:class:`FP`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(FP) - else: - return self.__obtem_registros_com_filtros( - FP, - codigo_usina=codigo_usina, - tipo_tratamento_volume=tipo_tratamento_volume, - numero_pontos_turbinamento=numero_pontos_turbinamento, - numero_pontos_volume=numero_pontos_volume, - verifica_concavidade=verifica_concavidade, - ajuste_minimos_quadrados=ajuste_minimos_quadrados, - comprimento_janela_volume=comprimento_janela_volume, - tolerancia_desvio=tolerancia_desvio, - ) + + return self.__registros_ou_df( + FP, + codigo_usina=codigo_usina, + tipo_tratamento_volume=tipo_tratamento_volume, + numero_pontos_turbinamento=numero_pontos_turbinamento, + numero_pontos_volume=numero_pontos_volume, + verifica_concavidade=verifica_concavidade, + ajuste_minimos_quadrados=ajuste_minimos_quadrados, + comprimento_janela_volume=comprimento_janela_volume, + tolerancia_desvio=tolerancia_desvio, + df=df, + ) @property def tx(self) -> Optional[TX]: @@ -901,7 +793,11 @@ def tx(self) -> Optional[TX]: :return: Um registro, se existir. :rtype: :class:`TX` | None. """ - return self.__obtem_registro(TX) + r = self.data.get_registers_of_type(TX) + if isinstance(r, TX): + return r + else: + return None def ez( self, codigo_usina: Optional[int] = None, df: bool = False @@ -920,12 +816,7 @@ def ez( :return: Um ou mais registros, se existirem. :rtype: :class:`EZ` | list[:class:`EZ`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(EZ) - else: - return self.__obtem_registros_com_filtros( - EZ, codigo_usina=codigo_usina - ) + return self.__registros_ou_df(EZ, codigo_usina=codigo_usina, df=df) def r11( self, df: bool = False @@ -942,10 +833,8 @@ def r11( :return: Um ou mais registros, se existirem. :rtype: :class:`R11` | list[:class:`R11`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(R11) - else: - return self.__obtem_registros_com_filtros(R11) + + return self.__registros_ou_df(R11, df=df) def cr( self, @@ -971,12 +860,13 @@ def cr( :return: Um ou mais registros, se existirem. :rtype: :class:`CR` | list[:class:`CR`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(CR) - else: - return self.__obtem_registros_com_filtros( - CR, codigo_secao=codigo_secao, nome_secao=nome_secao, grau=grau - ) + return self.__registros_ou_df( + CR, + codigo_secao=codigo_secao, + nome_secao=nome_secao, + grau=grau, + df=df, + ) def secr( self, @@ -999,12 +889,9 @@ def secr( :return: Um ou mais registros, se existirem. :rtype: :class:`SECR` | list[:class:`SECR`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(SECR) - else: - return self.__obtem_registros_com_filtros( - SECR, codigo_secao=codigo_secao, nome_secao=nome_secao - ) + return self.__registros_ou_df( + SECR, codigo_secao=codigo_secao, nome_secao=nome_secao, df=df + ) def da( self, codigo_usina: Optional[int] = None, df: bool = False @@ -1022,12 +909,7 @@ def da( :return: Um ou mais registros, se existirem. :rtype: :class:`DA` | list[:class:`DA`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(DA) - else: - return self.__obtem_registros_com_filtros( - DA, codigo_usina=codigo_usina - ) + return self.__registros_ou_df(DA, codigo_usina=codigo_usina, df=df) def re( self, @@ -1065,13 +947,18 @@ def re( :return: Um ou mais registros, se existirem. :rtype: :class:`RE` | list[:class:`RE`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(RE) - else: - return self.__obtem_registros_com_filtros( - RE, - codigo_restricao=codigo_restricao, - ) + + return self.__registros_ou_df( + RE, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + df=df, + ) def lu( self, @@ -1112,19 +999,17 @@ def lu( """ - if df: - return self._as_df(LU) - else: - return self.__obtem_registros_com_filtros( - LU, - codigo_restricao=codigo_restricao, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - dia_final=dia_final, - hora_final=hora_final, - meia_hora_final=meia_hora_final, - ) + return self.__registros_ou_df( + LU, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + df=df, + ) def fh( self, @@ -1171,22 +1056,20 @@ def fh( :return: Um ou mais registros, se houverem. :rtype: :class:`FH` | list[:class:`FH`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(FH) - else: - return self.__obtem_registros_com_filtros( - FH, - codigo_restricao=codigo_restricao, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - dia_final=dia_final, - hora_final=hora_final, - meia_hora_final=meia_hora_final, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - coeficiente=coeficiente, - ) + return self.__registros_ou_df( + FH, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + coeficiente=coeficiente, + df=df, + ) def ft( self, @@ -1230,21 +1113,20 @@ def ft( :return: Um ou mais registros, se houverem. :rtype: :class:`FT` | list[:class:`FT`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(FT) - else: - return self.__obtem_registros_com_filtros( - FT, - codigo_restricao=codigo_restricao, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - dia_final=dia_final, - hora_final=hora_final, - meia_hora_final=meia_hora_final, - codigo_usina=codigo_usina, - coeficiente=coeficiente, - ) + + return self.__registros_ou_df( + FT, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + codigo_usina=codigo_usina, + coeficiente=coeficiente, + df=df, + ) def fi( self, @@ -1291,22 +1173,21 @@ def fi( :return: Um ou mais registros, se houverem. :rtype: :class:`FI` | list[:class:`FI`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(FI) - else: - return self.__obtem_registros_com_filtros( - FI, - codigo_restricao=codigo_restricao, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - dia_final=dia_final, - hora_final=hora_final, - meia_hora_final=meia_hora_final, - nome_submercado_de=nome_submercado_de, - nome_submercado_para=nome_submercado_para, - coeficiente=coeficiente, - ) + + return self.__registros_ou_df( + FI, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + nome_submercado_de=nome_submercado_de, + nome_submercado_para=nome_submercado_para, + coeficiente=coeficiente, + df=df, + ) def fe( self, @@ -1350,21 +1231,19 @@ def fe( :return: Um ou mais registros, se houverem. :rtype: :class:`FE` | list[:class:`FE`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(FE) - else: - return self.__obtem_registros_com_filtros( - FE, - codigo_restricao=codigo_restricao, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - dia_final=dia_final, - hora_final=hora_final, - meia_hora_final=meia_hora_final, - codigo_contrato=codigo_contrato, - coeficiente=coeficiente, - ) + return self.__registros_ou_df( + FE, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + codigo_contrato=codigo_contrato, + coeficiente=coeficiente, + df=df, + ) def fr( self, @@ -1408,21 +1287,19 @@ def fr( :return: Um ou mais registros, se houverem. :rtype: :class:`FR` | list[:class:`FR`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(FR) - else: - return self.__obtem_registros_com_filtros( - FR, - codigo_restricao=codigo_restricao, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - dia_final=dia_final, - hora_final=hora_final, - meia_hora_final=meia_hora_final, - codigo_usina=codigo_usina, - coeficiente=coeficiente, - ) + return self.__registros_ou_df( + FR, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + codigo_usina=codigo_usina, + coeficiente=coeficiente, + df=df, + ) def fc( self, @@ -1466,21 +1343,20 @@ def fc( :return: Um ou mais registros, se houverem. :rtype: :class:`FR` | list[:class:`FR`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(FC) - else: - return self.__obtem_registros_com_filtros( - FC, - codigo_restricao=codigo_restricao, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - dia_final=dia_final, - hora_final=hora_final, - meia_hora_final=meia_hora_final, - codigo_demanda=codigo_demanda, - coeficiente=coeficiente, - ) + + return self.__registros_ou_df( + FC, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + codigo_demanda=codigo_demanda, + coeficiente=coeficiente, + df=df, + ) def mh( self, @@ -1509,16 +1385,14 @@ def mh( :return: Um ou mais registros, se existirem. :rtype: :class:`MH` | list[:class:`MH`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(MH) - else: - return self.__obtem_registros_com_filtros( - MH, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - disponivel=disponivel, - ) + return self.__registros_ou_df( + MH, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + disponivel=disponivel, + df=df, + ) @property def pe(self) -> Optional[PE]: @@ -1529,4 +1403,8 @@ def pe(self) -> Optional[PE]: :return: Um registro, se existir. :rtype: :class:`PE` | None. """ - return self.__obtem_registro(PE) + r = self.data.get_registers_of_type(PE) + if isinstance(r, PE): + return r + else: + return None diff --git a/idessem/dessem/hidr.py b/idessem/dessem/hidr.py index b82b189b..de80d7d2 100644 --- a/idessem/dessem/hidr.py +++ b/idessem/dessem/hidr.py @@ -6,10 +6,6 @@ from typing import TypeVar, List, Optional, IO, Union -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class Hidr(RegisterFile): """ @@ -26,24 +22,6 @@ def __init__(self, data=...) -> None: super().__init__(data) self.__df: Optional[pd.DataFrame] = None - @classmethod - def le_arquivo(cls, diretorio: str, nome_arquivo="hidr.dat") -> "Hidr": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def escreve_arquivo(self, diretorio: str, nome_arquivo="hidr.dat"): - msg = ( - "O método escreve_arquivo(diretorio, nome_arquivo) será" - + " descontinuado na versão 1.0.0 -" - + " use o método write(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - self.write(join(diretorio, nome_arquivo)) - def write(self, to: Union[str, IO], *args, **kwargs): self.__atualiza_registros() super().write(to, *args, **kwargs) diff --git a/idessem/dessem/log_inviab.py b/idessem/dessem/log_inviab.py index 511add59..efb459f2 100644 --- a/idessem/dessem/log_inviab.py +++ b/idessem/dessem/log_inviab.py @@ -1,8 +1,3 @@ -import warnings - -# Para compatibilidade - até versão 1.0.0 -from os.path import join - from idessem.dessem.modelos.arquivos.arquivocsv import ( ArquivoCSV, DataEstudo, @@ -21,17 +16,6 @@ class LogInviab(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaLogInviab] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="LOG_INVIAB.DAT" - ) -> "LogInviab": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/log_matriz.py b/idessem/dessem/log_matriz.py index f5c73f12..aa59553b 100644 --- a/idessem/dessem/log_matriz.py +++ b/idessem/dessem/log_matriz.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class LogMatriz(ArquivoCSV): """ @@ -20,17 +16,6 @@ class LogMatriz(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaLogMatriz] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="LOG_MATRIZ.DAT" - ) -> "LogMatriz": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/modelos/arquivos/arquivocsv.py b/idessem/dessem/modelos/arquivos/arquivocsv.py index 0adeb96a..c03ae186 100644 --- a/idessem/dessem/modelos/arquivos/arquivocsv.py +++ b/idessem/dessem/modelos/arquivos/arquivocsv.py @@ -5,7 +5,7 @@ from cfinterface.files.blockfile import BlockFile from datetime import datetime import pandas as pd # type: ignore -from typing import Type, TypeVar, Optional +from typing import TypeVar, Optional class ArquivoCSV(BlockFile): @@ -27,26 +27,6 @@ class ArquivoCSV(BlockFile): T = TypeVar("T") - def _bloco_por_tipo(self, bloco: Type[T], indice: int) -> Optional[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - :return: O gerador de blocos, se houver - :rtype: Optional[Generator[T], None, None] - """ - try: - return next( - b - for i, b in enumerate(self.data.of_type(bloco)) - if i == indice - ) - except StopIteration: - return None - @property def versao(self) -> Optional[str]: """ @@ -55,8 +35,8 @@ def versao(self) -> Optional[str]: :return: A versão do modelo :rtype: str | None """ - b = self._bloco_por_tipo(VersaoModelo, 0) - if b is not None: + b = self.data.get_blocks_of_type(VersaoModelo) + if isinstance(b, VersaoModelo): return b.data return None @@ -68,8 +48,8 @@ def data_estudo(self) -> Optional[datetime]: :return: A data como objeto :rtype: datetime | None """ - b = self._bloco_por_tipo(DataEstudo, 0) - if b is not None: + b = self.data.get_blocks_of_type(DataEstudo) + if isinstance(b, DataEstudo): return b.data return None @@ -80,7 +60,7 @@ def _tabela(self) -> Optional[pd.DataFrame]: :return: A tabela como um dataframe :rtype: pd.DataFrame | None """ - b = self._bloco_por_tipo(TabelaCSV, 0) - if b is not None: + b = self.data.get_blocks_of_type(TabelaCSV) + if isinstance(b, TabelaCSV): return b.data return None diff --git a/idessem/dessem/operuh.py b/idessem/dessem/operuh.py index 9095a1c1..7c86db6f 100644 --- a/idessem/dessem/operuh.py +++ b/idessem/dessem/operuh.py @@ -1,11 +1,6 @@ -import warnings - -# Para compatibilidade - até versão 1.0.0 -from os.path import join from typing import List, Optional, Type, TypeVar, Union import pandas as pd # type: ignore -from cfinterface.components.register import Register from cfinterface.files.registerfile import RegisterFile from idessem.dessem.modelos.operuh import ELEM, LIM, REST, VAR @@ -20,10 +15,6 @@ class Operuh(RegisterFile): DESSEM no `operuh.dat`. Possui métodos para acessar individualmente cada registro, editá-lo e também cria alguns novos registros. - É possível ler as informações existentes em arquivos a partir do - método `le_arquivo()` e escreve um novo arquivo a partir do método - `escreve_arquivo()`. - """ T = TypeVar("T") @@ -38,106 +29,14 @@ class Operuh(RegisterFile): def __init__(self, data=...) -> None: super().__init__(data) - @classmethod - def le_arquivo(cls, diretorio: str, nome_arquivo="operuh.dat") -> "Operuh": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def escreve_arquivo(self, diretorio: str, nome_arquivo="operuh.dat"): - msg = ( - "O método escreve_arquivo(diretorio, nome_arquivo) será" - + " descontinuado na versão 1.0.0 -" - + " use o método write(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - self.write(join(diretorio, nome_arquivo)) - - def __registros_por_tipo(self, registro: Type[T]) -> List[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - """ - return [b for b in self.data.of_type(registro)] - - def __obtem_registro(self, tipo: Type[T]) -> Optional[T]: - """ """ - r = self.__obtem_registros(tipo) - return r[0] if len(r) > 0 else None - - def __obtem_registros(self, tipo: Type[T]) -> List[T]: - return self.__registros_por_tipo(tipo) - - def __obtem_registros_com_filtros( - self, tipo_registro: Type[T], **kwargs - ) -> Optional[Union[T, List[T]]]: - def __atende(r) -> bool: - condicoes: List[bool] = [] - for k, v in kwargs.items(): - if v is not None: - condicoes.append(getattr(r, k) == v) - return all(condicoes) - - regs_filtro = [r for r in self.__obtem_registros(tipo_registro) if __atende(r)] - if len(regs_filtro) == 0: - return None - elif len(regs_filtro) == 1: - return regs_filtro[0] + def __registros_ou_df( + self, t: Type[T], **kwargs + ) -> Optional[Union[T, List[T], pd.DataFrame]]: + if kwargs.get("df"): + return self._as_df(t) else: - return regs_filtro - - def cria_registro(self, anterior: Register, registro: Register): - """ - Adiciona um registro ao arquivo após um outro registro previamente - existente. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.add_after(anterior, registro) - - def deleta_registro(self, registro: Register): - """ - Remove um registro existente no arquivo. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.remove(registro) - - def lista_registros(self, tipo: Type[T]) -> List[T]: - """ - Lista todos os registros presentes no arquivo que tenham o tipo `T`. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - return [r for r in self.data.of_type(tipo)] - - def append_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na última posição. - - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.append(registro) - - def preppend_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na primeira posição. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.preppend(registro) + kwargs_sem_df = {k: v for k, v in kwargs.items() if k != "df"} + return self.data.get_registers_of_type(t, **kwargs_sem_df) def rest( self, @@ -172,18 +71,16 @@ def rest( :return: Um ou mais registros, se existirem. :rtype: :class:`REST` | list[:class:`REST`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(REST) - else: - return self.__obtem_registros_com_filtros( - REST, - codigo_restricao=codigo_restricao, - tipo_restricao=tipo_restricao, - intervalo_aplicacao=intervalo_aplicacao, - valor_inicial=valor_inicial, - tipo_restricao_variacao=tipo_restricao_variacao, - duracao_janela=duracao_janela, - ) + return self.__registros_ou_df( + REST, + codigo_restricao=codigo_restricao, + tipo_restricao=tipo_restricao, + intervalo_aplicacao=intervalo_aplicacao, + valor_inicial=valor_inicial, + tipo_restricao_variacao=tipo_restricao_variacao, + duracao_janela=duracao_janela, + df=df, + ) def elem( self, @@ -210,15 +107,14 @@ def elem( :return: Um ou mais registros, se houverem. :rtype: :class:`ELEM` | list[:class:`ELEM`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(ELEM) - else: - return self.__obtem_registros_com_filtros( - ELEM, - codigo_restricao=codigo_restricao, - codigo_usina=codigo_usina, - coeficiente=coeficiente, - ) + + return self.__registros_ou_df( + ELEM, + codigo_restricao=codigo_restricao, + codigo_usina=codigo_usina, + coeficiente=coeficiente, + df=df, + ) def lim( self, @@ -258,19 +154,17 @@ def lim( """ - if df: - return self._as_df(LIM) - else: - return self.__obtem_registros_com_filtros( - LIM, - codigo_restricao=codigo_restricao, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - dia_final=dia_final, - hora_final=hora_final, - meia_hora_final=meia_hora_final, - ) + return self.__registros_ou_df( + LIM, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + df=df, + ) def var( self, @@ -310,16 +204,14 @@ def var( """ - if df: - return self._as_df(VAR) - else: - return self.__obtem_registros_com_filtros( - VAR, - codigo_restricao=codigo_restricao, - dia_inicial=dia_inicial, - hora_inicial=hora_inicial, - meia_hora_inicial=meia_hora_inicial, - dia_final=dia_final, - hora_final=hora_final, - meia_hora_final=meia_hora_final, - ) + return self.__registros_ou_df( + VAR, + codigo_restricao=codigo_restricao, + dia_inicial=dia_inicial, + hora_inicial=hora_inicial, + meia_hora_inicial=meia_hora_inicial, + dia_final=dia_final, + hora_final=hora_final, + meia_hora_final=meia_hora_final, + df=df, + ) diff --git a/idessem/dessem/operut.py b/idessem/dessem/operut.py index ac8080be..563045cb 100644 --- a/idessem/dessem/operut.py +++ b/idessem/dessem/operut.py @@ -18,13 +18,9 @@ ) from cfinterface.files.blockfile import BlockFile -from typing import Type, TypeVar, Optional, List +from typing import TypeVar, Optional, List import pandas as pd # type: ignore -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class Operut(BlockFile): """ @@ -56,44 +52,6 @@ class Operut(BlockFile): def __init__(self, data=...) -> None: super().__init__(data) - @classmethod - def le_arquivo(cls, diretorio: str, nome_arquivo="operut.dat") -> "Operut": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def escreve_arquivo(self, diretorio: str, nome_arquivo="operut.dat"): - msg = ( - "O método escreve_arquivo(diretorio, nome_arquivo) será" - + " descontinuado na versão 1.0.0 -" - + " use o método write(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - self.write(join(diretorio, nome_arquivo)) - - def __bloco_por_tipo(self, bloco: Type[T], indice: int) -> Optional[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - :return: O gerador de blocos, se houver - :rtype: Optional[Generator[T], None, None] - """ - try: - return next( - b - for i, b in enumerate(self.data.of_type(bloco)) - if i == indice - ) - except StopIteration: - return None - @property def condicoes_iniciais(self) -> Optional[pd.DataFrame]: """ @@ -113,15 +71,15 @@ def condicoes_iniciais(self) -> Optional[pd.DataFrame]: :return: A tabela como um DataFrame :rtype: pd.DataFrame | None """ - b = self.__bloco_por_tipo(BlocoInitUT, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoInitUT) + if isinstance(b, BlocoInitUT): return b.data[1] return None @condicoes_iniciais.setter def condicoes_iniciais(self, valor: pd.DataFrame): - b = self.__bloco_por_tipo(BlocoInitUT, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoInitUT) + if isinstance(b, BlocoInitUT): b.data[1] = valor else: raise ValueError("Campo não lido") @@ -147,15 +105,15 @@ def limites_e_condicoes_operativas(self) -> Optional[pd.DataFrame]: :return: A tabela como um DataFrame :rtype: pd.DataFrame | None """ - b = self.__bloco_por_tipo(BlocoOper, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoOper) + if isinstance(b, BlocoOper): return b.data[1] return None @limites_e_condicoes_operativas.setter def limites_e_condicoes_operativas(self, valor: pd.DataFrame): - b = self.__bloco_por_tipo(BlocoOper, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoOper) + if isinstance(b, BlocoOper): b.data[1] = valor else: raise ValueError("Campo não lido") @@ -168,15 +126,15 @@ def uctpar(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoUctPar, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUctPar) + if isinstance(b, BlocoUctPar): return b.data return None @uctpar.setter def uctpar(self, valor: int): - b = self.__bloco_por_tipo(BlocoUctPar, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUctPar) + if isinstance(b, BlocoUctPar): b.data = valor else: raise ValueError("Campo não lido") @@ -189,15 +147,15 @@ def ucterm(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoUcTerm, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUcTerm) + if isinstance(b, BlocoUcTerm): return b.data return None @ucterm.setter def ucterm(self, valor: int): - b = self.__bloco_por_tipo(BlocoUcTerm, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUcTerm) + if isinstance(b, BlocoUcTerm): b.data = valor else: raise ValueError("Campo não lido") @@ -210,8 +168,8 @@ def pint(self) -> Optional[str]: :return: O flag :rtype: str | None """ - b = self.__bloco_por_tipo(BlocoPint, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoPint) + if isinstance(b, BlocoPint): return "PINT" return None @@ -224,15 +182,15 @@ def regranptv(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoRegraNPTV, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoRegraNPTV) + if isinstance(b, BlocoRegraNPTV): return b.data return None @regranptv.setter def regranptv(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoRegraNPTV, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoRegraNPTV) + if isinstance(b, BlocoRegraNPTV): b.data = valor else: raise ValueError("Campo não lido") @@ -245,15 +203,15 @@ def avlcmo(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoAvlCmo, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoAvlCmo) + if isinstance(b, BlocoAvlCmo): return b.data return None @avlcmo.setter def avlcmo(self, valor: int): - b = self.__bloco_por_tipo(BlocoAvlCmo, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoAvlCmo) + if isinstance(b, BlocoAvlCmo): b.data = valor else: raise ValueError("Campo não lido") @@ -266,8 +224,8 @@ def cplexlog(self) -> Optional[str]: :return: O flag :rtype: str | None """ - b = self.__bloco_por_tipo(BlocoCplexLog, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoCplexLog) + if isinstance(b, BlocoCplexLog): return "CPLEXLOG" return None @@ -279,8 +237,8 @@ def uctbusloc(self) -> Optional[str]: :return: O flag :rtype: str | None """ - b = self.__bloco_por_tipo(BlocoUctBusLoc, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUctBusLoc) + if isinstance(b, BlocoUctBusLoc): return "UCTBUSLOC" return None @@ -293,15 +251,15 @@ def uctheurfp(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoUctHeurFp, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUctHeurFp) + if isinstance(b, BlocoUctHeurFp): return b.data return None @uctheurfp.setter def uctheurfp(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoUctHeurFp, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoUctHeurFp) + if isinstance(b, BlocoUctHeurFp): b.data = valor else: raise ValueError("Campo não lido") @@ -314,15 +272,15 @@ def constdados(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoConstDados, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoConstDados) + if isinstance(b, BlocoConstDados): return b.data return None @constdados.setter def constdados(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoConstDados, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoConstDados) + if isinstance(b, BlocoConstDados): b.data = valor else: raise ValueError("Campo não lido") @@ -335,15 +293,15 @@ def ajustefcf(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoAjusteFcf, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoAjusteFcf) + if isinstance(b, BlocoAjusteFcf): return b.data return None @ajustefcf.setter def ajustefcf(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoAjusteFcf, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoAjusteFcf) + if isinstance(b, BlocoAjusteFcf): b.data = valor else: raise ValueError("Campo não lido") @@ -356,15 +314,15 @@ def tolerilh(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoTolerIlh, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoTolerIlh) + if isinstance(b, BlocoTolerIlh): return b.data return None @tolerilh.setter def tolerilh(self, valor: int): - b = self.__bloco_por_tipo(BlocoTolerIlh, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoTolerIlh) + if isinstance(b, BlocoTolerIlh): b.data = valor else: raise ValueError("Campo não lido") @@ -378,15 +336,15 @@ def crossover(self) -> Optional[List[int]]: :return: Lista com os flag :rtype: list | None """ - b = self.__bloco_por_tipo(BlocoCrossover, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoCrossover) + if isinstance(b, BlocoCrossover): return b.data return None @crossover.setter def crossover(self, valor: List[int]): - b = self.__bloco_por_tipo(BlocoCrossover, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoCrossover) + if isinstance(b, BlocoCrossover): b.data = valor else: raise ValueError("Campo não lido") @@ -399,15 +357,15 @@ def engolimento(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoEngolimento, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoEngolimento) + if isinstance(b, BlocoEngolimento): return b.data return None @engolimento.setter def engolimento(self, valor: int): - b = self.__bloco_por_tipo(BlocoEngolimento, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoEngolimento) + if isinstance(b, BlocoEngolimento): b.data = valor else: raise ValueError("Campo não lido") @@ -420,15 +378,15 @@ def tratainviabilha(self) -> Optional[int]: :return: O valor do flag :rtype: int | None """ - b = self.__bloco_por_tipo(BlocoTrataInviabIlha, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoTrataInviabIlha) + if isinstance(b, BlocoTrataInviabIlha): return b.data return None @tratainviabilha.setter def tratainviabilha(self, valor: int): - b = self.__bloco_por_tipo(BlocoTrataInviabIlha, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoTrataInviabIlha) + if isinstance(b, BlocoTrataInviabIlha): b.data = valor else: raise ValueError("Campo não lido") diff --git a/idessem/dessem/pdo_aval_qmaxusih.py b/idessem/dessem/pdo_aval_qmaxusih.py index 5151a233..f6f949e0 100644 --- a/idessem/dessem/pdo_aval_qmaxusih.py +++ b/idessem/dessem/pdo_aval_qmaxusih.py @@ -8,10 +8,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoAvalQmaxUsih(ArquivoCSV): """ @@ -28,17 +24,6 @@ class PdoAvalQmaxUsih(ArquivoCSV): } ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_AVAL_QMAXUSIH.DAT" - ) -> "PdoAvalQmaxUsih": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_cmobar.py b/idessem/dessem/pdo_cmobar.py index 5d9b2c25..999fc5c9 100644 --- a/idessem/dessem/pdo_cmobar.py +++ b/idessem/dessem/pdo_cmobar.py @@ -1,8 +1,3 @@ -import warnings - -# Para compatibilidade - até versão 1.0.0 -from os.path import join - from idessem.dessem.modelos.arquivos.arquivocsv import ( ArquivoCSV, DataEstudo, @@ -21,15 +16,6 @@ class PdoCmoBar(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoCmoBar] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo(cls, diretorio: str, nome_arquivo="PDO_CMOBAR.DAT") -> "PdoCmoBar": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_eco_fcfcortes.py b/idessem/dessem/pdo_eco_fcfcortes.py index 89846244..85c536d8 100644 --- a/idessem/dessem/pdo_eco_fcfcortes.py +++ b/idessem/dessem/pdo_eco_fcfcortes.py @@ -8,10 +8,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoEcoFcfCortes(ArquivoCSV): """ @@ -27,17 +23,6 @@ class PdoEcoFcfCortes(ArquivoCSV): } ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_ECO_FCFCORTES.DAT" - ) -> "PdoEcoFcfCortes": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_eco_usih.py b/idessem/dessem/pdo_eco_usih.py index 0c1a67d1..168a7323 100644 --- a/idessem/dessem/pdo_eco_usih.py +++ b/idessem/dessem/pdo_eco_usih.py @@ -9,10 +9,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoEcoUsih(ArquivoCSV): """ @@ -29,17 +25,6 @@ class PdoEcoUsih(ArquivoCSV): } ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_ECO_USIH.DAT" - ) -> "PdoEcoUsih": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_eco_usih_conj.py b/idessem/dessem/pdo_eco_usih_conj.py index 0a383c1f..3f3ed129 100644 --- a/idessem/dessem/pdo_eco_usih_conj.py +++ b/idessem/dessem/pdo_eco_usih_conj.py @@ -7,10 +7,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoEcoUsihConj(ArquivoCSV): """ @@ -22,17 +18,6 @@ class PdoEcoUsihConj(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoEcoUsihConj] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_ECO_USIH_CONJ.DAT" - ) -> "PdoEcoUsihConj": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_eco_usih_polin.py b/idessem/dessem/pdo_eco_usih_polin.py index dd757e18..3bd7db84 100644 --- a/idessem/dessem/pdo_eco_usih_polin.py +++ b/idessem/dessem/pdo_eco_usih_polin.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoEcoUsihPolin(ArquivoCSV): """ @@ -20,17 +16,6 @@ class PdoEcoUsihPolin(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoEcoUsihPolin] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_ECO_USIH_POLIN.DAT" - ) -> "PdoEcoUsihPolin": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_eolica.py b/idessem/dessem/pdo_eolica.py index ba0125e5..7a958b72 100644 --- a/idessem/dessem/pdo_eolica.py +++ b/idessem/dessem/pdo_eolica.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoEolica(ArquivoCSV): """ @@ -20,17 +16,6 @@ class PdoEolica(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoEolica] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_EOLICA.DAT" - ) -> "PdoEolica": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_hidr.py b/idessem/dessem/pdo_hidr.py index 9fe1e782..4bae17bb 100644 --- a/idessem/dessem/pdo_hidr.py +++ b/idessem/dessem/pdo_hidr.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoHidr(ArquivoCSV): """ @@ -20,17 +16,6 @@ class PdoHidr(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoHidr] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_HIDR.DAT" - ) -> "PdoHidr": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_inter.py b/idessem/dessem/pdo_inter.py index 97387dee..ff5fdce7 100644 --- a/idessem/dessem/pdo_inter.py +++ b/idessem/dessem/pdo_inter.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoInter(ArquivoCSV): """ @@ -20,17 +16,6 @@ class PdoInter(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoInter] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_INTER.DAT" - ) -> "PdoInter": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_oper_term.py b/idessem/dessem/pdo_oper_term.py index 2085b876..5194c430 100644 --- a/idessem/dessem/pdo_oper_term.py +++ b/idessem/dessem/pdo_oper_term.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoOperTerm(ArquivoCSV): """ @@ -20,17 +16,6 @@ class PdoOperTerm(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoOperTerm] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_OPER_TERM.DAT" - ) -> "PdoOperTerm": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_oper_titulacao_contratos.py b/idessem/dessem/pdo_oper_titulacao_contratos.py index c569ac2d..a4f7b520 100644 --- a/idessem/dessem/pdo_oper_titulacao_contratos.py +++ b/idessem/dessem/pdo_oper_titulacao_contratos.py @@ -7,10 +7,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoOperTitulacaoContratos(ArquivoCSV): """ @@ -24,17 +20,6 @@ class PdoOperTitulacaoContratos(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoOperTitulacaoContratos] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_OPER_TITULACAO_CONTRATOS.DAT" - ) -> "PdoOperTitulacaoContratos": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_oper_titulacao_usinas.py b/idessem/dessem/pdo_oper_titulacao_usinas.py index f9e0b126..a2710ef9 100644 --- a/idessem/dessem/pdo_oper_titulacao_usinas.py +++ b/idessem/dessem/pdo_oper_titulacao_usinas.py @@ -7,10 +7,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoOperTitulacaoUsinas(ArquivoCSV): """ @@ -23,17 +19,6 @@ class PdoOperTitulacaoUsinas(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoOperTitulacaoUsinas] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_OPER_TITULACAO_USINAS.DAT" - ) -> "PdoOperTitulacaoUsinas": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_oper_tviag_calha.py b/idessem/dessem/pdo_oper_tviag_calha.py index 4d18ebbc..60089f54 100644 --- a/idessem/dessem/pdo_oper_tviag_calha.py +++ b/idessem/dessem/pdo_oper_tviag_calha.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoOperTviagCalha(ArquivoCSV): """ @@ -21,17 +17,6 @@ class PdoOperTviagCalha(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoOperTviagCalha] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_HIDR.DAT" - ) -> "PdoOperTviagCalha": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_oper_uct.py b/idessem/dessem/pdo_oper_uct.py index 2d9154a2..969553cb 100644 --- a/idessem/dessem/pdo_oper_uct.py +++ b/idessem/dessem/pdo_oper_uct.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoOperUct(ArquivoCSV): """ @@ -20,17 +16,6 @@ class PdoOperUct(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoOperUct] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_OPER_UCT.DAT" - ) -> "PdoOperUct": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_operacao.py b/idessem/dessem/pdo_operacao.py index 6f799e97..238d422e 100644 --- a/idessem/dessem/pdo_operacao.py +++ b/idessem/dessem/pdo_operacao.py @@ -13,10 +13,6 @@ import pandas as pd # type: ignore from cfinterface.components.block import Block -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoOperacao(BlockFile): """ @@ -39,37 +35,6 @@ def __init__(self, data=...) -> None: super().__init__(data) self.__custos_operacao = None - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_OPERACAO.DAT" - ) -> "PdoOperacao": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def _bloco_por_tipo(self, bloco: Type[T], indice: int) -> Optional[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - :return: O gerador de blocos, se houver - :rtype: Optional[Generator[T], None, None] - """ - try: - return next( - b - for i, b in enumerate(self.data.of_type(bloco)) - if i == indice - ) - except StopIteration: - return None - def __concatena_blocos(self, bloco: Type[T]) -> Optional[pd.DataFrame]: """ Adiciona uma coluna com o estágio de cada bloco. @@ -99,8 +64,8 @@ def versao(self) -> Optional[str]: :return: A versão do modelo :rtype: str | None """ - b = self._bloco_por_tipo(VersaoModelo, 0) - if b is not None: + b = self.data.get_blocks_of_type(VersaoModelo) + if isinstance(b, VersaoModelo): return b.data return None @@ -112,8 +77,8 @@ def data_estudo(self) -> Optional[datetime]: :return: A data como objeto :rtype: datetime | None """ - b = self._bloco_por_tipo(DataEstudo, 0) - if b is not None: + b = self.data.get_blocks_of_type(DataEstudo) + if isinstance(b, DataEstudo): return b.data return None @@ -131,8 +96,8 @@ def discretizacao(self) -> pd.DataFrame: :return: A tabela como um dataframe :rtype: pd.DataFrame | None """ - b = self._bloco_por_tipo(BlocoDiscretizacaoTempo, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoDiscretizacaoTempo) + if isinstance(b, BlocoDiscretizacaoTempo): return b.data return None @@ -165,7 +130,7 @@ def cortes_ativos(self) -> pd.DataFrame: :return: A tabela como um dataframe :rtype: pd.DataFrame | None """ - b = self._bloco_por_tipo(BlocoCortesAtivos, 0) - if b is not None: + b = self.data.get_blocks_of_type(BlocoCortesAtivos) + if isinstance(b, BlocoCortesAtivos): return b.data return None diff --git a/idessem/dessem/pdo_reserva.py b/idessem/dessem/pdo_reserva.py index a7214849..262904c7 100644 --- a/idessem/dessem/pdo_reserva.py +++ b/idessem/dessem/pdo_reserva.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoReserva(ArquivoCSV): """ @@ -20,17 +16,6 @@ class PdoReserva(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoReserva] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_RESERVA.DAT" - ) -> "PdoReserva": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_sist.py b/idessem/dessem/pdo_sist.py index 2988029b..2ba33731 100644 --- a/idessem/dessem/pdo_sist.py +++ b/idessem/dessem/pdo_sist.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoSist(ArquivoCSV): """ @@ -20,17 +16,6 @@ class PdoSist(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoSist] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_SIST.DAT" - ) -> "PdoSist": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_somflux.py b/idessem/dessem/pdo_somflux.py index 21c61ccc..bd528f7f 100644 --- a/idessem/dessem/pdo_somflux.py +++ b/idessem/dessem/pdo_somflux.py @@ -1,8 +1,3 @@ -import warnings - -# Para compatibilidade - até versão 1.0.0 -from os.path import join - from idessem.dessem.modelos.arquivos.arquivocsv import ( ArquivoCSV, DataEstudo, @@ -21,15 +16,6 @@ class PdoSomFlux(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoSomFlux] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo(cls, diretorio: str, nome_arquivo="PDO_SOMFLUX.DAT") -> "PdoSomFlux": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/pdo_term.py b/idessem/dessem/pdo_term.py index 45c23975..aa0e9dbe 100644 --- a/idessem/dessem/pdo_term.py +++ b/idessem/dessem/pdo_term.py @@ -5,10 +5,6 @@ ArquivoCSV, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class PdoTerm(ArquivoCSV): """ @@ -20,17 +16,6 @@ class PdoTerm(ArquivoCSV): BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoTerm] ENCODING = "iso-8859-1" - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="PDO_TERM.DAT" - ) -> "PdoTerm": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - @property def tabela(self): """ diff --git a/idessem/dessem/renovaveis.py b/idessem/dessem/renovaveis.py index e923c9e0..052d894e 100644 --- a/idessem/dessem/renovaveis.py +++ b/idessem/dessem/renovaveis.py @@ -6,13 +6,8 @@ ) import pandas as pd # type: ignore from cfinterface.files.registerfile import RegisterFile -from cfinterface.components.register import Register from typing import Type, List, Optional, TypeVar, Union -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class Renovaveis(RegisterFile): """ @@ -23,10 +18,6 @@ class Renovaveis(RegisterFile): DESSEM no `renovaveis.dat`. Possui métodos para acessar individualmente cada registro, editá-lo e também cria alguns novos registros. - É possível ler as informações existentes em arquivos a partir do - método `le_arquivo()` e escreve um novo arquivo a partir do método - `escreve_arquivo()`. - """ T = TypeVar("T") @@ -36,110 +27,14 @@ class Renovaveis(RegisterFile): def __init__(self, data=...) -> None: super().__init__(data) - @classmethod - def le_arquivo( - cls, diretorio: str, nome_arquivo="renovaveis.dat" - ) -> "Renovaveis": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def escreve_arquivo(self, diretorio: str, nome_arquivo="renovaveis.dat"): - msg = ( - "O método escreve_arquivo(diretorio, nome_arquivo) será" - + " descontinuado na versão 1.0.0 -" - + " use o método write(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - self.write(join(diretorio, nome_arquivo)) - - def __registros_por_tipo(self, registro: Type[T]) -> List[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - """ - return [b for b in self.data.of_type(registro)] - - def __obtem_registro(self, tipo: Type[T]) -> Optional[T]: - """ """ - r = self.__obtem_registros(tipo) - return r[0] if len(r) > 0 else None - - def __obtem_registros(self, tipo: Type[T]) -> List[T]: - return self.__registros_por_tipo(tipo) - - def __obtem_registros_com_filtros( - self, tipo_registro: Type[T], **kwargs - ) -> Optional[Union[T, List[T]]]: - def __atende(r) -> bool: - condicoes: List[bool] = [] - for k, v in kwargs.items(): - if v is not None: - condicoes.append(getattr(r, k) == v) - return all(condicoes) - - regs_filtro = [ - r for r in self.__obtem_registros(tipo_registro) if __atende(r) - ] - if len(regs_filtro) == 0: - return None - elif len(regs_filtro) == 1: - return regs_filtro[0] + def __registros_ou_df( + self, t: Type[T], **kwargs + ) -> Optional[Union[T, List[T], pd.DataFrame]]: + if kwargs.get("df"): + return self._as_df(t) else: - return regs_filtro - - def cria_registro(self, anterior: Register, registro: Register): - """ - Adiciona um registro ao arquivo após um outro registro previamente - existente. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.add_after(anterior, registro) - - def deleta_registro(self, registro: Register): - """ - Remove um registro existente no arquivo. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.remove(registro) - - def lista_registros(self, tipo: Type[T]) -> List[T]: - """ - Lista todos os registros presentes no arquivo que tenham o tipo `T`. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - return [r for r in self.data.of_type(tipo)] - - def append_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na última posição. - - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.append(registro) - - def preppend_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na primeira posição. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.preppend(registro) + kwargs_sem_df = {k: v for k, v in kwargs.items() if k != "df"} + return self.data.get_registers_of_type(t, **kwargs_sem_df) def eolica( self, @@ -164,15 +59,14 @@ def eolica( :return: Um ou mais registros, se existirem. :rtype: :class:`EOLICA` | list[:class:`EOLICA`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(EOLICA) - else: - return self.__obtem_registros_com_filtros( - EOLICA, - codigo_usina=codigo_usina, - nome_usina=nome_usina, - constrained_off=constrained_off, - ) + + return self.__registros_ou_df( + EOLICA, + codigo_usina=codigo_usina, + nome_usina=nome_usina, + constrained_off=constrained_off, + df=df, + ) def eolicabarra( self, @@ -194,14 +88,12 @@ def eolicabarra( :return: Um ou mais registros, se existirem. :rtype: :class:`EOLICABARRA` | list[:class:`EOLICABARRA`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(EOLICABARRA) - else: - return self.__obtem_registros_com_filtros( - EOLICABARRA, - codigo_usina=codigo_usina, - codigo_barra=codigo_barra, - ) + return self.__registros_ou_df( + EOLICABARRA, + codigo_usina=codigo_usina, + codigo_barra=codigo_barra, + df=df, + ) def eolicasubm( self, @@ -223,14 +115,9 @@ def eolicasubm( :return: Um ou mais registros, se existirem. :rtype: :class:`EOLICASUBM` | list[:class:`EOLICASUBM`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(EOLICASUBM) - else: - return self.__obtem_registros_com_filtros( - EOLICASUBM, - codigo_usina=codigo_usina, - submercado=submercado, - ) + return self.__registros_ou_df( + EOLICASUBM, codigo_usina=codigo_usina, submercado=submercado, df=df + ) def eolica_geracao( self, @@ -249,10 +136,6 @@ def eolica_geracao( :return: Um ou mais registros, se existirem. :rtype: :class:`EOLICAGERACAO` | list[:class:`EOLICAGERACAO`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(EOLICAGERACAO) - else: - return self.__obtem_registros_com_filtros( - EOLICAGERACAO, - codigo_usina=codigo_usina, - ) + return self.__registros_ou_df( + EOLICAGERACAO, codigo_usina=codigo_usina, df=df + ) diff --git a/idessem/dessem/termdat.py b/idessem/dessem/termdat.py index 36c80bc8..e0ebf2a9 100644 --- a/idessem/dessem/termdat.py +++ b/idessem/dessem/termdat.py @@ -1,15 +1,9 @@ from idessem.dessem.modelos.termdat import CADUSIT, CADUNIDT, CADCONF, CADMIN import pandas as pd # type: ignore from cfinterface.files.registerfile import RegisterFile -from cfinterface.components.register import Register from typing import Type, List, Optional, TypeVar, Union -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - - class Term(RegisterFile): """ Armazena os dados com as características de cadastro das usinas @@ -19,10 +13,6 @@ class Term(RegisterFile): DESSEM no `termdat.dat`. Possui métodos para acessar individualmente cada registro, editá-lo e também cria alguns novos registros. - É possível ler as informações existentes em arquivos a partir do - método `le_arquivo()` e escreve um novo arquivo a partir do método - `escreve_arquivo()`. - """ T = TypeVar("T") @@ -32,108 +22,14 @@ class Term(RegisterFile): def __init__(self, data=...) -> None: super().__init__(data) - @classmethod - def le_arquivo(cls, diretorio: str, nome_arquivo="termdat.dat") -> "Term": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def escreve_arquivo(self, diretorio: str, nome_arquivo="termdat.dat"): - msg = ( - "O método escreve_arquivo(diretorio, nome_arquivo) será" - + " descontinuado na versão 1.0.0 -" - + " use o método write(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - self.write(join(diretorio, nome_arquivo)) - - def __registros_por_tipo(self, registro: Type[T]) -> List[T]: - """ - Obtém um gerador de blocos de um tipo, se houver algum no arquivo. - :param bloco: Um tipo de bloco para ser lido - :type bloco: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - """ - return [b for b in self.data.of_type(registro)] - - def __obtem_registro(self, tipo: Type[T]) -> Optional[T]: - """ """ - r = self.__obtem_registros(tipo) - return r[0] if len(r) > 0 else None - - def __obtem_registros(self, tipo: Type[T]) -> List[T]: - return self.__registros_por_tipo(tipo) - - def __obtem_registros_com_filtros( - self, tipo_registro: Type[T], **kwargs - ) -> Optional[Union[T, List[T]]]: - def __atende(r) -> bool: - condicoes: List[bool] = [] - for k, v in kwargs.items(): - if v is not None: - condicoes.append(getattr(r, k) == v) - return all(condicoes) - - regs_filtro = [ - r for r in self.__obtem_registros(tipo_registro) if __atende(r) - ] - if len(regs_filtro) == 0: - return None - elif len(regs_filtro) == 1: - return regs_filtro[0] + def __registros_ou_df( + self, t: Type[T], **kwargs + ) -> Optional[Union[T, List[T], pd.DataFrame]]: + if kwargs.get("df"): + return self._as_df(t) else: - return regs_filtro - - def cria_registro(self, anterior: Register, registro: Register): - """ - Adiciona um registro ao arquivo após um outro registro previamente - existente. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.add_after(anterior, registro) - - def deleta_registro(self, registro: Register): - """ - Remove um registro existente no arquivo. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.remove(registro) - - def lista_registros(self, tipo: Type[T]) -> List[T]: - """ - Lista todos os registros presentes no arquivo que tenham o tipo `T`. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - return [r for r in self.data.of_type(tipo)] - - def append_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na última posição. - - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.append(registro) - - def preppend_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na primeira posição. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.preppend(registro) + kwargs_sem_df = {k: v for k, v in kwargs.items() if k != "df"} + return self.data.get_registers_of_type(t, **kwargs_sem_df) def cadusit( self, @@ -153,13 +49,8 @@ def cadusit( :return: Um ou mais registros, se existirem. :rtype: :class:`CADUSIT` | list[:class:`CADUSIT`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(CADUSIT) - else: - return self.__obtem_registros_com_filtros( - CADUSIT, - codigo_usina=codigo_usina, - ) + + return self.__registros_ou_df(CADUSIT, codigo_usina=codigo_usina, df=df) def cadunidt( self, @@ -183,14 +74,13 @@ def cadunidt( :return: Um ou mais registros, se existirem. :rtype: :class:`CADUNIDT` | list[:class:`CADUNIDT`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(CADUNIDT) - else: - return self.__obtem_registros_com_filtros( - CADUNIDT, - codigo_usina=codigo_usina, - codigo_unidade=codigo_unidade, - ) + + return self.__registros_ou_df( + CADUNIDT, + codigo_usina=codigo_usina, + codigo_unidade=codigo_unidade, + df=df, + ) def cadconf( self, @@ -216,15 +106,13 @@ def cadconf( :return: Um ou mais registros, se existirem. :rtype: :class:`CADCONF` | list[:class:`CADCONF`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(CADCONF) - else: - return self.__obtem_registros_com_filtros( - CADCONF, - codigo_usina=codigo_usina, - codigo_unidade_equivalente=codigo_unidade_equivalente, - codigo_unidade=codigo_unidade, - ) + return self.__registros_ou_df( + CADCONF, + codigo_usina=codigo_usina, + codigo_unidade_equivalente=codigo_unidade_equivalente, + codigo_unidade=codigo_unidade, + df=df, + ) def cadmin( self, @@ -248,11 +136,10 @@ def cadmin( :return: Um ou mais registros, se existirem. :rtype: :class:`CADMIN` | list[:class:`CADMIN`] | :class:`pd.DataFrame` | None """ - if df: - return self._as_df(CADMIN) - else: - return self.__obtem_registros_com_filtros( - CADMIN, - codigo_usina=codigo_usina, - codigo_unidade_equivalente=codigo_unidade_equivalente, - ) + + return self.__registros_ou_df( + CADMIN, + codigo_usina=codigo_usina, + codigo_unidade_equivalente=codigo_unidade_equivalente, + df=df, + ) diff --git a/idessem/libs/uch.py b/idessem/libs/uch.py index 75a8e0f9..2aed2c2e 100644 --- a/idessem/libs/uch.py +++ b/idessem/libs/uch.py @@ -1,5 +1,4 @@ from typing import Type, TypeVar, Optional, List, Union -from cfinterface.components.register import Register from cfinterface.files.registerfile import RegisterFile import pandas as pd # type: ignore from idessem.libs.modelos.uch import ( @@ -29,10 +28,6 @@ UchCustoPartidaUsina, ) -# Para compatibilidade - até versão 1.0.0 -from os.path import join -import warnings - class Uch(RegisterFile): """Armazena os dados de entrada do DESSEM referentes aos dados @@ -67,98 +62,14 @@ class Uch(RegisterFile): UchOpcaoUsina, ] - @classmethod - def le_arquivo(cls, diretorio: str, nome_arquivo="uch.csv") -> "Uch": - msg = ( - "O método le_arquivo(diretorio, nome_arquivo) será descontinuado" - + " na versão 1.0.0 - use o método read(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - return cls.read(join(diretorio, nome_arquivo)) - - def escreve_arquivo(self, diretorio: str, nome_arquivo="uch.csv"): - msg = ( - "O método escreve_arquivo(diretorio, nome_arquivo) será" - + " descontinuado na versão 1.0.0 -" - + " use o método write(caminho_arquivo)" - ) - warnings.warn(msg, category=FutureWarning) - self.write(join(diretorio, nome_arquivo)) - - def __registros_por_tipo(self, registro: Type[T]) -> List[T]: - """ - Obtém os registro de um tipo, se houver algum no arquivo. - - :param registro: Um tipo de registro para ser lido - :type registro: T - :param indice: O índice do bloco a ser acessado, dentre os do tipo - :type indice: int - - """ - return [b for b in self.data.of_type(registro)] - - def __obtem_registro(self, tipo: Type[T]) -> Optional[T]: - """ """ - r = self.__obtem_registros(tipo) - return r[0] if len(r) > 0 else None - - def __obtem_registros(self, tipo: Type[T]) -> List[T]: - return self.__registros_por_tipo(tipo) - - def __obtem_registros_com_filtros( - self, tipo_registro: Type[T], **kwargs - ) -> Optional[Union[T, List[T]]]: - def __atende(r) -> bool: - condicoes: List[bool] = [] - for k, v in kwargs.items(): - if v is not None: - condicoes.append(getattr(r, k) == v) - return all(condicoes) - - regs_filtro = [ - r for r in self.__obtem_registros(tipo_registro) if __atende(r) - ] - if len(regs_filtro) == 0: - return None - elif len(regs_filtro) == 1: - return regs_filtro[0] + def __registros_ou_df( + self, t: Type[T], **kwargs + ) -> Optional[Union[T, List[T], pd.DataFrame]]: + if kwargs.get("df"): + return self._as_df(t) else: - return regs_filtro - - def cria_registro(self, anterior: Register, registro: Register): - """ - Adiciona um registro ao arquivo após um outro registro previamente - existente. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.add_after(anterior, registro) - - def deleta_registro(self, registro: Register): - """ - Remove um registro existente no arquivo. - - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.remove(registro) - - def append_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na última posição. - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.append(registro) - - def preppend_registro(self, registro: Register): - """ - Adiciona um registro ao arquivo na primeira posição. - Este método existe para retrocompatibilidade e deve ser substituído - quando for suportado na classe :class:`RegisterFile`. - """ - self.data.preppend(registro) + kwargs_sem_df = {k: v for k, v in kwargs.items() if k != "df"} + return self.data.get_registers_of_type(t, **kwargs_sem_df) @property def opcao_padrao( @@ -172,7 +83,11 @@ def opcao_padrao( :rtype: `UchOpcaoPadrao` | `None` """ - return self.__obtem_registro(UchOpcaoPadrao) + r = self.data.get_registers_of_type(UchOpcaoPadrao) + if isinstance(r, UchOpcaoPadrao): + return r + else: + return None def opcao_usina( self, @@ -193,14 +108,12 @@ def opcao_usina( :rtype: `UchOpcaoUsina` | List[`UchOpcaoUsina`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchOpcaoUsina) - else: - return self.__obtem_registros_com_filtros( - UchOpcaoUsina, - codigo_usina=codigo_usina, - considera_uch_usina=considera_uch_usina, - ) + return self.__registros_ou_df( + UchOpcaoUsina, + codigo_usina=codigo_usina, + considera_uch_usina=considera_uch_usina, + df=df, + ) @property def opcao_padrao_data( @@ -214,7 +127,11 @@ def opcao_padrao_data( :rtype: `UchOpcaoPadrao` | `None` """ - return self.__obtem_registro(UchOpcaoPadraoData) + r = self.data.get_registers_of_type(UchOpcaoPadraoData) + if isinstance(r, UchOpcaoPadraoData): + return r + else: + return None def opcao_unidade_vazio_padrao( self, @@ -247,16 +164,15 @@ def opcao_unidade_vazio_padrao( :rtype: `UchOpcaoUnidadeVazioPadrao` | List[`UchOpcaoUnidadeVazioPadrao`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchOpcaoUnidadeVazioPadrao) - else: - return self.__obtem_registros_com_filtros( - UchOpcaoUnidadeVazioPadrao, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - considera_operacao_vazio=considera_operacao_vazio, - ) + + return self.__registros_ou_df( + UchOpcaoUnidadeVazioPadrao, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + considera_operacao_vazio=considera_operacao_vazio, + df=df, + ) def opcao_conjunto_vazio_padrao( self, @@ -287,15 +203,14 @@ def opcao_conjunto_vazio_padrao( :rtype: `UchOpcaoConjuntoVazioPadrao` | List[`UchOpcaoConjuntoVazioPadrao`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchOpcaoConjuntoVazioPadrao) - else: - return self.__obtem_registros_com_filtros( - UchOpcaoConjuntoVazioPadrao, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - considera_operacao_vazio=considera_operacao_vazio, - ) + + return self.__registros_ou_df( + UchOpcaoConjuntoVazioPadrao, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + considera_operacao_vazio=considera_operacao_vazio, + df=df, + ) def opcao_usina_vazio_padrao( self, @@ -322,14 +237,13 @@ def opcao_usina_vazio_padrao( :rtype: `UchOpcaoUsinaVazioPadrao` | List[`UchOpcaoUsinaVazioPadrao`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchOpcaoUsinaVazioPadrao) - else: - return self.__obtem_registros_com_filtros( - UchOpcaoUsinaVazioPadrao, - codigo_usina=codigo_usina, - considera_operacao_vazio=considera_operacao_vazio, - ) + + return self.__registros_ou_df( + UchOpcaoUsinaVazioPadrao, + codigo_usina=codigo_usina, + considera_operacao_vazio=considera_operacao_vazio, + df=df, + ) def ton_toff_unidade( self, @@ -366,17 +280,16 @@ def ton_toff_unidade( :rtype: `UchTonToffUnidade` | List[`UchTonToffUnidade`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchTonToffUnidade) - else: - return self.__obtem_registros_com_filtros( - UchTonToffUnidade, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - tempo_minimo_ligada=tempo_minimo_ligada, - tempo_maximo_ligada=tempo_maximo_ligada, - ) + + return self.__registros_ou_df( + UchTonToffUnidade, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + tempo_minimo_ligada=tempo_minimo_ligada, + tempo_maximo_ligada=tempo_maximo_ligada, + df=df, + ) def ton_toff_conjunto( self, @@ -410,16 +323,15 @@ def ton_toff_conjunto( :rtype: `UchTonToffConjunto` | List[`UchTonToffConjunto`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchTonToffConjunto) - else: - return self.__obtem_registros_com_filtros( - UchTonToffConjunto, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - tempo_minimo_ligada=tempo_minimo_ligada, - tempo_maximo_ligada=tempo_maximo_ligada, - ) + + return self.__registros_ou_df( + UchTonToffConjunto, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + tempo_minimo_ligada=tempo_minimo_ligada, + tempo_maximo_ligada=tempo_maximo_ligada, + df=df, + ) def ton_toff_usina( self, @@ -450,15 +362,14 @@ def ton_toff_usina( :rtype: `UchTonToffUsina` | List[`UchTonToffUsina`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchTonToffUsina) - else: - return self.__obtem_registros_com_filtros( - UchTonToffUsina, - codigo_usina=codigo_usina, - tempo_minimo_ligada=tempo_minimo_ligada, - tempo_maximo_ligada=tempo_maximo_ligada, - ) + + return self.__registros_ou_df( + UchTonToffUsina, + codigo_usina=codigo_usina, + tempo_minimo_ligada=tempo_minimo_ligada, + tempo_maximo_ligada=tempo_maximo_ligada, + df=df, + ) def gmin_gmax_unidade( self, @@ -495,17 +406,16 @@ def gmin_gmax_unidade( :rtype: `UchGminGmaxUnidade` | List[`UchGminGmaxUnidade`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchGminGmaxUnidade) - else: - return self.__obtem_registros_com_filtros( - UchGminGmaxUnidade, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - geracao_minima_unidade=geracao_minima_unidade, - geracao_maxima_unidade=geracao_maxima_unidade, - ) + + return self.__registros_ou_df( + UchGminGmaxUnidade, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + geracao_minima_unidade=geracao_minima_unidade, + geracao_maxima_unidade=geracao_maxima_unidade, + df=df, + ) def qturmin_qturmax_unidade( self, @@ -542,17 +452,16 @@ def qturmin_qturmax_unidade( :rtype: `UchQturminQturmaxUnidade` | List[`UchQturminQturmaxUnidade`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchQturminQturmaxUnidade) - else: - return self.__obtem_registros_com_filtros( - UchQturminQturmaxUnidade, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - turbinamento_minimo_unidade=turbinamento_minimo_unidade, - turbinamento_maximo_unidade=turbinamento_maximo_unidade, - ) + + return self.__registros_ou_df( + UchQturminQturmaxUnidade, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + turbinamento_minimo_unidade=turbinamento_minimo_unidade, + turbinamento_maximo_unidade=turbinamento_maximo_unidade, + df=df, + ) def condicao_inicial_unidade( self, @@ -595,19 +504,18 @@ def condicao_inicial_unidade( :rtype: `UchCondicaoInicialUnidade` | List[`UchCondicaoInicialUnidade`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchCondicaoInicialUnidade) - else: - return self.__obtem_registros_com_filtros( - UchCondicaoInicialUnidade, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - status_inicial=status_inicial, - tempo_permanencia_unidade=tempo_permanencia_unidade, - geracao_inicial_unidade=geracao_inicial_unidade, - turbinamento_inicial_unidade=turbinamento_inicial_unidade, - ) + + return self.__registros_ou_df( + UchCondicaoInicialUnidade, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + status_inicial=status_inicial, + tempo_permanencia_unidade=tempo_permanencia_unidade, + geracao_inicial_unidade=geracao_inicial_unidade, + turbinamento_inicial_unidade=turbinamento_inicial_unidade, + df=df, + ) def consumo_agua_vazio_unidade( self, @@ -641,16 +549,15 @@ def consumo_agua_vazio_unidade( :rtype: `UchConsumoAguaVazioUnidade` | List[`UchConsumoAguaVazioUnidade`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchConsumoAguaVazioUnidade) - else: - return self.__obtem_registros_com_filtros( - UchConsumoAguaVazioUnidade, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - consumo_agua=consumo_agua, - ) + + return self.__registros_ou_df( + UchConsumoAguaVazioUnidade, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + consumo_agua=consumo_agua, + df=df, + ) def consumo_agua_vazio_conjunto( self, @@ -681,15 +588,14 @@ def consumo_agua_vazio_conjunto( :rtype: `UchConsumoAguaVazioConjunto` | List[`UchConsumoAguaVazioConjunto`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchConsumoAguaVazioConjunto) - else: - return self.__obtem_registros_com_filtros( - UchConsumoAguaVazioConjunto, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - consumo_agua=consumo_agua, - ) + + return self.__registros_ou_df( + UchConsumoAguaVazioConjunto, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + consumo_agua=consumo_agua, + df=df, + ) def consumo_agua_vazio_usina( self, @@ -717,14 +623,13 @@ def consumo_agua_vazio_usina( :rtype: `UchConsumoAguaVazioUsina` | List[`UchConsumoAguaVazioUsina`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchConsumoAguaVazioUsina) - else: - return self.__obtem_registros_com_filtros( - UchConsumoAguaVazioUsina, - codigo_usina=codigo_usina, - consumo_agua=consumo_agua, - ) + + return self.__registros_ou_df( + UchConsumoAguaVazioUsina, + codigo_usina=codigo_usina, + consumo_agua=consumo_agua, + df=df, + ) def limite_mudanca_status_vazio_unidade( self, @@ -758,16 +663,15 @@ def limite_mudanca_status_vazio_unidade( :rtype: `UchLimiteMudancaStatusVazioUnidade` | List[`UchLimiteMudancaStatusVazioUnidade`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchLimiteMudancaStatusVazioUnidade) - else: - return self.__obtem_registros_com_filtros( - UchLimiteMudancaStatusVazioUnidade, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - limite_maximo_mudancas=limite_maximo_mudancas, - ) + + return self.__registros_ou_df( + UchLimiteMudancaStatusVazioUnidade, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + limite_maximo_mudancas=limite_maximo_mudancas, + df=df, + ) def limite_mudanca_status_vazio_conjunto( self, @@ -797,15 +701,14 @@ def limite_mudanca_status_vazio_conjunto( :rtype: `UchLimiteMudancaStatusVazioConjunto` | List[`UchLimiteMudancaStatusVazioConjunto`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchLimiteMudancaStatusVazioConjunto) - else: - return self.__obtem_registros_com_filtros( - UchLimiteMudancaStatusVazioConjunto, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - limite_maximo_mudancas=limite_maximo_mudancas, - ) + + return self.__registros_ou_df( + UchLimiteMudancaStatusVazioConjunto, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + limite_maximo_mudancas=limite_maximo_mudancas, + df=df, + ) def limite_mudanca_status_vazio_usina( self, @@ -832,14 +735,13 @@ def limite_mudanca_status_vazio_usina( :rtype: `UchLimiteMudancaStatusVazioUsina` | List[`UchLimiteMudancaStatusVazioUsina`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchLimiteMudancaStatusVazioUsina) - else: - return self.__obtem_registros_com_filtros( - UchLimiteMudancaStatusVazioUsina, - codigo_usina=codigo_usina, - limite_maximo_mudancas=limite_maximo_mudancas, - ) + + return self.__registros_ou_df( + UchLimiteMudancaStatusVazioUsina, + codigo_usina=codigo_usina, + limite_maximo_mudancas=limite_maximo_mudancas, + df=df, + ) def custo_partida_vazio_unidade( self, @@ -874,16 +776,15 @@ def custo_partida_vazio_unidade( :rtype: `UchCustoPartidaVazioUnidade` | List[`UchCustoPartidaVazioUnidade`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchCustoPartidaVazioUnidade) - else: - return self.__obtem_registros_com_filtros( - UchCustoPartidaVazioUnidade, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - custo_partida=custo_partida, - ) + + return self.__registros_ou_df( + UchCustoPartidaVazioUnidade, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + custo_partida=custo_partida, + df=df, + ) def custo_partida_vazio_conjunto( self, @@ -915,15 +816,14 @@ def custo_partida_vazio_conjunto( :rtype: `UchCustoPartidaVazioConjunto` | List[`UchCustoPartidaVazioConjunto`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchCustoPartidaVazioConjunto) - else: - return self.__obtem_registros_com_filtros( - UchCustoPartidaVazioConjunto, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - custo_partida=custo_partida, - ) + + return self.__registros_ou_df( + UchCustoPartidaVazioConjunto, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + custo_partida=custo_partida, + df=df, + ) def custo_partida_vazio_usina( self, @@ -952,14 +852,13 @@ def custo_partida_vazio_usina( :rtype: `UchCustoPartidaVazioUsina` | List[`UchCustoPartidaVazioUsina`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchCustoPartidaVazioUsina) - else: - return self.__obtem_registros_com_filtros( - UchCustoPartidaVazioUsina, - codigo_usina=codigo_usina, - custo_partida=custo_partida, - ) + + return self.__registros_ou_df( + UchCustoPartidaVazioUsina, + codigo_usina=codigo_usina, + custo_partida=custo_partida, + df=df, + ) def custo_partida_unidade( self, @@ -993,16 +892,15 @@ def custo_partida_unidade( :rtype: `UchCustoPartidaUnidade` | List[`UchCustoPartidaUnidade`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchCustoPartidaUnidade) - else: - return self.__obtem_registros_com_filtros( - UchCustoPartidaUnidade, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - codigo_unidade=codigo_unidade, - custo_partida=custo_partida, - ) + + return self.__registros_ou_df( + UchCustoPartidaUnidade, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + codigo_unidade=codigo_unidade, + custo_partida=custo_partida, + df=df, + ) def custo_partida_conjunto( self, @@ -1033,15 +931,14 @@ def custo_partida_conjunto( :rtype: `UchCustoPartidaConjunto` | List[`UchCustoPartidaConjunto`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchCustoPartidaConjunto) - else: - return self.__obtem_registros_com_filtros( - UchCustoPartidaConjunto, - codigo_usina=codigo_usina, - codigo_conjunto=codigo_conjunto, - custo_partida=custo_partida, - ) + + return self.__registros_ou_df( + UchCustoPartidaConjunto, + codigo_usina=codigo_usina, + codigo_conjunto=codigo_conjunto, + custo_partida=custo_partida, + df=df, + ) def custo_partida_usina( self, @@ -1069,11 +966,10 @@ def custo_partida_usina( :rtype: `UchCustoPartidaUsina` | List[`UchCustoPartidaUsina`] | `None` | `DataFrame` """ - if df: - return self._as_df(UchCustoPartidaUsina) - else: - return self.__obtem_registros_com_filtros( - UchCustoPartidaUsina, - codigo_usina=codigo_usina, - custo_partida=custo_partida, - ) + + return self.__registros_ou_df( + UchCustoPartidaUsina, + codigo_usina=codigo_usina, + custo_partida=custo_partida, + df=df, + ) From d47732b87a09bc7de214197a2b3b297d106cefa9 Mon Sep 17 00:00:00 2001 From: marianasnoel Date: Fri, 21 Feb 2025 17:21:45 -0300 Subject: [PATCH 4/6] reverte uch para arquivos dessem --- idessem/dessem/__init__.py | 1 + idessem/{libs => dessem}/modelos/uch.py | 0 idessem/{libs => dessem}/uch.py | 2 +- idessem/libs/__init__.py | 1 - tests/{libs => dessem}/test_uch.py | 4 ++-- 5 files changed, 4 insertions(+), 4 deletions(-) rename idessem/{libs => dessem}/modelos/uch.py (100%) rename idessem/{libs => dessem}/uch.py (99%) rename tests/{libs => dessem}/test_uch.py (99%) diff --git a/idessem/dessem/__init__.py b/idessem/dessem/__init__.py index deba84da..443c5535 100644 --- a/idessem/dessem/__init__.py +++ b/idessem/dessem/__init__.py @@ -41,3 +41,4 @@ from .renovaveis import Renovaveis # noqa from .respot import Respot # noqa from .termdat import Term # noqa +from .uch import Uch # noqa diff --git a/idessem/libs/modelos/uch.py b/idessem/dessem/modelos/uch.py similarity index 100% rename from idessem/libs/modelos/uch.py rename to idessem/dessem/modelos/uch.py diff --git a/idessem/libs/uch.py b/idessem/dessem/uch.py similarity index 99% rename from idessem/libs/uch.py rename to idessem/dessem/uch.py index 2aed2c2e..b6febe67 100644 --- a/idessem/libs/uch.py +++ b/idessem/dessem/uch.py @@ -1,7 +1,7 @@ from typing import Type, TypeVar, Optional, List, Union from cfinterface.files.registerfile import RegisterFile import pandas as pd # type: ignore -from idessem.libs.modelos.uch import ( +from idessem.dessem.modelos.uch import ( UchOpcaoPadrao, UchOpcaoUsina, UchOpcaoPadraoData, diff --git a/idessem/libs/__init__.py b/idessem/libs/__init__.py index 28450ffc..af9a4b77 100644 --- a/idessem/libs/__init__.py +++ b/idessem/libs/__init__.py @@ -1,4 +1,3 @@ # Inclui os membros from .usinas_hidreletricas import UsinasHidreletricas # noqa -from .uch import Uch # noqa diff --git a/tests/libs/test_uch.py b/tests/dessem/test_uch.py similarity index 99% rename from tests/libs/test_uch.py rename to tests/dessem/test_uch.py index ad2e8858..b477eda0 100644 --- a/tests/libs/test_uch.py +++ b/tests/dessem/test_uch.py @@ -1,5 +1,5 @@ -from idessem.libs.uch import Uch -from idessem.libs.modelos.uch import ( +from idessem.dessem.uch import Uch +from idessem.dessem.modelos.uch import ( UchOpcaoPadrao, UchOpcaoUsina, UchOpcaoPadraoData, From c1c79303327297396aecb05a23f9e8dc64d09139 Mon Sep 17 00:00:00 2001 From: marianasnoel Date: Fri, 21 Feb 2025 17:34:05 -0300 Subject: [PATCH 5/6] resolve pandas future warning --- idessem/dessem/avl_fpha2.py | 8 +++++++- idessem/dessem/avl_fpha3.py | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/idessem/dessem/avl_fpha2.py b/idessem/dessem/avl_fpha2.py index 356e2d24..f89f2bd2 100644 --- a/idessem/dessem/avl_fpha2.py +++ b/idessem/dessem/avl_fpha2.py @@ -45,8 +45,14 @@ def tabela(self): if self.__df_completo is None: tabelas = self.data.of_type(TabelaAvlFpha2) tabelas_validas = [t.data for t in tabelas if t is not None] + tabelas_validas = [ + t for t in tabelas_validas if isinstance(t, pd.DataFrame) + ] + tabelas_validas = [ + t.dropna(axis=1, how="all") for t in tabelas_validas + ] self.__df_completo = pd.concat( - [t for t in tabelas_validas if isinstance(t, pd.DataFrame)], + tabelas_validas, ignore_index=True, ) return self.__df_completo diff --git a/idessem/dessem/avl_fpha3.py b/idessem/dessem/avl_fpha3.py index 4ce564e6..66f7e69c 100644 --- a/idessem/dessem/avl_fpha3.py +++ b/idessem/dessem/avl_fpha3.py @@ -46,6 +46,12 @@ def tabela(self): if self.__df_completo is None: tabelas = self.data.of_type(TabelaAvlFpha3) tabelas_validas = [t.data for t in tabelas if t is not None] + tabelas_validas = [ + t for t in tabelas_validas if isinstance(t, pd.DataFrame) + ] + tabelas_validas = [ + t.dropna(axis=1, how="all") for t in tabelas_validas + ] self.__df_completo = pd.concat( [t for t in tabelas_validas if isinstance(t, pd.DataFrame)], ignore_index=True, From c566d9d94f2c50c60231155a4d1642e0f6e87c76 Mon Sep 17 00:00:00 2001 From: marianasnoel Date: Fri, 21 Feb 2025 17:47:14 -0300 Subject: [PATCH 6/6] fix mypy --- idessem/dessem/dessopc.py | 4 ++-- idessem/dessem/entdados.py | 3 ++- idessem/dessem/operuh.py | 3 ++- idessem/dessem/renovaveis.py | 3 ++- idessem/dessem/termdat.py | 3 ++- idessem/dessem/uch.py | 3 ++- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/idessem/dessem/dessopc.py b/idessem/dessem/dessopc.py index 76e846ef..f9bbd3b2 100644 --- a/idessem/dessem/dessopc.py +++ b/idessem/dessem/dessopc.py @@ -63,7 +63,7 @@ def uctpar(self) -> Optional[int]: @uctpar.setter def uctpar(self, valor: int): b = self.data.get_blocks_of_type(BlocoUctPar) - if b is not None: + if isinstance(b, BlocoUctPar): b.data = valor else: raise ValueError("Campo não lido") @@ -84,7 +84,7 @@ def ucterm(self) -> Optional[int]: @ucterm.setter def ucterm(self, valor: int): b = self.data.get_blocks_of_type(BlocoUcTerm) - if b is not None: + if isinstance(b, BlocoUcTerm): b.data = valor else: raise ValueError("Campo não lido") diff --git a/idessem/dessem/entdados.py b/idessem/dessem/entdados.py index 7a38999e..b0009ed3 100644 --- a/idessem/dessem/entdados.py +++ b/idessem/dessem/entdados.py @@ -59,6 +59,7 @@ from cfinterface.files.registerfile import RegisterFile from typing import Type, List, Optional, TypeVar, Union, Any import numpy as np +from cfinterface.components.register import Register class Entdados(RegisterFile): @@ -71,7 +72,7 @@ class Entdados(RegisterFile): """ - T = TypeVar("T") + T = TypeVar("T", bound=Register) AC = Union[ ACVTFUGA, diff --git a/idessem/dessem/operuh.py b/idessem/dessem/operuh.py index 7c86db6f..6e96bb30 100644 --- a/idessem/dessem/operuh.py +++ b/idessem/dessem/operuh.py @@ -4,6 +4,7 @@ from cfinterface.files.registerfile import RegisterFile from idessem.dessem.modelos.operuh import ELEM, LIM, REST, VAR +from cfinterface.components.register import Register class Operuh(RegisterFile): @@ -17,7 +18,7 @@ class Operuh(RegisterFile): """ - T = TypeVar("T") + T = TypeVar("T", bound=Register) REGISTERS = [ REST, diff --git a/idessem/dessem/renovaveis.py b/idessem/dessem/renovaveis.py index 052d894e..a268b68c 100644 --- a/idessem/dessem/renovaveis.py +++ b/idessem/dessem/renovaveis.py @@ -7,6 +7,7 @@ import pandas as pd # type: ignore from cfinterface.files.registerfile import RegisterFile from typing import Type, List, Optional, TypeVar, Union +from cfinterface.components.register import Register class Renovaveis(RegisterFile): @@ -20,7 +21,7 @@ class Renovaveis(RegisterFile): """ - T = TypeVar("T") + T = TypeVar("T", bound=Register) REGISTERS = [EOLICAGERACAO, EOLICASUBM, EOLICABARRA, EOLICA] diff --git a/idessem/dessem/termdat.py b/idessem/dessem/termdat.py index e0ebf2a9..f89c4d43 100644 --- a/idessem/dessem/termdat.py +++ b/idessem/dessem/termdat.py @@ -2,6 +2,7 @@ import pandas as pd # type: ignore from cfinterface.files.registerfile import RegisterFile from typing import Type, List, Optional, TypeVar, Union +from cfinterface.components.register import Register class Term(RegisterFile): @@ -15,7 +16,7 @@ class Term(RegisterFile): """ - T = TypeVar("T") + T = TypeVar("T", bound=Register) REGISTERS = [CADUSIT, CADUNIDT, CADCONF, CADMIN] diff --git a/idessem/dessem/uch.py b/idessem/dessem/uch.py index b6febe67..ebc3e7c2 100644 --- a/idessem/dessem/uch.py +++ b/idessem/dessem/uch.py @@ -27,13 +27,14 @@ UchCustoPartidaConjunto, UchCustoPartidaUsina, ) +from cfinterface.components.register import Register class Uch(RegisterFile): """Armazena os dados de entrada do DESSEM referentes aos dados de unit commitment hidráulico (UCH) do problema.""" - T = TypeVar("T") + T = TypeVar("T", bound=Register) REGISTERS = [ UchCustoPartidaVazioUnidade,