### Example AVL_FPHA1 file content Source: https://rjmalves.github.io/idessem/_sources/geral/tutorial.rst.txt Raw data format for an AVL_FPHA1 file. ```text -----;--------------;-------;---------;------------;-------------;-------------;-------------; USIH ; Nome ;SegFPHA; Fcorrec ; Rhs ; Varm ; Qtur ; Qlat ; -----;--------------;-------;---------;------------;-------------;-------------;-------------; 001 ; CAMARGOS ; 1 ; 1.00000 ; -11.8461 ; 0.020604 ; 0.224440 ; 0.000000 ; 001 ; CAMARGOS ; 2 ; 1.00000 ; -5.7558 ; 0.020604 ; 0.186494 ; 0.000000 ; 001 ; CAMARGOS ; 3 ; 1.00000 ; 0.0000 ; 0.000000 ; 0.225931 ; 0.000000 ; 001 ; CAMARGOS ; 4 ; 1.00000 ; 7.0475 ; 0.000000 ; 0.182021 ; 0.000000 ; ``` ```text * MODELO DESSEM - VERSAO 19.3.1 - Fevereiro de 2023 (CPLEX) * -----;--------------;-------;---------;--------;------------;-------------;-------------;-------------; USIH ; Nome ;SegFPHA; Fcorrec ; QlatpM ; Rhs ; Varm ; Qtur ; Qlat ; -----;--------------;-------;---------;--------;------------;-------------;-------------;-------------; 001 ; CAMARGOS ; 1 ; 1.00000 ; 0.00 ; -11.4690 ; 0.020604 ; 0.223018 ; 0.000000 ; 001 ; CAMARGOS ; 2 ; 1.00000 ; 0.00 ; -7.8204 ; 0.013736 ; 0.225763 ; 0.000000 ; 001 ; CAMARGOS ; 3 ; 1.00000 ; 0.00 ; -7.7113 ; 0.013736 ; 0.224743 ; 0.000000 ; 001 ; CAMARGOS ; 4 ; 1.00000 ; 0.00 ; -5.2177 ; 0.020604 ; 0.184069 ; 0.000000 ; ``` -------------------------------- ### Instalar idessem com uv Source: https://rjmalves.github.io/idessem/_sources/geral/instalacao.rst.txt Comandos para adicionar o pacote a um projeto ou instalar diretamente no ambiente ativo usando uv. ```bash $ uv add idessem ``` ```bash $ uv pip install idessem ``` -------------------------------- ### Deflant.defant Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/deflant.html Retrieves records specifying the outflows prior to the study start for travel time considerations. ```APIDOC ## defant ### Description Retrieves one or more records representing the outflows of hydroelectric plants prior to the study start date. ### Parameters - **codigo_usina_montante** (int) - Optional - Index of the upstream hydroelectric plant with travel time. - **codigo_elemento_jusante** (int) - Optional - Index of the downstream element. - **tipo_elemento_jusante** (str) - Optional - Type of the downstream element (e.g., section or UHE). - **defluencia** (float) - Optional - Outflow value. - **df** (bool) - Optional - If True, returns all records as a pandas DataFrame, ignoring other filters. ### Returns - **Union[DEFANT, List[DEFANT], pd.DataFrame, None]** - Returns the matching record(s) or a DataFrame if requested. ``` -------------------------------- ### Verificar instalação Source: https://rjmalves.github.io/idessem/_sources/geral/instalacao.rst.txt Script Python para confirmar se o pacote foi instalado corretamente verificando sua versão. ```python import idessem print(idessem.__version__) ``` -------------------------------- ### Instalar idessem com pip Source: https://rjmalves.github.io/idessem/_sources/geral/instalacao.rst.txt Comandos para instalar, atualizar ou especificar uma versão do pacote via pip. ```bash $ pip install idessem ``` ```bash $ pip install --upgrade idessem ``` ```bash $ pip install idessem==x.y.z ``` -------------------------------- ### Configuração do ambiente de desenvolvimento Source: https://rjmalves.github.io/idessem/_sources/geral/contribuicao.rst.txt Comandos para clonar o repositório e instalar as dependências necessárias utilizando o uv. ```bash $ git clone https://github.com/rjmalves/idessem.git $ cd idessem $ uv sync --extra dev $ uv run pre-commit install ``` -------------------------------- ### Configurar ambiente virtual para idessem Source: https://rjmalves.github.io/idessem/_sources/geral/faq.rst.txt Criação de um ambiente isolado para evitar conflitos de dependências com outros pacotes. ```shell $ python -m venv .venv $ source .venv/bin/activate # Linux/macOS $ .venv\Scripts\activate # Windows $ pip install idessem ``` -------------------------------- ### Instalar versão de desenvolvimento Source: https://rjmalves.github.io/idessem/_sources/geral/instalacao.rst.txt Comandos para clonar o repositório e instalar dependências de desenvolvimento. ```bash $ git clone https://github.com/rjmalves/idessem $ cd idessem ``` ```bash $ uv sync --extra dev ``` -------------------------------- ### Acesso a registros de configuração no dessemarq Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/dessemarq.html Exemplos de propriedades para acessar diferentes tipos de registros de arquivos no DESSEM. ```python r = self.data.get_registers_of_type(RegistroCurvtviag) if isinstance(r, RegistroCurvtviag): return r else: return None ``` ```python @property def ptoper(self) -> Optional[RegistroPtoper]: """ O nome do arquivo com os pontos de operação das usinas témmicas a GNL. :return: Um registro, se existir. :rtype: :class:`RegistroPtoper` | None. """ r = self.data.get_registers_of_type(RegistroPtoper) if isinstance(r, RegistroPtoper): return r else: return None ``` ```python @property def infofcf(self) -> Optional[RegistroInfofcf]: """ O nome do arquivo com as informações sobre os cortes. :return: Um registro, se existir. :rtype: :class:`RegistroInfofcf` | None. """ r = self.data.get_registers_of_type(RegistroInfofcf) if isinstance(r, RegistroInfofcf): return r else: return None ``` ```python @property def meta(self) -> Optional[RegistroMetas]: """ O nome do arquivo com as restrições de metas. :return: Um registro, se existir. :rtype: :class:`RegistroMetas` | None. """ r = self.data.get_registers_of_type(RegistroMetas) if isinstance(r, RegistroMetas): return r else: return None ``` ```python @property def ree(self) -> Optional[RegistroREE]: """ O nome do arquivo com os reservatórios equivalentes de energia. :return: Um registro, se existir. :rtype: :class:`RegistroREE` | None. """ r = self.data.get_registers_of_type(RegistroREE) if isinstance(r, RegistroREE): return r else: return None ``` ```python @property def eolica(self) -> Optional[RegistroEolica]: """ O nome do arquivo com os dados de fontes renováveis. :return: Um registro, se existir. :rtype: :class:`RegistroEolica` | None. """ r = self.data.get_registers_of_type(RegistroEolica) if isinstance(r, RegistroEolica): return r else: return None ``` ```python @property def rampas(self) -> Optional[RegistroRampas]: """ O nome do arquivo com trajetórias das rampas. :return: Um registro, se existir. :rtype: :class:`RegistroRampas` | None. """ r = self.data.get_registers_of_type(RegistroRampas) if isinstance(r, RegistroRampas): return r else: return None ``` ```python @property def rstlpp(self) -> Optional[RegistroRstlpp]: """ O nome do arquivo com as restrições lineares por partes (LPP). :return: Um registro, se existir. :rtype: :class:`RegistroRstlpp` | None. """ r = self.data.get_registers_of_type(RegistroRstlpp) if isinstance(r, RegistroRstlpp): return r else: return None ``` ```python @property def restseg(self) -> Optional[RegistroRestseg]: """ O nome do arquivo com as restrições de tabela. :return: Um registro, se existir. :rtype: :class:`RegistroRestseg` | None. """ r = self.data.get_registers_of_type(RegistroRestseg) if isinstance(r, RegistroRestseg): return r else: return None ``` ```python @property def respotele(self) -> Optional[RegistroRespotele]: """ O nome do arquivo com os dados de reserva de potência da rede elétrica. :return: Um registro, se existir. :rtype: :class:`RegistroRespotele` | None. """ r = self.data.get_registers_of_type(RegistroRespotele) if isinstance(r, RegistroRespotele): return r else: return None ``` ```python @property def ilibs(self) -> Optional[RegistroIlibs]: """ O nome do arquivo com as funcionalidades LIBS. :return: Um registro, se existir. :rtype: :class:`RegistroIlibs` | None. """ r = self.data.get_registers_of_type(RegistroIlibs) if isinstance(r, RegistroIlibs): return r else: return None ``` ```python @property def uch(self) -> Optional[RegistroUch]: """ O nome do arquivo com os dados do Unit Commitment Hidráulico (UCH). :return: Um registro, se existir. :rtype: :class:`RegistroUch` | None. """ r = self.data.get_registers_of_type(RegistroUch) if isinstance(r, RegistroUch): return r else: return None ``` -------------------------------- ### Instalar o idessem Source: https://rjmalves.github.io/idessem/_sources/geral/faq.rst.txt Comandos para instalar a biblioteca utilizando gerenciadores de pacotes. ```shell $ pip install idessem ``` ```shell $ uv pip install idessem ``` -------------------------------- ### Otimização de Importações no idessem Source: https://rjmalves.github.io/idessem/_sources/geral/desempenho.rst.txt Evite importar o módulo completo para reduzir a latência de inicialização em ambientes restritos. ```python import idessem.dessem # carrega todas as 46 classes ``` ```python from idessem.dessem.entdados import Entdados ``` -------------------------------- ### Boas práticas de importação Source: https://rjmalves.github.io/idessem/_sources/geral/arquitetura.rst.txt Demonstra a diferença entre importar classes específicas versus o módulo completo para evitar carregamento desnecessário de dependências. ```python # Recomendado: importa apenas a classe necessária from idessem.dessem.entdados import Entdados # Evitar em contextos sensíveis a desempenho: carrega todas as 46 classes import idessem.dessem ``` -------------------------------- ### Instalar versão de desenvolvimento Source: https://rjmalves.github.io/idessem/_sources/geral/faq.rst.txt Comandos para instalar a partir do repositório Git, incluindo opções para branches ou tags. ```shell $ pip install git+https://github.com/rjmalves/idessem ``` ```shell $ pip install git+https://github.com/rjmalves/idessem@v1.0.0 ``` -------------------------------- ### Acesso a registros de intercâmbios (FI) Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/entdados.html Utilize o método fi para recuperar registros de coeficientes de restrições elétricas aplicadas a intercâmbios entre submercados. ```python def fi( self, codigo_restricao: Optional[int] = None, dia_inicial: Optional[Union[str, int]] = None, hora_inicial: Optional[int] = None, meia_hora_inicial: Optional[int] = None, dia_final: Optional[Union[str, int]] = None, hora_final: Optional[int] = None, meia_hora_final: Optional[int] = None, nome_submercado_de: Optional[int] = None, nome_submercado_para: Optional[int] = None, coeficiente: Optional[float] = None, df: bool = False, ) -> Optional[Union[FI, List[FI], pd.DataFrame]]: 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, ) ``` -------------------------------- ### Exemplo de retorno de registros (FT) Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/entdados.html Exemplo parcial de implementação interna para retorno de registros do tipo FT. ```python 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, ) ``` -------------------------------- ### Configurar versão do arquivo Source: https://rjmalves.github.io/idessem/_sources/geral/faq.rst.txt Uso do método set_version para definir a versão do formato do arquivo antes da leitura. ```python from idessem.dessem.avl_fpha1 import AvlFpha1 # Especifica a versão antes de ler o arquivo AvlFpha1.set_version("19.3") arq = AvlFpha1.read("./AVL_FPHA1.DAT") ``` -------------------------------- ### Acesso a registros de contratos (FE) Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/entdados.html Utilize o método fe para recuperar registros de coeficientes de restrições elétricas aplicadas a contratos de importação e exportação. ```python def fe( self, codigo_restricao: Optional[int] = None, dia_inicial: Optional[Union[str, int]] = None, hora_inicial: Optional[int] = None, meia_hora_inicial: Optional[int] = None, dia_final: Optional[Union[str, int]] = None, hora_final: Optional[int] = None, meia_hora_final: Optional[int] = None, codigo_contrato: Optional[int] = None, coeficiente: Optional[float] = None, df: bool = False, ) -> Optional[Union[FE, List[FE], pd.DataFrame]]: ``` -------------------------------- ### Definir versão do arquivo DESSEM Source: https://rjmalves.github.io/idessem/_sources/geral/faq.rst.txt Utilize set_version para garantir a compatibilidade com arquivos gerados por versões antigas do DESSEM. ```python from idessem.dessem.avl_fpha1 import AvlFpha1 # Versão padrão (mais recente) — use quando o arquivo for recente arq_recente = AvlFpha1.read("./AVL_FPHA1.DAT") # Versão explícita — necessária para arquivos de versões antigas do DESSEM AvlFpha1.set_version("19.3") arq_antigo = AvlFpha1.read("./AVL_FPHA1_v19_3.DAT") ``` -------------------------------- ### Verificar e corrigir dependências do cfinterface Source: https://rjmalves.github.io/idessem/_sources/geral/faq.rst.txt Comandos para diagnosticar a versão instalada do cfinterface e forçar a instalação da versão compatível. ```shell $ pip show cfinterface ``` ```shell $ pip install "cfinterface>=1.8.0,<=1.8.3" ``` -------------------------------- ### Otimizar importações de classes Source: https://rjmalves.github.io/idessem/_sources/geral/faq.rst.txt Importe classes individualmente para evitar o carregamento desnecessário de todo o submódulo idessem.dessem. ```python # Recomendado: carrega apenas a classe necessária from idessem.dessem.entdados import Entdados from idessem.dessem.pdo_sist import PdoSist # Evitar em scripts sensíveis a tempo de inicialização: import idessem.dessem # carrega todas as 46 classes ``` -------------------------------- ### Leitura de arquivos de saída (PDO_SIST.DAT) Source: https://rjmalves.github.io/idessem/_sources/geral/tutorial.rst.txt Exemplo de leitura de um arquivo de saída, onde apenas o acesso aos dados via atributo tabela é permitido. ```python from idessem.dessem.pdo_sist import PdoSist arq_pdo_sist = PdoSist.read("./PDO_SIST.DAT") arq_pdo_sist.tabela estagio patamar submercado cmo demanda perdas ... corte_carga saldo recebimento geracao_termica_minima geracao_termica_maxima energia_armazenada 0 1 LEVE SE 71.48 36935.91 - ... 0.0 -3461.61 3461.61 2555.95 9489.79 122020.78 1 1 LEVE S 71.44 9974.79 - ... 0.0 3009.85 -3009.85 246.00 1348.57 14792.56 2 1 LEVE NE 71.46 11465.14 - ... 0.0 3317.36 -3317.36 4.00 5997.78 39932.58 3 1 LEVE N 73.57 7341.98 - ... 0.0 -2865.60 2865.60 1153.00 3134.21 14434.54 4 1 LEVE FC 0.00 0.00 - ... 0.0 0.00 0.00 0.00 0.00 0.00 .. ... ... ... ... ... ... ... ... ... ... ... ... ... 255 52 MEDIA SE 71.99 39910.00 - ... 0.0 -6271.76 6271.76 2544.95 9478.79 121052.53 256 52 MEDIA S 71.95 12148.00 - ... 0.0 2704.38 -2704.38 246.00 1348.57 15032.88 257 52 MEDIA NE 71.97 12032.00 - ... 0.0 6032.64 -6032.64 4.00 5997.78 40053.92 258 52 MEDIA N 75.27 7053.00 - ... 0.0 -2465.27 2465.27 1153.00 3134.21 14365.11 259 52 MEDIA FC 71.99 0.00 - ... 0.0 0.00 0.00 0.00 0.00 0.00 [260 rows x 20 columns] ``` -------------------------------- ### Execução de procedimentos de qualidade Source: https://rjmalves.github.io/idessem/_sources/geral/contribuicao.rst.txt Comandos para verificar linting, formatação, tipagem e execução de testes antes de enviar alterações. ```bash $ uv run ruff check ./idessem $ uv run ruff format ./idessem $ uv run mypy ./idessem $ uv run pytest ./tests ``` -------------------------------- ### Métodos de acesso a dados de usinas Source: https://rjmalves.github.io/idessem/_modules/idessem/libs/usinas_hidreletricas.html Métodos para recuperar registros de curvas de jusante e polinômios, com suporte opcional para retorno em formato DataFrame. ```python [documentos] def hidreletrica_curvajusante( self, codigo_usina: Optional[int] = None, indice_familia: Optional[int] = None, nivel_montante_referencia: Optional[float] = None, df: bool = False, ) -> Optional[ Union[ HidreletricaCurvaJusante, List[HidreletricaCurvaJusante], pd.DataFrame, ] ]: """ Obtém registros que cadastram uma família de curvas de jusante para uma usina hidrelétrica. Opcionalmente, o retorno pode ser transformado em um `DataFrame`, apenas para leitura das informações. :param codigo_usina: código que especifica a usina :type codigo_usina: int | None :param indice_familia: índice da família de polinômios :type indice_familia: int | None :param nivel_montante_referencia: nível de montante de usina de jusante para cálculo da queda :type nivel_montante_referencia: float | None :param df: ignorar os filtros e retornar todos os dados de registros como um DataFrame :type df: bool :return: Um ou mais registros, se existirem. :rtype: `HidreletricaCurvaJusante` | List[`HidreletricaCurvaJusante`] | `None` | `DataFrame` """ return self.__registros_ou_df( HidreletricaCurvaJusante, codigo_usina=codigo_usina, indice_familia=indice_familia, nivel_montante_referencia=nivel_montante_referencia, df=df, ) ``` ```python [documentos] def hidreletrica_curvajusante_polinomio( self, codigo_usina: Optional[int] = None, indice_familia: Optional[int] = None, numero_polinomios: Optional[int] = None, df: bool = False, ) -> Optional[ Union[ HidreletricaCurvaJusantePolinomioPorPartes, List[HidreletricaCurvaJusantePolinomioPorPartes], pd.DataFrame, ] ]: """ Obtém registros que cadastram uma família de curvas de jusante para uma usina hidrelétrica. Opcionalmente, o retorno pode ser transformado em um `DataFrame`, apenas para leitura das informações. :param codigo_usina: código que especifica a usina :type codigo_usina: int | None :param indice_familia: índice da família de polinômios :type indice_familia: int | None :param numero_polinomios: número de polinômios da família :type numero_polinomios: int | None :param df: ignorar os filtros e retornar todos os dados de registros como um DataFrame :type df: bool :return: Um ou mais registros, se existirem. :rtype: `HidreletricaCurvaJusantePolinomioPorPartes` | List[`HidreletricaCurvaJusantePolinomioPorPartes`] | `None` | `DataFrame` """ return self.__registros_ou_df( HidreletricaCurvaJusantePolinomioPorPartes, codigo_usina=codigo_usina, indice_familia=indice_familia, numero_polinomios=numero_polinomios, df=df, ) ``` -------------------------------- ### Acesso a registros de configuração do DESSEM Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/dessemarq.html Propriedades para acessar registros como operuh, deflant, cadterm, operut, indelet, ilstri, cotasr11, simul, areacont, respot, mlt, e tolperd. ```python :return: Um registro, se existir. :rtype: :class:`RegistroOperuh` | None. """ r = self.data.get_registers_of_type(RegistroOperuh) if isinstance(r, RegistroOperuh): return r else: return None @property def deflant(self) -> Optional[RegistroDeflant]: """ O nome do arquivo com as defluências anteriores ao período de estudo. :return: Um registro, se existir. :rtype: :class:`RegistroDeflant` | None. """ r = self.data.get_registers_of_type(RegistroDeflant) if isinstance(r, RegistroDeflant): return r else: return None @property def cadterm(self) -> Optional[RegistroCadterm]: """ O nome do arquivo com o cadastro de usinas térmicas. :return: Um registro, se existir. :rtype: :class:`RegistroCadterm` | None. """ r = self.data.get_registers_of_type(RegistroCadterm) if isinstance(r, RegistroCadterm): return r else: return None @property def operut(self) -> Optional[RegistroOperut]: """ O nome do arquivo com a operação das unidades térmicas. :return: Um registro, se existir. :rtype: :class:`RegistroOperut` | None. """ r = self.data.get_registers_of_type(RegistroOperut) if isinstance(r, RegistroOperut): return r else: return None @property def indelet(self) -> Optional[RegistroIndelet]: """ O nome do arquivo com o índice da rede elétrica. :return: Um registro, se existir. :rtype: :class:`RegistroIndelet` | None. """ r = self.data.get_registers_of_type(RegistroIndelet) if isinstance(r, RegistroIndelet): return r else: return None @property def ilstri(self) -> Optional[RegistroIlstri]: """ O nome do arquivo com dados do Canal Pereira Barreto. :return: Um registro, se existir. :rtype: :class:`RegistroIlstri` | None. """ r = self.data.get_registers_of_type(RegistroIlstri) if isinstance(r, RegistroIlstri): return r else: return None @property def cotasr11(self) -> Optional[RegistroCotasR11]: """ O nome do arquivo com dados das cotas de Régua 11 de Itaipu. :return: Um registro, se existir. :rtype: :class:`RegistroCotasR11` | None. """ r = self.data.get_registers_of_type(RegistroCotasR11) if isinstance(r, RegistroCotasR11): return r else: return None @property def simul(self) -> Optional[RegistroSimul]: """ O nome do arquivo com dados da simulação. :return: Um registro, se existir. :rtype: :class:`RegistroSimul` | None. """ r = self.data.get_registers_of_type(RegistroSimul) if isinstance(r, RegistroSimul): return r else: return None @property def areacont(self) -> Optional[RegistroAreacont]: """ O nome do arquivo de cadastro da reserva de potência. :return: Um registro, se existir. :rtype: :class:`RegistroAreacont` | None. """ r = self.data.get_registers_of_type(RegistroAreacont) if isinstance(r, RegistroAreacont): return r else: return None @property def respot(self) -> Optional[RegistroRespot]: """ O nome do arquivo do estudo de reserva de potência. :return: Um registro, se existir. :rtype: :class:`RegistroRespot` | None. """ r = self.data.get_registers_of_type(RegistroRespot) if isinstance(r, RegistroRespot): return r else: return None @property def mlt(self) -> Optional[RegistroMlt]: """ O nome do arquivo com dados para a FPHA. :return: Um registro, se existir. :rtype: :class:`RegistroMlt` | None. """ r = self.data.get_registers_of_type(RegistroMlt) if isinstance(r, RegistroMlt): return r else: return None @property def tolperd(self) -> Optional[RegistroTolperd]: """ O nome do arquivo com as tolerâncias das perdas. :return: Um registro, se existir. :rtype: :class:`RegistroTolperd` | None. """ r = self.data.get_registers_of_type(RegistroTolperd) if isinstance(r, RegistroTolperd): return r else: return None @property def curvtviag(self) -> Optional[RegistroCurvtviag]: """ O nome do arquivo com as curvas de propagação dos tempos de viagem. ``` -------------------------------- ### Acesso a registros de restrições para fontes renováveis (FR) Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/entdados.html Método para recuperar coeficientes de restrições elétricas aplicáveis a usinas de fontes renováveis. ```python def fr( self, codigo_restricao: Optional[int] = None, dia_inicial: Optional[Union[str, int]] = None, hora_inicial: Optional[int] = None, meia_hora_inicial: Optional[int] = None, dia_final: Optional[Union[str, int]] = None, hora_final: Optional[int] = None, meia_hora_final: Optional[int] = None, codigo_usina: Optional[int] = None, coeficiente: Optional[float] = None, df: bool = False, ) -> Optional[Union[FR, List[FR], pd.DataFrame]]: """ Obtém um registro que cadastra os coeficientes das restrições elétricas para usinas de fontes renováveis. :param codigo_restricao: Índice do código que especifica o registro da restrição elétrica :type codigo_restricao: int | None :param dia_inicial: dia inicial :type dia_inicial: int | None :param hora_inicial: hora inicial :type hora_inicial: int | None :param meia_hora_inicial: meia-hora inicial :param dia_final: dia final :type dia_final: int | None :param hora_final: hora final :type hora_final: int | None :param meia_hora_final: meia-hora final :type meia_hora_final: int | None :param codigo_usina: código da usina renovável :type codigo_usina: int | None :param coeficiente: coeficiente de participação da usina na restrição :type coeficiente: int | None :param df: ignorar os filtros e retornar todos os dados de registros como um DataFrame :type df: bool :return: Um ou mais registros, se houverem. :rtype: :class:`FR` | list[:class:`FR`] | :class:`pd.DataFrame` | None """ 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, ) ``` -------------------------------- ### Diagnosticar erro de importação do cfinterface Source: https://rjmalves.github.io/idessem/geral/faq.html Comandos para verificar a versão instalada do cfinterface e forçar a instalação da versão compatível. ```bash ImportError: cannot import name 'X' from 'cfinterface' ``` ```bash $ pip show cfinterface ``` ```bash $ pip install "cfinterface>=1.8.0,<=1.8.3" ``` -------------------------------- ### Exemplo de Formato de Arquivo (AVL_FPHA1.DAT) Source: https://rjmalves.github.io/idessem/geral/tutorial.html Exemplo de estrutura de dados contida em um arquivo de entrada do modelo DESSEM. ```text * MODELO DESSEM - VERSAO 19.3 - Janeiro de 2023 (CPLEX) * -----;--------------;-------;---------;------------;-------------;-------------;-------------; USIH ; Nome ;SegFPHA; Fcorrec ; Rhs ; Varm ; Qtur ; Qlat ; -----;--------------;-------;---------;------------;-------------;-------------;-------------; 001 ; CAMARGOS ; 1 ; 1.00000 ; -11.8461 ; 0.020604 ; 0.224440 ; 0.000000 ; 001 ; CAMARGOS ; 2 ; 1.00000 ; -5.7558 ; 0.020604 ; 0.186494 ; 0.000000 ; 001 ; CAMARGOS ; 3 ; 1.00000 ; 0.0000 ; 0.000000 ; 0.225931 ; 0.000000 ; 001 ; CAMARGOS ; 4 ; 1.00000 ; 7.0475 ; 0.000000 ; 0.182021 ; 0.000000 ; ``` -------------------------------- ### Propriedades de usinas de montante Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/modelos/entdados.html Exemplos de getters e setters para acessar fatores de participação e códigos de usinas de montante em registros de seção de rio. ```python @property def fator_participacao_2(self) -> Optional[float]: """ O fator de participação da 2ª usina de montante a seção de rio. :return: O fator. :rtype: float | None """ return self.data[5] @fator_participacao_2.setter def fator_participacao_2(self, n: float) -> None: self.data[5] = n @property def codigo_usina_montante_3(self) -> Optional[int]: """ O código da 3ª usina de montante a seção de rio. :return: O código. :rtype: int | None """ return self.data[6] @codigo_usina_montante_3.setter def codigo_usina_montante_3(self, n: int) -> None: self.data[6] = n @property def fator_participacao_3(self) -> Optional[float]: """ O fator de participação da 3ª usina de montante a seção de rio. :return: O fator. :rtype: float | None """ return self.data[7] @fator_participacao_3.setter def fator_participacao_3(self, n: float) -> None: self.data[7] = n @property def codigo_usina_montante_4(self) -> Optional[int]: """ O código da 4ª usina de montante a seção de rio. :return: O código. :rtype: int | None """ return self.data[8] @codigo_usina_montante_4.setter def codigo_usina_montante_4(self, n: int) -> None: self.data[8] = n @property def fator_participacao_4(self) -> Optional[float]: """ O fator de participação da 4ª usina de montante a seção de rio. :return: O fator. :rtype: float | None """ return self.data[9] @fator_participacao_4.setter def fator_participacao_4(self, n: float) -> None: self.data[9] = n @property def codigo_usina_montante_5(self) -> Optional[int]: """ O código da 5ª usina de montante a seção de rio. :return: O código. :rtype: int | None """ return self.data[10] @codigo_usina_montante_5.setter def codigo_usina_montante_5(self, n: int) -> None: self.data[10] = n @property def fator_participacao_5(self) -> Optional[float]: """ O fator de participação da 5ª usina de montante a seção de rio. :return: O fator. :rtype: float | None """ return self.data[11] @fator_participacao_5.setter def fator_participacao_5(self, n: float) -> None: self.data[11] = n ``` -------------------------------- ### Propriedades de acesso a dados Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/modelos/entdados.html Exemplos de métodos getter e setter para manipulação de atributos de tempo e demanda em registros. ```python @hora_inicial.setter def hora_inicial(self, n: int) -> None: self.data[1][1] = n @property def meia_hora_inicial(self) -> Optional[int]: """ A meia-hora inicial. :return: A meia-hora. :rtype: int | None """ return self.data[1][2] @meia_hora_inicial.setter def meia_hora_inicial(self, n: int) -> None: self.data[1][2] = n @property def dia_final(self) -> Optional[Union[str, int]]: """ O dia final. :return: O dia. :rtype: str | int | None """ return self.data[2][0] @dia_final.setter def dia_final(self, n: Union[str, int]) -> None: self.data[2][0] = n @property def hora_final(self) -> Optional[int]: """ A hora final. :return: A hora. :rtype: int | None """ return self.data[2][1] @hora_final.setter def hora_final(self, n: int) -> None: self.data[2][1] = n @property def meia_hora_final(self) -> Optional[int]: """ A meia-hora final. :return: A meia-hora. :rtype: int | None """ return self.data[2][2] @meia_hora_final.setter def meia_hora_final(self, n: int) -> None: self.data[2][2] = n @property def demanda(self) -> Optional[float]: """ A demanda em Mwmed para o período especificado :return: A demanda. :rtype: float | None """ return self.data[3] @demanda.setter def demanda(self, demanda: float) -> None: self.data[3] = demanda @property def justificativa(self) -> Optional[str]: """ A descrição ou justificativa. :return: A justificativa. :rtype: str | None """ return self.data[4] @justificativa.setter def justificativa(self, justificativa: str) -> None: self.data[4] = justificativa ``` -------------------------------- ### Definição da classe PdoTerm Source: https://rjmalves.github.io/idessem/_modules/idessem/dessem/pdo_term.html Estrutura da classe PdoTerm utilizada para ler e processar arquivos PDO_TERM, incluindo a definição de blocos e a propriedade para acesso aos dados tabulares. ```python from idessem.dessem.modelos.pdo_term import TabelaPdoTerm from idessem.dessem.modelos.arquivos.arquivocsv import ( DataEstudo, VersaoModelo, ArquivoCSV, ) import pandas as pd # type: ignore from typing import Optional [documentos] class PdoTerm(ArquivoCSV): """ Armazena os dados das saídas referentes as unidades térmicas. Essa classe lida com as informações de saída fornecidas pelo arquivo PDO_TERM. """ BLOCKS = [VersaoModelo, DataEstudo, TabelaPdoTerm] ENCODING = "iso-8859-1" @property def tabela(self) -> Optional[pd.DataFrame]: """ Obtém a tabela com informações referente a operação das unidades térmicas. - estagio (`int`) - nome_patamar (`str`) - codigo_usina (`int`) - nome_usina (`str`) - codigo_unidade (`int`) - nome_submercado (`str`) - geracao (`float`) - geracao_minima (`float`) - geracao_maxima (`float`) - capacidade (`float`) - status (`int`) - custo_linear (`float`) :return: A tabela como um dataframe :rtype: pd.DataFrame | None """ return self._tabela() ``` -------------------------------- ### Leitura de arquivo de saída PDO_SIST Source: https://rjmalves.github.io/idessem/_sources/geral/arquitetura.rst.txt Exemplo de como ler um arquivo de saída do tipo PdoSist e acessar seus resultados como um DataFrame. ```python from idessem.dessem.pdo_sist import PdoSist # Leitura do arquivo de saída arq = PdoSist.read("./PDO_SIST.DAT") # Acesso à tabela de resultados como DataFrame arq.tabela # estagio patamar submercado cmo demanda ... # 0 1 LEVE SE 71.48 36935.91 ... # ... ```