inewave 1.10.3__py3-none-any.whl → 1.11.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- inewave/__init__.py +1 -1
- inewave/_utils/formatacao.py +23 -9
- inewave/newave/__init__.py +5 -0
- inewave/newave/arquivos.py +22 -0
- inewave/newave/eliminacao_cortes.py +188 -0
- inewave/newave/modelos/eliminacao_cortes.py +79 -0
- inewave/newave/modelos/ghmin.py +20 -9
- inewave/newave/modelos/newavetim.py +3 -1
- inewave/nwlistop/modelos/mediasusih.py +1 -2
- {inewave-1.10.3.dist-info → inewave-1.11.0.dist-info}/METADATA +1 -1
- {inewave-1.10.3.dist-info → inewave-1.11.0.dist-info}/RECORD +13 -11
- {inewave-1.10.3.dist-info → inewave-1.11.0.dist-info}/WHEEL +0 -0
- {inewave-1.10.3.dist-info → inewave-1.11.0.dist-info}/licenses/LICENSE.md +0 -0
inewave/__init__.py
CHANGED
inewave/_utils/formatacao.py
CHANGED
|
@@ -166,20 +166,34 @@ def formata_df_meses_para_datas_nwlistop(df: pd.DataFrame) -> pd.DataFrame:
|
|
|
166
166
|
}
|
|
167
167
|
return mapa_formatacao[colunas_identificacao](df)
|
|
168
168
|
|
|
169
|
+
def converte_anos(anos: List[str]) -> List[int]:
|
|
170
|
+
"""
|
|
171
|
+
Converte uma lista de anos representados como strings para inteiros.
|
|
172
|
+
Se o ano for 'PRE', converte para 1; se for 'POS', converte para 9999.
|
|
173
|
+
"""
|
|
174
|
+
anos_convertidos = []
|
|
175
|
+
for a in anos:
|
|
176
|
+
if a == "PRE":
|
|
177
|
+
anos_convertidos.append(1)
|
|
178
|
+
elif a == "POS":
|
|
179
|
+
anos_convertidos.append(9999)
|
|
180
|
+
else:
|
|
181
|
+
anos_convertidos.append(int(a))
|
|
182
|
+
return anos_convertidos
|
|
183
|
+
|
|
184
|
+
def prepara_vetor_ano_mes_tabela(anos: List[str], meses: List[int]) -> List[datetime]:
|
|
185
|
+
|
|
186
|
+
anos_convertidos = converte_anos(anos)
|
|
187
|
+
return [
|
|
188
|
+
datetime(year=int(a), month=int(m), day=1) for a, m in zip(anos_convertidos, meses)
|
|
189
|
+
]
|
|
190
|
+
|
|
169
191
|
|
|
170
192
|
def prepara_vetor_anos_tabela(anos: List[str]) -> List[datetime]:
|
|
171
193
|
# Se tem pré, substitui por 0001
|
|
172
194
|
# Se tem pós, substitui por 9999
|
|
173
195
|
# Repete os valores existentes 12 vezes
|
|
174
|
-
anos_convertidos
|
|
175
|
-
for a in anos:
|
|
176
|
-
if a == "PRE":
|
|
177
|
-
a_convertido = 1
|
|
178
|
-
elif a == "POS":
|
|
179
|
-
a_convertido = 9999
|
|
180
|
-
else:
|
|
181
|
-
a_convertido = int(a)
|
|
182
|
-
anos_convertidos.append(a_convertido)
|
|
196
|
+
anos_convertidos = converte_anos(anos)
|
|
183
197
|
|
|
184
198
|
anos_array = np.array(anos_convertidos).repeat(len(MESES_DF))
|
|
185
199
|
meses = np.tile(np.arange(1, 13), len(anos))
|
inewave/newave/__init__.py
CHANGED
|
@@ -20,15 +20,20 @@ from .clasgas import Clasgas # noqa
|
|
|
20
20
|
from .clast import Clast # noqa
|
|
21
21
|
from .confhd import Confhd # noqa
|
|
22
22
|
from .conft import Conft # noqa
|
|
23
|
+
from .cortes import Cortes # noqa
|
|
24
|
+
from .cortesh import Cortesh # noqa
|
|
23
25
|
from .curva import Curva # noqa
|
|
24
26
|
from .cvar import Cvar # noqa
|
|
25
27
|
from .dger import Dger # noqa
|
|
26
28
|
from .dsvagua import Dsvagua # noqa
|
|
27
29
|
from .eafpast import Eafpast # noqa
|
|
30
|
+
from .eliminacao_cortes import EliminacaoCortes # noqa
|
|
28
31
|
from .elnino import ElNino # noqa
|
|
29
32
|
from .ensoaux import ENSOAux # noqa
|
|
30
33
|
from .exph import Exph # noqa
|
|
31
34
|
from .expt import Expt # noqa
|
|
35
|
+
from .forward import Forward # noqa
|
|
36
|
+
from .forwarh import Forwarh # noqa
|
|
32
37
|
from .gee import GEE # noqa
|
|
33
38
|
from .ghmin import Ghmin # noqa
|
|
34
39
|
from .gtminpat import Gtminpat # noqa
|
inewave/newave/arquivos.py
CHANGED
|
@@ -554,3 +554,25 @@ class Arquivos(SectionFile):
|
|
|
554
554
|
@cortesh_pos_estudo.setter
|
|
555
555
|
def cortesh_pos_estudo(self, arq: str):
|
|
556
556
|
self.__atualiza_nome_por_indice(43, arq)
|
|
557
|
+
|
|
558
|
+
@property
|
|
559
|
+
def volume_referencia_sazonal(self) -> Optional[str]:
|
|
560
|
+
"""
|
|
561
|
+
Nome do arquivo com os volumes de referência sazonais.
|
|
562
|
+
"""
|
|
563
|
+
return self.__le_nome_por_indice(44)
|
|
564
|
+
|
|
565
|
+
@volume_referencia_sazonal.setter
|
|
566
|
+
def volume_referencia_sazonal(self, arq: str):
|
|
567
|
+
self.__atualiza_nome_por_indice(44, arq)
|
|
568
|
+
|
|
569
|
+
@property
|
|
570
|
+
def eliminacao_cortes(self) -> Optional[str]:
|
|
571
|
+
"""
|
|
572
|
+
Nome do arquivo com parâmetros para eliminação de cortes.
|
|
573
|
+
"""
|
|
574
|
+
return self.__le_nome_por_indice(45)
|
|
575
|
+
|
|
576
|
+
@eliminacao_cortes.setter
|
|
577
|
+
def eliminacao_cortes(self, arq: str):
|
|
578
|
+
self.__atualiza_nome_por_indice(45, arq)
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
from inewave.newave.modelos.eliminacao_cortes import BlocoParametrosEliminacaoCortes
|
|
2
|
+
|
|
3
|
+
from cfinterface.files.sectionfile import SectionFile
|
|
4
|
+
from typing import TypeVar, Optional, List
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class EliminacaoCortes(SectionFile):
|
|
8
|
+
"""
|
|
9
|
+
Armazena os dados de entrada do NEWAVE referentes aos parâmetros
|
|
10
|
+
utilizados na eliminação de cortes de Benders.
|
|
11
|
+
|
|
12
|
+
Esta classe lida com informações de entrada do NEWAVE que definem
|
|
13
|
+
como o algoritmo de eliminação de cortes deve ser executado,
|
|
14
|
+
incluindo configurações para diferentes algoritmos (Paralelo,
|
|
15
|
+
Análise por Pares, Shapiro Modificado).
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
T = TypeVar("T")
|
|
20
|
+
|
|
21
|
+
SECTIONS = [BlocoParametrosEliminacaoCortes]
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def _parametros(self) -> Optional[List[List]]:
|
|
25
|
+
b = self.data.get_sections_of_type(BlocoParametrosEliminacaoCortes)
|
|
26
|
+
if isinstance(b, BlocoParametrosEliminacaoCortes) and isinstance(b.data, list) and len(b.data) > 0:
|
|
27
|
+
return b.data
|
|
28
|
+
return None
|
|
29
|
+
|
|
30
|
+
def _get_parametro_por_indice(self, indice: int, coluna: int) -> Optional[int]:
|
|
31
|
+
params = self._parametros
|
|
32
|
+
if params and len(params) > indice and len(params[indice]) > coluna:
|
|
33
|
+
return params[indice][coluna]
|
|
34
|
+
return None
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def algoritmo_avaliacao_paralelo(self) -> Optional[int]:
|
|
38
|
+
"""
|
|
39
|
+
Habilita ou não o algoritmo para eliminação de cortes Paralelo.
|
|
40
|
+
|
|
41
|
+
:return: O valor do parâmetro
|
|
42
|
+
:rtype: int | None
|
|
43
|
+
"""
|
|
44
|
+
valor = self._get_parametro_por_indice(0, 0)
|
|
45
|
+
return int(valor) if valor is not None else None
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def algoritmo_avaliacao_pares(self) -> Optional[int]:
|
|
49
|
+
"""
|
|
50
|
+
Habilita ou não o algoritmo para eliminação de cortes por Análise por Pares.
|
|
51
|
+
|
|
52
|
+
:return: O valor do parâmetro
|
|
53
|
+
:rtype: int | None
|
|
54
|
+
"""
|
|
55
|
+
valor = self._get_parametro_por_indice(0, 1)
|
|
56
|
+
return int(valor) if valor is not None else None
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def algoritmo_avaliacao_shapiro(self) -> Optional[int]:
|
|
60
|
+
"""
|
|
61
|
+
Habilita ou não o algoritmo para eliminação de cortes Shapiro Modificado.
|
|
62
|
+
|
|
63
|
+
:return: O valor do parâmetro
|
|
64
|
+
:rtype: int | None
|
|
65
|
+
"""
|
|
66
|
+
valor = self._get_parametro_por_indice(0, 2)
|
|
67
|
+
return int(valor) if valor is not None else None
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def iteracao_inicial_paralelo(self) -> Optional[int]:
|
|
71
|
+
"""
|
|
72
|
+
Iteração inicial para aplicação da eliminação de cortes (Paralelo).
|
|
73
|
+
|
|
74
|
+
:return: O valor do parâmetro
|
|
75
|
+
:rtype: int | None
|
|
76
|
+
"""
|
|
77
|
+
valor = self._get_parametro_por_indice(1, 0)
|
|
78
|
+
return int(valor) if valor is not None else None
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def iteracao_inicial_pares(self) -> Optional[int]:
|
|
82
|
+
"""
|
|
83
|
+
Iteração inicial para aplicação da eliminação de cortes (Análise por Pares).
|
|
84
|
+
|
|
85
|
+
:return: O valor do parâmetro
|
|
86
|
+
:rtype: int | None
|
|
87
|
+
"""
|
|
88
|
+
valor = self._get_parametro_por_indice(1, 1)
|
|
89
|
+
return int(valor) if valor is not None else None
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def iteracao_inicial_shapiro(self) -> Optional[int]:
|
|
93
|
+
"""
|
|
94
|
+
Iteração inicial para aplicação da eliminação de cortes (Shapiro Modificado).
|
|
95
|
+
|
|
96
|
+
:return: O valor do parâmetro
|
|
97
|
+
:rtype: int | None
|
|
98
|
+
"""
|
|
99
|
+
valor = self._get_parametro_por_indice(1, 2)
|
|
100
|
+
return int(valor) if valor is not None else None
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def passo_aplicacao_paralelo(self) -> Optional[int]:
|
|
104
|
+
"""
|
|
105
|
+
Passo para aplicação da eliminação de cortes (Paralelo).
|
|
106
|
+
|
|
107
|
+
:return: O valor do parâmetro
|
|
108
|
+
:rtype: int | None
|
|
109
|
+
"""
|
|
110
|
+
valor = self._get_parametro_por_indice(2, 0)
|
|
111
|
+
return int(valor) if valor is not None else None
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def passo_aplicacao_pares(self) -> Optional[int]:
|
|
115
|
+
"""
|
|
116
|
+
Passo para aplicação da eliminação de cortes (Análise por Pares).
|
|
117
|
+
|
|
118
|
+
:return: O valor do parâmetro
|
|
119
|
+
:rtype: int | None
|
|
120
|
+
"""
|
|
121
|
+
valor = self._get_parametro_por_indice(2, 1)
|
|
122
|
+
return int(valor) if valor is not None else None
|
|
123
|
+
|
|
124
|
+
@property
|
|
125
|
+
def passo_aplicacao_shapiro(self) -> Optional[int]:
|
|
126
|
+
"""
|
|
127
|
+
Passo para aplicação da eliminação de cortes (Shapiro Modificado).
|
|
128
|
+
|
|
129
|
+
:return: O valor do parâmetro
|
|
130
|
+
:rtype: int | None
|
|
131
|
+
"""
|
|
132
|
+
valor = self._get_parametro_por_indice(2, 2)
|
|
133
|
+
return int(valor) if valor is not None else None
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def janela_iteracoes_pares(self) -> Optional[int]:
|
|
137
|
+
"""
|
|
138
|
+
Janela de iterações de construção dos cortes a serem avaliados (Análise por Pares).
|
|
139
|
+
|
|
140
|
+
:return: O valor do parâmetro
|
|
141
|
+
:rtype: int | None
|
|
142
|
+
"""
|
|
143
|
+
valor = self._get_parametro_por_indice(3, 1)
|
|
144
|
+
return int(valor) if valor is not None else None
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
def janela_iteracoes_shapiro(self) -> Optional[int]:
|
|
148
|
+
"""
|
|
149
|
+
Janela de iterações de construção dos cortes a serem avaliados (Shapiro Modificado).
|
|
150
|
+
|
|
151
|
+
:return: O valor do parâmetro
|
|
152
|
+
:rtype: int | None
|
|
153
|
+
"""
|
|
154
|
+
valor = self._get_parametro_por_indice(3, 2)
|
|
155
|
+
return int(valor) if valor is not None else None
|
|
156
|
+
|
|
157
|
+
@property
|
|
158
|
+
def fator_limites_afluencias(self) -> Optional[float]:
|
|
159
|
+
"""
|
|
160
|
+
Fator aplicado aos limites das afluências passadas (%).
|
|
161
|
+
|
|
162
|
+
:return: O valor do parâmetro
|
|
163
|
+
:rtype: float | None
|
|
164
|
+
"""
|
|
165
|
+
valor = self._get_parametro_por_indice(4, 0)
|
|
166
|
+
return float(valor) if valor is not None else None
|
|
167
|
+
|
|
168
|
+
@property
|
|
169
|
+
def afluencias_sim_final_calculo_limites(self) -> Optional[int]:
|
|
170
|
+
"""
|
|
171
|
+
Afluências da simulação final no cálculo dos limites.
|
|
172
|
+
|
|
173
|
+
:return: O valor do parâmetro
|
|
174
|
+
:rtype: int | None
|
|
175
|
+
"""
|
|
176
|
+
valor = self._get_parametro_por_indice(5, 0)
|
|
177
|
+
return int(valor) if valor is not None else None
|
|
178
|
+
|
|
179
|
+
@property
|
|
180
|
+
def impressao_relatorios(self) -> Optional[int]:
|
|
181
|
+
"""
|
|
182
|
+
Impressão de relatórios da eliminação de cortes.
|
|
183
|
+
|
|
184
|
+
:return: O valor do parâmetro (0=NÃO, 1=SIM)
|
|
185
|
+
:rtype: int | None
|
|
186
|
+
"""
|
|
187
|
+
valor = self._get_parametro_por_indice(6, 0)
|
|
188
|
+
return int(valor) if valor is not None else None
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
from cfinterface.components.section import Section
|
|
2
|
+
from cfinterface.components.line import Line
|
|
3
|
+
from cfinterface.components.literalfield import LiteralField
|
|
4
|
+
from cfinterface.components.integerfield import IntegerField
|
|
5
|
+
from cfinterface.components.floatfield import FloatField
|
|
6
|
+
from typing import IO, List
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class BlocoParametrosEliminacaoCortes(Section):
|
|
10
|
+
"""
|
|
11
|
+
Bloco com os parâmetros para eliminação de cortes de Benders
|
|
12
|
+
utilizados pelo NEWAVE, extraído do arquivo `eliminacao_cortes.dat`.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
__slots__ = ["__linha", "__cabecalhos", "__comentarios", "data"]
|
|
16
|
+
|
|
17
|
+
def __init__(self, previous=None, next=None, data=None) -> None:
|
|
18
|
+
super().__init__(previous, next, data)
|
|
19
|
+
self.__linha = Line(
|
|
20
|
+
[
|
|
21
|
+
LiteralField(60, 0), # Descrição do parâmetro
|
|
22
|
+
FloatField(6, 61, 2), # Valor PARAL (coluna 1)
|
|
23
|
+
IntegerField(6, 68), # Valor A.P.P (coluna 2)
|
|
24
|
+
IntegerField(6, 75), # Valor S.M. (coluna 3)
|
|
25
|
+
]
|
|
26
|
+
)
|
|
27
|
+
self.__cabecalhos: List[str] = []
|
|
28
|
+
self.__comentarios: List[str] = []
|
|
29
|
+
|
|
30
|
+
def __eq__(self, o: object) -> bool:
|
|
31
|
+
if not isinstance(o, BlocoParametrosEliminacaoCortes):
|
|
32
|
+
return False
|
|
33
|
+
bloco: BlocoParametrosEliminacaoCortes = o
|
|
34
|
+
if not all(
|
|
35
|
+
[
|
|
36
|
+
isinstance(self.data, list),
|
|
37
|
+
isinstance(o.data, list),
|
|
38
|
+
]
|
|
39
|
+
):
|
|
40
|
+
return False
|
|
41
|
+
else:
|
|
42
|
+
return self.data == bloco.data
|
|
43
|
+
|
|
44
|
+
# Override
|
|
45
|
+
def read(self, file: IO, *args, **kwargs):
|
|
46
|
+
# Salta as linhas de cabeçalhos
|
|
47
|
+
for _ in range(2):
|
|
48
|
+
self.__cabecalhos.append(file.readline())
|
|
49
|
+
|
|
50
|
+
# Lê as linhas de parâmetros
|
|
51
|
+
self.data: List[List] = []
|
|
52
|
+
|
|
53
|
+
for _ in range(4):
|
|
54
|
+
linha = file.readline()
|
|
55
|
+
if not linha:
|
|
56
|
+
break
|
|
57
|
+
dados = self.__linha.read(linha)
|
|
58
|
+
|
|
59
|
+
self.__comentarios.append(dados[0].strip())
|
|
60
|
+
self.data.append(dados[1:])
|
|
61
|
+
|
|
62
|
+
for _ in range(3):
|
|
63
|
+
linha = file.readline()
|
|
64
|
+
if not linha:
|
|
65
|
+
break
|
|
66
|
+
dados = self.__linha.read(linha)
|
|
67
|
+
|
|
68
|
+
self.__comentarios.append(dados[0].strip())
|
|
69
|
+
self.data.append([dados[1]])
|
|
70
|
+
|
|
71
|
+
# Override
|
|
72
|
+
def write(self, file: IO, *args, **kwargs):
|
|
73
|
+
for linha in self.__cabecalhos:
|
|
74
|
+
file.write(linha)
|
|
75
|
+
if not isinstance(self.data, list):
|
|
76
|
+
raise ValueError("Dados do eliminacao_cortes.dat não foram lidos com sucesso")
|
|
77
|
+
|
|
78
|
+
for c, s in zip(self.__comentarios, self.data):
|
|
79
|
+
file.write(self.__linha.write([c] + s))
|
inewave/newave/modelos/ghmin.py
CHANGED
|
@@ -2,10 +2,14 @@ from cfinterface.components.section import Section
|
|
|
2
2
|
from cfinterface.components.line import Line
|
|
3
3
|
from cfinterface.components.integerfield import IntegerField
|
|
4
4
|
from cfinterface.components.floatfield import FloatField
|
|
5
|
-
from cfinterface.components.
|
|
5
|
+
from cfinterface.components.literalfield import LiteralField
|
|
6
6
|
from typing import List, IO, Optional
|
|
7
7
|
import pandas as pd # type: ignore
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
from inewave._utils.formatacao import (
|
|
10
|
+
prepara_valor_ano,
|
|
11
|
+
prepara_vetor_ano_mes_tabela,
|
|
12
|
+
)
|
|
9
13
|
|
|
10
14
|
|
|
11
15
|
class BlocoUHEGhmin(Section):
|
|
@@ -22,7 +26,8 @@ class BlocoUHEGhmin(Section):
|
|
|
22
26
|
self.__linha_uhe = Line(
|
|
23
27
|
[
|
|
24
28
|
IntegerField(3, 0),
|
|
25
|
-
|
|
29
|
+
LiteralField(2, 5),
|
|
30
|
+
LiteralField(4, 8),
|
|
26
31
|
IntegerField(1, 14),
|
|
27
32
|
FloatField(6, 17, 0),
|
|
28
33
|
]
|
|
@@ -48,7 +53,7 @@ class BlocoUHEGhmin(Section):
|
|
|
48
53
|
def converte_tabela_em_df():
|
|
49
54
|
df = pd.DataFrame()
|
|
50
55
|
df["codigo_usina"] = codigos
|
|
51
|
-
df["data"] =
|
|
56
|
+
df["data"] = prepara_vetor_ano_mes_tabela(anos, meses)
|
|
52
57
|
df["patamar"] = patamares
|
|
53
58
|
df["geracao"] = geracoes
|
|
54
59
|
return df
|
|
@@ -59,7 +64,8 @@ class BlocoUHEGhmin(Section):
|
|
|
59
64
|
|
|
60
65
|
# Variáveis auxiliares
|
|
61
66
|
codigos: List[Optional[int]] = []
|
|
62
|
-
|
|
67
|
+
meses: List[Optional[str]] = []
|
|
68
|
+
anos: List[Optional[str]] = []
|
|
63
69
|
patamares: List[Optional[int]] = []
|
|
64
70
|
geracoes: List[Optional[float]] = []
|
|
65
71
|
|
|
@@ -72,9 +78,10 @@ class BlocoUHEGhmin(Section):
|
|
|
72
78
|
break
|
|
73
79
|
dados = self.__linha_uhe.read(linha)
|
|
74
80
|
codigos.append(dados[0])
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
81
|
+
meses.append(dados[1])
|
|
82
|
+
anos.append(dados[2])
|
|
83
|
+
patamares.append(dados[3])
|
|
84
|
+
geracoes.append(dados[4])
|
|
78
85
|
|
|
79
86
|
# Override
|
|
80
87
|
def write(self, file: IO, *args, **kwargs):
|
|
@@ -82,8 +89,12 @@ class BlocoUHEGhmin(Section):
|
|
|
82
89
|
file.write(linha)
|
|
83
90
|
if not isinstance(self.data, pd.DataFrame):
|
|
84
91
|
raise ValueError("Dados do ghmin.dat não foram lidos com sucesso")
|
|
92
|
+
df_aux = self.data.copy()
|
|
93
|
+
df_aux['ano'] = df_aux['data'].apply(lambda x: prepara_valor_ano(x.year))
|
|
94
|
+
df_aux['mes'] = df_aux['data'].apply(lambda x: f"{x.month:2d}")
|
|
95
|
+
df_aux.drop("data", inplace=True, axis=1)
|
|
85
96
|
|
|
86
|
-
for _, linha in
|
|
97
|
+
for _, linha in df_aux[['codigo_usina','mes','ano','patamar','geracao']].iterrows():
|
|
87
98
|
linha_lida: pd.Series = linha
|
|
88
99
|
dados_linha = linha_lida.tolist()
|
|
89
100
|
file.write(self.__linha_uhe.write(dados_linha))
|
|
@@ -51,8 +51,10 @@ class BlocoTemposEtapasTim(Block):
|
|
|
51
51
|
tempos: List[timedelta] = []
|
|
52
52
|
|
|
53
53
|
# Leitura das etapas
|
|
54
|
-
|
|
54
|
+
while True:
|
|
55
55
|
dados = self.__line.read(file.readline())
|
|
56
|
+
if not dados or not dados[0].strip("- \t\n"):
|
|
57
|
+
break
|
|
56
58
|
etapas.append(dados[0].split(":")[0])
|
|
57
59
|
h = int(dados[1].split("h")[0])
|
|
58
60
|
min = int(dados[1].split("h")[1].split("min")[0])
|
|
@@ -44,8 +44,7 @@ class TabelaMediasusih(Section):
|
|
|
44
44
|
var_name="estagio",
|
|
45
45
|
value_name="valor",
|
|
46
46
|
)
|
|
47
|
-
df
|
|
48
|
-
df = df.astype({"valor": float})
|
|
47
|
+
df["valor"] = pd.to_numeric(df["valor"], errors="coerce")
|
|
49
48
|
df["estagio"] = df["estagio"].astype(int)
|
|
50
49
|
df["estagio"] -= df["estagio"].min() - 1
|
|
51
50
|
df = df.pivot_table(
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
inewave/__init__.py,sha256=
|
|
1
|
+
inewave/__init__.py,sha256=44kSITb1meBcZFYLpGkP_bStt_w3rOvo1hY3JrvaynI,236
|
|
2
2
|
inewave/config.py,sha256=fMgG2sqE_PNz30QCNxkgfPf78SEOAVfV07kGtO1bREE,1106
|
|
3
3
|
inewave/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
inewave/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
-
inewave/_utils/formatacao.py,sha256
|
|
5
|
+
inewave/_utils/formatacao.py,sha256=v7Qo6wb_q43IsLn6YHIKup_-0Q-TSEIvwHsMFWvkFI8,6431
|
|
6
6
|
inewave/libs/__init__.py,sha256=Jz0qQ08srjYGvoynfro6m8fQYAKbnkj-VweNEu8JnVQ,161
|
|
7
7
|
inewave/libs/eolica.py,sha256=YMO1_37PojeUeix-CtkYeba2z66aRkaRR6CE_Cn4sbs,13324
|
|
8
8
|
inewave/libs/restricoes.py,sha256=9CkYGsg6fWSFS7RoyIqKlqxfaCwcNxFJrUS8Qknz4xg,16485
|
|
@@ -11,11 +11,11 @@ inewave/libs/modelos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
|
11
11
|
inewave/libs/modelos/eolica.py,sha256=0bKVjGBYBJ5RuddyE72kbFjOxlrGvNC7Yj6Et9PHpjk,14151
|
|
12
12
|
inewave/libs/modelos/restricoes.py,sha256=-9wye8gEj83efSrxqibNRuGpMWgb1T5ukmmr-0rI0Qg,19606
|
|
13
13
|
inewave/libs/modelos/usinas_hidreletricas.py,sha256=4-fWBqlWj2GKKj5qm8zd0NbZb7sRZq-yHLVzQ99UZKU,19927
|
|
14
|
-
inewave/newave/__init__.py,sha256=
|
|
14
|
+
inewave/newave/__init__.py,sha256=JQ167G-38iOiYK-sXBC4KBfySRGuvWVch9HRHjuN7_Q,2820
|
|
15
15
|
inewave/newave/abertura.py,sha256=LdSW9PrMDEG6LXgsRj4awui7R0bQqZLcHiXrfzpwiZs,361
|
|
16
16
|
inewave/newave/adterm.py,sha256=83DR82nT0uqbMwWJ-hwQmmWb6l02iXQhKNabuod8y-g,1097
|
|
17
17
|
inewave/newave/agrint.py,sha256=DmZ3ZBTVnaIUBkjrIC5h9ELMbECxJwF3G3Fr_xq7aWQ,2064
|
|
18
|
-
inewave/newave/arquivos.py,sha256=
|
|
18
|
+
inewave/newave/arquivos.py,sha256=Aqw3p4LwV_Q4P7LllwR-GB8XSNHfsfU_PMmPzHaAeng,15839
|
|
19
19
|
inewave/newave/avl_cortesfpha_nwv.py,sha256=utS3pfQmsclt4PAunmgERtbPUpr-YUo3ycToT_sE44I,1605
|
|
20
20
|
inewave/newave/avl_desvfpha_s.py,sha256=PUrb6F6WIMyrPXH6_Irxk4_m9HXZ-gNiDSbGSBFyraE,1989
|
|
21
21
|
inewave/newave/avl_desvfpha_v_q.py,sha256=tMeYRLB9JG9Y-3QlgBwuGK0-ReR9Y0JlPyZBVLxu5LI,2015
|
|
@@ -34,6 +34,7 @@ inewave/newave/dger.py,sha256=e7AGNjBm7kZqY5fRcthvYFY_m7vovWbZdAQF-Iyd_Wk,83959
|
|
|
34
34
|
inewave/newave/dsvagua.py,sha256=e4Kczvaj4kHkxBvBTiKFI69aCHY7MMrO2bCSTjtBJwI,1294
|
|
35
35
|
inewave/newave/eafpast.py,sha256=uSKf6mWAERHED--eRGYcJTuEcYg-SGzolo5hCFlzLVg,1203
|
|
36
36
|
inewave/newave/eco_fpha.py,sha256=-HCqfX-zLIBPPPGftLNffyDWBL91sEhA2vJjp5jhuWM,1491
|
|
37
|
+
inewave/newave/eliminacao_cortes.py,sha256=eAIg8ZKIz4KZk3lVJApY2mafAtjZLUFRQzMZnx7Fy7c,6229
|
|
37
38
|
inewave/newave/elnino.py,sha256=Q8jFu1ZUIhJK7AWrNQ16jniYrcinptFUEQDXpurBSvA,333
|
|
38
39
|
inewave/newave/enavazb.py,sha256=LuuzYdFun-Ilqff39HtT1H-lIycZ4YuvomQZ7MJnKCY,1443
|
|
39
40
|
inewave/newave/enavazf.py,sha256=32dyiVQGfpH6oa6pfra0uir3yO19L0zDlQYOgduTx6o,1368
|
|
@@ -109,6 +110,7 @@ inewave/newave/modelos/dger.py,sha256=-aUJ-S0j15q1RVbAyq-bWB0F9YfXGoNe1Vsy7hH78E
|
|
|
109
110
|
inewave/newave/modelos/dsvagua.py,sha256=G_4PKZcQCF_vZMrBqQcnpH54edXhSEyDlHNy4aZoiIk,5592
|
|
110
111
|
inewave/newave/modelos/eafpast.py,sha256=HFKpsMyoLGwQly95uHhsK2wnrBwL7v8auzaa-UbgP5k,3322
|
|
111
112
|
inewave/newave/modelos/eco_fpha.py,sha256=q-b-ShvAW-RDpr7xlmhBvM9ixWF9DxqFvhxApA7oGdo,1646
|
|
113
|
+
inewave/newave/modelos/eliminacao_cortes.py,sha256=VXBP4rukg9sIU3aMiAeZ8R6keJbCIMWKIemcM6Cwv6A,2690
|
|
112
114
|
inewave/newave/modelos/elnino.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
113
115
|
inewave/newave/modelos/enavazb.py,sha256=DfLuRFI9gcSSeZUn-xwYsaWCe618iMw7LUFo9RVI1l0,2966
|
|
114
116
|
inewave/newave/modelos/enavazf.py,sha256=AgfALMrCmNcnUJzbyDDvpr2i-X3ex6vLHsvdVUemnls,2738
|
|
@@ -122,13 +124,13 @@ inewave/newave/modelos/expt.py,sha256=TgfHkVhZUbBcvRgctjxHgRHqcm_57BecXY5wKb1ZrX
|
|
|
122
124
|
inewave/newave/modelos/forward.py,sha256=f3YDCMcl45DOYVa41XtI3A9Ko9pPmeI-_epu5ov3m4o,88425
|
|
123
125
|
inewave/newave/modelos/forwarh.py,sha256=46jHcPDTBftWm8Q23zzJwiXIoSnxAuQLMBzkA4BQq6s,8231
|
|
124
126
|
inewave/newave/modelos/gee.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
125
|
-
inewave/newave/modelos/ghmin.py,sha256=
|
|
127
|
+
inewave/newave/modelos/ghmin.py,sha256=RKkZBTGjh8ovcxVhYnvVXvcxYFsqNHIO4C8YOpCyJPI,3438
|
|
126
128
|
inewave/newave/modelos/gtminpat.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
127
129
|
inewave/newave/modelos/hidr.py,sha256=ga3luPn4E7GDY5dl9UrnbIt2DUU1m1cs4EognfLsg2c,15773
|
|
128
130
|
inewave/newave/modelos/itaipu.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
129
131
|
inewave/newave/modelos/manutt.py,sha256=16sztv-hOdVUUeL2J5F9vBagZnII9-F-IGQJpiAkTK4,3781
|
|
130
132
|
inewave/newave/modelos/modif.py,sha256=uXNRcO03dwqCeoJ1kBSNWAiaYJLLqIDThAeqsym20Uo,17159
|
|
131
|
-
inewave/newave/modelos/newavetim.py,sha256=
|
|
133
|
+
inewave/newave/modelos/newavetim.py,sha256=5oCqu2rL0A3sok2k8NoqaHhhEPFWz1_DXWYxoG9VFe0,3052
|
|
132
134
|
inewave/newave/modelos/nwv_avl_evap.py,sha256=22oXfDH9R-I1HwAiaQgm7x21zDWGWVySWYsLfdvGlHg,1228
|
|
133
135
|
inewave/newave/modelos/nwv_cortes_evap.py,sha256=nAgdZ-TdWPmokcG1qANgoKtfwyq3waIFclKcY7WyWtQ,1292
|
|
134
136
|
inewave/newave/modelos/nwv_eco_evap.py,sha256=vog9Lw4cqxx66Gmqext086cEsL-Tz5_4pG6wJFSoO90,1235
|
|
@@ -444,7 +446,7 @@ inewave/nwlistop/modelos/mediasrhq.py,sha256=hv9jZHw8wL3p-YL1fY-oym2EO5N4ooPbADD
|
|
|
444
446
|
inewave/nwlistop/modelos/mediasrhv.py,sha256=38fFijM3Fdr_3GRaq5bESFsFCbgJCuq22EBxz-Htaz4,1736
|
|
445
447
|
inewave/nwlistop/modelos/mediassin.py,sha256=R798woqZQ4p93Jpmt1ji2vNms1UEhkAkAFqv2b-lwUE,1635
|
|
446
448
|
inewave/nwlistop/modelos/mediasusie.py,sha256=_j5osR1diNnwkqxy1wHcnTVW_T0YDHa4YAS8KwBvivw,1725
|
|
447
|
-
inewave/nwlistop/modelos/mediasusih.py,sha256=
|
|
449
|
+
inewave/nwlistop/modelos/mediasusih.py,sha256=K8dwMu8VVRUtgc_UDcEFavQHynPqhV1DgdEp8lyDBPM,1791
|
|
448
450
|
inewave/nwlistop/modelos/mediasusit.py,sha256=87xjpsy7XS8O40hpDubbsPn-MXKRn2NVXG5k3iYJrzA,1725
|
|
449
451
|
inewave/nwlistop/modelos/mercl.py,sha256=arrMiDrPb3z7CqoT0ndCW0GZgJec6oa0by3yfd9GWWQ,634
|
|
450
452
|
inewave/nwlistop/modelos/merclsin.py,sha256=arrMiDrPb3z7CqoT0ndCW0GZgJec6oa0by3yfd9GWWQ,634
|
|
@@ -539,7 +541,7 @@ inewave/nwlistop/modelos/blocos/usina.py,sha256=cQvLVtG1NC8y4lP_to6-YjAKQRGRlaxO
|
|
|
539
541
|
inewave/nwlistop/modelos/blocos/valoresclassetermicaseriepatamar.py,sha256=0LV0JMFoiuNEQ3n-XVfG2T0sIq_33bnCt6gmwPOTql8,3283
|
|
540
542
|
inewave/nwlistop/modelos/blocos/valoresserie.py,sha256=Q88QBoI3zyU7y0AvHBeSqDBEVAkb3rAa3XpxA51NbF8,2143
|
|
541
543
|
inewave/nwlistop/modelos/blocos/valoresseriepatamar.py,sha256=xnRdor-_2VyR5EbWNSzU_hbABJFtfgKGlznbcRaslGg,2589
|
|
542
|
-
inewave-1.
|
|
543
|
-
inewave-1.
|
|
544
|
-
inewave-1.
|
|
545
|
-
inewave-1.
|
|
544
|
+
inewave-1.11.0.dist-info/METADATA,sha256=q80VZ89iXc624xH1xYFINnkW37LuIDp_2Q3sVRHfGzo,3743
|
|
545
|
+
inewave-1.11.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
546
|
+
inewave-1.11.0.dist-info/licenses/LICENSE.md,sha256=0jOBL78mjzscN0-XI-6YtK1IqnODUbG85DaKAMH4XJ8,1070
|
|
547
|
+
inewave-1.11.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|