inewave 1.6.0__py3-none-any.whl → 1.7.1__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/newave/__init__.py +10 -0
- inewave/newave/modelos/pmo.py +243 -3
- inewave/newave/modelos/vazinat.py +92 -0
- inewave/newave/pmo.py +82 -1
- inewave/newave/sistema.py +2 -2
- inewave/newave/vazinat.py +43 -0
- inewave/nwlistop/__init__.py +8 -1
- inewave/nwlistop/mediasmerc.py +20 -21
- inewave/nwlistop/mediasree.py +37 -0
- inewave/nwlistop/mediasrep.py +38 -0
- inewave/nwlistop/mediasrhq.py +38 -0
- inewave/nwlistop/mediasrhv.py +38 -0
- inewave/nwlistop/mediassin.py +19 -21
- inewave/nwlistop/mediasusie.py +38 -0
- inewave/nwlistop/mediasusih.py +37 -0
- inewave/nwlistop/mediasusit.py +37 -0
- inewave/nwlistop/modelos/mediasmerc.py +46 -34
- inewave/nwlistop/modelos/mediasree.py +52 -0
- inewave/nwlistop/modelos/mediasrep.py +52 -0
- inewave/nwlistop/modelos/mediasrhq.py +52 -0
- inewave/nwlistop/modelos/mediasrhv.py +52 -0
- inewave/nwlistop/modelos/mediassin.py +45 -29
- inewave/nwlistop/modelos/mediasusie.py +52 -0
- inewave/nwlistop/modelos/mediasusih.py +54 -0
- inewave/nwlistop/modelos/mediasusit.py +52 -0
- {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/METADATA +1 -1
- {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/RECORD +43 -20
- tests/mocks/arquivos/pmo.py +1741 -149
- tests/newave/test_pmo.py +59 -0
- tests/newave/test_vazinat.py +66 -0
- tests/nwlistop/test_mediasmerc.py +4 -8
- tests/nwlistop/test_mediasree.py +12 -0
- tests/nwlistop/test_mediasrep.py +12 -0
- tests/nwlistop/test_mediasrhq.py +12 -0
- tests/nwlistop/test_mediasrhv.py +11 -0
- tests/nwlistop/test_mediassin.py +4 -9
- tests/nwlistop/test_mediasusie.py +12 -0
- tests/nwlistop/test_mediasusih.py +11 -0
- tests/nwlistop/test_mediasusit.py +12 -0
- inewave/_utils/leituracsv.py +0 -57
- {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/LICENSE.md +0 -0
- {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/WHEEL +0 -0
- {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/top_level.txt +0 -0
inewave/__init__.py
CHANGED
inewave/newave/__init__.py
CHANGED
|
@@ -53,3 +53,13 @@ from .eco_fpha import EcoFpha # noqa
|
|
|
53
53
|
from .nwv_avl_evap import NwvAvlEvap # noqa
|
|
54
54
|
from .nwv_cortes_evap import NwvCortesEvap # noqa
|
|
55
55
|
from .nwv_eco_evap import NwvEcoEvap # noqa
|
|
56
|
+
from .energiaf import Energiaf # noqa
|
|
57
|
+
from .energiab import Energiab # noqa
|
|
58
|
+
from .energias import Energias # noqa
|
|
59
|
+
from .enavazf import Enavazf # noqa
|
|
60
|
+
from .enavazb import Enavazb # noqa
|
|
61
|
+
from .engnat import Engnat # noqa
|
|
62
|
+
from .vazaof import Vazaof # noqa
|
|
63
|
+
from .vazaob import Vazaob # noqa
|
|
64
|
+
from .vazaos import Vazaos # noqa
|
|
65
|
+
from .vazinat import Vazinat # noqa
|
inewave/newave/modelos/pmo.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Imports do próprio módulo
|
|
2
2
|
|
|
3
3
|
from inewave.config import MAX_ANOS_ESTUDO, MAX_ITERS, MAX_MESES_ESTUDO
|
|
4
|
-
from inewave.config import MAX_REES
|
|
4
|
+
from inewave.config import MAX_REES, MAX_UTES
|
|
5
5
|
from inewave.config import MESES_DF
|
|
6
6
|
|
|
7
7
|
# Imports de módulos externos
|
|
@@ -11,7 +11,7 @@ from cfinterface.components.field import Field
|
|
|
11
11
|
from cfinterface.components.integerfield import IntegerField
|
|
12
12
|
from cfinterface.components.literalfield import LiteralField
|
|
13
13
|
from cfinterface.components.floatfield import FloatField
|
|
14
|
-
from datetime import timedelta
|
|
14
|
+
from datetime import timedelta, datetime
|
|
15
15
|
import numpy as np # type: ignore
|
|
16
16
|
import pandas as pd # type: ignore
|
|
17
17
|
from typing import IO, List, Optional
|
|
@@ -153,6 +153,76 @@ class BlocoEafPastCfugaMedioPMO(Block):
|
|
|
153
153
|
i += 1
|
|
154
154
|
|
|
155
155
|
|
|
156
|
+
class BlocoEnergiaArmazenadaMaximaPMO(Block):
|
|
157
|
+
"""
|
|
158
|
+
Bloco de informações da energia armazenada máxima dos REE
|
|
159
|
+
por configuração localizado no arquivo `pmo.dat`.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
BEGIN_PATTERN = "ENERGIA ARMAZENAVEL MAXIMA POR REE"
|
|
163
|
+
END_PATTERN = ""
|
|
164
|
+
|
|
165
|
+
def __init__(self, previous=None, next=None, data=None) -> None:
|
|
166
|
+
super().__init__(previous, next, data)
|
|
167
|
+
|
|
168
|
+
def __eq__(self, o: object) -> bool:
|
|
169
|
+
if not isinstance(o, BlocoEnergiaArmazenadaMaximaPMO):
|
|
170
|
+
return False
|
|
171
|
+
bloco: BlocoEnergiaArmazenadaMaximaPMO = o
|
|
172
|
+
if not all(
|
|
173
|
+
[
|
|
174
|
+
isinstance(self.data, pd.DataFrame),
|
|
175
|
+
isinstance(o.data, pd.DataFrame),
|
|
176
|
+
]
|
|
177
|
+
):
|
|
178
|
+
return False
|
|
179
|
+
else:
|
|
180
|
+
return self.data.equals(bloco.data)
|
|
181
|
+
|
|
182
|
+
# Override
|
|
183
|
+
def read(self, file: IO, *args, **kwargs):
|
|
184
|
+
def converte_tabela_em_df():
|
|
185
|
+
df = pd.DataFrame(
|
|
186
|
+
data={
|
|
187
|
+
"nome_ree": np.tile(np.array(nomes), len(configuracoes)),
|
|
188
|
+
"configuracao": np.repeat(
|
|
189
|
+
np.array(configuracoes), len(nomes)
|
|
190
|
+
),
|
|
191
|
+
"valor_MWmes": tabela_valores.flatten(),
|
|
192
|
+
}
|
|
193
|
+
)
|
|
194
|
+
return df
|
|
195
|
+
|
|
196
|
+
# Pula as linhas iniciais
|
|
197
|
+
for _ in range(4):
|
|
198
|
+
file.readline()
|
|
199
|
+
|
|
200
|
+
linha_nomes = file.readline()
|
|
201
|
+
nomes = [n.strip() for n in linha_nomes.split(" ") if len(n) > 2][1:]
|
|
202
|
+
num_rees = len(nomes)
|
|
203
|
+
linha_valores = Line(
|
|
204
|
+
[IntegerField(3, 5)]
|
|
205
|
+
+ [FloatField(15, 8 + 15 * i, 1) for i in range(num_rees)]
|
|
206
|
+
)
|
|
207
|
+
tabela_valores = np.zeros(
|
|
208
|
+
(MAX_MESES_ESTUDO, num_rees), dtype=np.float64
|
|
209
|
+
)
|
|
210
|
+
configuracoes: List[int] = []
|
|
211
|
+
i = 0
|
|
212
|
+
while True:
|
|
213
|
+
linha = file.readline()
|
|
214
|
+
if len(linha) < 3:
|
|
215
|
+
tabela_valores = tabela_valores[:i, :]
|
|
216
|
+
self.data = converte_tabela_em_df()
|
|
217
|
+
break
|
|
218
|
+
|
|
219
|
+
dados_linha = linha_valores.read(linha)
|
|
220
|
+
configuracoes.append(dados_linha[0])
|
|
221
|
+
tabela_valores[i, :] = dados_linha[1:]
|
|
222
|
+
|
|
223
|
+
i += 1
|
|
224
|
+
|
|
225
|
+
|
|
156
226
|
class BlocoEnergiaArmazenadaInicialPMO(Block):
|
|
157
227
|
"""
|
|
158
228
|
Bloco de informações da energia armazenada inicial dos REE
|
|
@@ -277,6 +347,174 @@ class BlocoVolumeArmazenadoInicialPMO(Block):
|
|
|
277
347
|
self.data = converte_tabela_em_df()
|
|
278
348
|
|
|
279
349
|
|
|
350
|
+
class BlocoGeracaoMinimaUsinasTermicasPMO(Block):
|
|
351
|
+
"""
|
|
352
|
+
Bloco de informações sobre a geração térmica mínima
|
|
353
|
+
por usina existentes no arquivo `pmo.dat`.
|
|
354
|
+
"""
|
|
355
|
+
|
|
356
|
+
BEGIN_PATTERN = "GERACAO TERMICA MINIMA POR USINA"
|
|
357
|
+
END_PATTERN = ""
|
|
358
|
+
|
|
359
|
+
def __init__(self, previous=None, next=None, data=None) -> None:
|
|
360
|
+
super().__init__(previous, next, data)
|
|
361
|
+
# Cria a estrutura de uma linha da tabela
|
|
362
|
+
self.__line = Line(
|
|
363
|
+
[IntegerField(6, 2), LiteralField(12, 9), IntegerField(7, 22)]
|
|
364
|
+
+ [FloatField(7, 30 + 8 * i, 2) for i in range(12)]
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
def __eq__(self, o: object) -> bool:
|
|
368
|
+
if not isinstance(o, BlocoGeracaoMinimaUsinasTermicasPMO):
|
|
369
|
+
return False
|
|
370
|
+
bloco: BlocoGeracaoMinimaUsinasTermicasPMO = o
|
|
371
|
+
if not all(
|
|
372
|
+
[
|
|
373
|
+
isinstance(self.data, pd.DataFrame),
|
|
374
|
+
isinstance(o.data, pd.DataFrame),
|
|
375
|
+
]
|
|
376
|
+
):
|
|
377
|
+
return False
|
|
378
|
+
else:
|
|
379
|
+
return self.data.equals(bloco.data)
|
|
380
|
+
|
|
381
|
+
# Override
|
|
382
|
+
def read(self, file: IO, *args, **kwargs):
|
|
383
|
+
def converte_tabela_em_df():
|
|
384
|
+
cols_meses = [str(m) for m in range(1, 13)]
|
|
385
|
+
df = pd.DataFrame(tabela, columns=cols_meses)
|
|
386
|
+
df["codigo_usina"] = codigos_usinas
|
|
387
|
+
df["nome_usina"] = nomes_usinas
|
|
388
|
+
df["ano"] = anos
|
|
389
|
+
df = df.melt(
|
|
390
|
+
id_vars=["codigo_usina", "nome_usina", "ano"],
|
|
391
|
+
value_vars=cols_meses,
|
|
392
|
+
var_name="mes",
|
|
393
|
+
value_name="valor_MWmed",
|
|
394
|
+
)
|
|
395
|
+
df = df.astype({"mes": int})
|
|
396
|
+
df["data"] = df.apply(
|
|
397
|
+
lambda linha: datetime(linha["ano"], linha["mes"], 1), axis=1
|
|
398
|
+
)
|
|
399
|
+
return df.drop(columns=["ano", "mes"])
|
|
400
|
+
|
|
401
|
+
# Pula as linhas iniciais
|
|
402
|
+
for _ in range(6):
|
|
403
|
+
file.readline()
|
|
404
|
+
# Variáveis auxiliares
|
|
405
|
+
codigos_usinas: List[int] = []
|
|
406
|
+
nomes_usinas: List[str] = []
|
|
407
|
+
codigo_atual = 0
|
|
408
|
+
nome_atual = ""
|
|
409
|
+
anos: List[int] = []
|
|
410
|
+
tabela = np.zeros(
|
|
411
|
+
(MAX_ANOS_ESTUDO * MAX_UTES, len(MESES_DF)), dtype=np.float64
|
|
412
|
+
)
|
|
413
|
+
i = 0
|
|
414
|
+
while True:
|
|
415
|
+
linha: str = file.readline()
|
|
416
|
+
# Confere se acabou
|
|
417
|
+
if len(linha) < 3 or "X--------------------" in linha:
|
|
418
|
+
tabela = tabela[:i, :]
|
|
419
|
+
self.data = converte_tabela_em_df()
|
|
420
|
+
break
|
|
421
|
+
# Lê mais uma linha
|
|
422
|
+
dados = self.__line.read(linha)
|
|
423
|
+
if dados[0] is not None:
|
|
424
|
+
codigo_atual = dados[0]
|
|
425
|
+
if len(dados[1]) > 0:
|
|
426
|
+
nome_atual = dados[1]
|
|
427
|
+
codigos_usinas.append(codigo_atual)
|
|
428
|
+
nomes_usinas.append(nome_atual)
|
|
429
|
+
anos.append(dados[2])
|
|
430
|
+
tabela[i, :] = dados[3:]
|
|
431
|
+
i += 1
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
class BlocoGeracaoMaximaUsinasTermicasPMO(Block):
|
|
435
|
+
"""
|
|
436
|
+
Bloco de informações sobre a geração térmica máxima
|
|
437
|
+
por usina existentes no arquivo `pmo.dat`.
|
|
438
|
+
"""
|
|
439
|
+
|
|
440
|
+
BEGIN_PATTERN = "GERACAO TERMICA MAXIMA POR USINA"
|
|
441
|
+
END_PATTERN = ""
|
|
442
|
+
|
|
443
|
+
def __init__(self, previous=None, next=None, data=None) -> None:
|
|
444
|
+
super().__init__(previous, next, data)
|
|
445
|
+
# Cria a estrutura de uma linha da tabela
|
|
446
|
+
self.__line = Line(
|
|
447
|
+
[IntegerField(6, 2), LiteralField(12, 9), IntegerField(7, 22)]
|
|
448
|
+
+ [FloatField(7, 30 + 8 * i, 2) for i in range(12)]
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
def __eq__(self, o: object) -> bool:
|
|
452
|
+
if not isinstance(o, BlocoGeracaoMaximaUsinasTermicasPMO):
|
|
453
|
+
return False
|
|
454
|
+
bloco: BlocoGeracaoMaximaUsinasTermicasPMO = o
|
|
455
|
+
if not all(
|
|
456
|
+
[
|
|
457
|
+
isinstance(self.data, pd.DataFrame),
|
|
458
|
+
isinstance(o.data, pd.DataFrame),
|
|
459
|
+
]
|
|
460
|
+
):
|
|
461
|
+
return False
|
|
462
|
+
else:
|
|
463
|
+
return self.data.equals(bloco.data)
|
|
464
|
+
|
|
465
|
+
# Override
|
|
466
|
+
def read(self, file: IO, *args, **kwargs):
|
|
467
|
+
def converte_tabela_em_df():
|
|
468
|
+
cols_meses = [str(m) for m in range(1, 13)]
|
|
469
|
+
df = pd.DataFrame(tabela, columns=cols_meses)
|
|
470
|
+
df["codigo_usina"] = codigos_usinas
|
|
471
|
+
df["nome_usina"] = nomes_usinas
|
|
472
|
+
df["ano"] = anos
|
|
473
|
+
df = df.melt(
|
|
474
|
+
id_vars=["codigo_usina", "nome_usina", "ano"],
|
|
475
|
+
value_vars=cols_meses,
|
|
476
|
+
var_name="mes",
|
|
477
|
+
value_name="valor_MWmed",
|
|
478
|
+
)
|
|
479
|
+
df = df.astype({"mes": int})
|
|
480
|
+
df["data"] = df.apply(
|
|
481
|
+
lambda linha: datetime(linha["ano"], linha["mes"], 1), axis=1
|
|
482
|
+
)
|
|
483
|
+
return df.drop(columns=["ano", "mes"])
|
|
484
|
+
|
|
485
|
+
# Pula as linhas iniciais
|
|
486
|
+
for _ in range(6):
|
|
487
|
+
file.readline()
|
|
488
|
+
# Variáveis auxiliares
|
|
489
|
+
codigos_usinas: List[int] = []
|
|
490
|
+
nomes_usinas: List[str] = []
|
|
491
|
+
codigo_atual = 0
|
|
492
|
+
nome_atual = ""
|
|
493
|
+
anos: List[int] = []
|
|
494
|
+
tabela = np.zeros(
|
|
495
|
+
(MAX_ANOS_ESTUDO * MAX_UTES, len(MESES_DF)), dtype=np.float64
|
|
496
|
+
)
|
|
497
|
+
i = 0
|
|
498
|
+
while True:
|
|
499
|
+
linha: str = file.readline()
|
|
500
|
+
# Confere se acabou
|
|
501
|
+
if len(linha) < 3 or "X--------------------" in linha:
|
|
502
|
+
tabela = tabela[:i, :]
|
|
503
|
+
self.data = converte_tabela_em_df()
|
|
504
|
+
break
|
|
505
|
+
# Lê mais uma linha
|
|
506
|
+
dados = self.__line.read(linha)
|
|
507
|
+
if dados[0] is not None:
|
|
508
|
+
codigo_atual = dados[0]
|
|
509
|
+
if len(dados[1]) > 0:
|
|
510
|
+
nome_atual = dados[1]
|
|
511
|
+
codigos_usinas.append(codigo_atual)
|
|
512
|
+
nomes_usinas.append(nome_atual)
|
|
513
|
+
anos.append(dados[2])
|
|
514
|
+
tabela[i, :] = dados[3:]
|
|
515
|
+
i += 1
|
|
516
|
+
|
|
517
|
+
|
|
280
518
|
class BlocoConvergenciaPMO(Block):
|
|
281
519
|
"""
|
|
282
520
|
Bloco com as informações de convergência do NEWAVE obtidas
|
|
@@ -822,7 +1060,9 @@ class BlocoProdutibilidadesConfiguracaoPMO(Block):
|
|
|
822
1060
|
while True:
|
|
823
1061
|
linha = file.readline()
|
|
824
1062
|
# Verifica se acabou:
|
|
825
|
-
if "
|
|
1063
|
+
if ("DADOS DE PENALIDADE POR PERIODO" in linha) or (
|
|
1064
|
+
"PRODUTIBILIDADES ACUMULADAS PARA CALCULO DE" in linha
|
|
1065
|
+
):
|
|
826
1066
|
if cfg_atual != 0:
|
|
827
1067
|
df_atual = self.__fecha_configuracao(
|
|
828
1068
|
df_usinas,
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
from cfinterface.components.section import Section
|
|
2
|
+
from cfinterface.components.line import Line
|
|
3
|
+
from cfinterface.components.floatfield import FloatField
|
|
4
|
+
from typing import IO
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from inewave.config import MAX_ANOS_HISTORICO
|
|
7
|
+
import pandas as pd # type: ignore
|
|
8
|
+
import numpy as np # type: ignore
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SecaoDadosVazinat(Section):
|
|
12
|
+
"""
|
|
13
|
+
Registro com os dados das séries históricas de vazão incremental por
|
|
14
|
+
configuração existentes no arquivo vazinat.dat.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, previous=None, next=None, data=None) -> None:
|
|
18
|
+
super().__init__(previous, next, data)
|
|
19
|
+
|
|
20
|
+
def __eq__(self, o: object) -> bool:
|
|
21
|
+
if not isinstance(o, SecaoDadosVazinat):
|
|
22
|
+
return False
|
|
23
|
+
bloco: SecaoDadosVazinat = o
|
|
24
|
+
if not all(
|
|
25
|
+
[
|
|
26
|
+
isinstance(self.data, pd.DataFrame),
|
|
27
|
+
isinstance(o.data, pd.DataFrame),
|
|
28
|
+
]
|
|
29
|
+
):
|
|
30
|
+
return False
|
|
31
|
+
else:
|
|
32
|
+
return self.data.equals(bloco.data)
|
|
33
|
+
|
|
34
|
+
def read(
|
|
35
|
+
self,
|
|
36
|
+
file: IO,
|
|
37
|
+
numero_uhes: int = 164,
|
|
38
|
+
numero_configuracoes: int = 60,
|
|
39
|
+
ano_inicio_historico: int = 1931,
|
|
40
|
+
*args,
|
|
41
|
+
**kwargs,
|
|
42
|
+
):
|
|
43
|
+
numero_registros = (
|
|
44
|
+
MAX_ANOS_HISTORICO * 12 * numero_uhes * numero_configuracoes
|
|
45
|
+
)
|
|
46
|
+
self.__linha = Line(
|
|
47
|
+
[
|
|
48
|
+
FloatField(size=8, starting_position=8 * i)
|
|
49
|
+
for i in range(numero_registros)
|
|
50
|
+
],
|
|
51
|
+
storage="BINARY",
|
|
52
|
+
)
|
|
53
|
+
dados = self.__linha.read(file.read(self.__linha.size))
|
|
54
|
+
datas_df = pd.date_range(
|
|
55
|
+
datetime(year=ano_inicio_historico, month=1, day=1),
|
|
56
|
+
datetime(
|
|
57
|
+
year=ano_inicio_historico + MAX_ANOS_HISTORICO - 1,
|
|
58
|
+
month=12,
|
|
59
|
+
day=1,
|
|
60
|
+
),
|
|
61
|
+
freq="MS",
|
|
62
|
+
).to_numpy()
|
|
63
|
+
datas_df = np.tile(datas_df, numero_uhes * numero_configuracoes)
|
|
64
|
+
uhes_df = np.tile(
|
|
65
|
+
np.repeat(np.arange(1, numero_uhes + 1), 12 * MAX_ANOS_HISTORICO),
|
|
66
|
+
numero_configuracoes,
|
|
67
|
+
)
|
|
68
|
+
configuracoes_df = np.repeat(
|
|
69
|
+
np.arange(1, numero_configuracoes + 1),
|
|
70
|
+
12 * MAX_ANOS_HISTORICO * numero_uhes,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
df = pd.DataFrame(
|
|
74
|
+
data={
|
|
75
|
+
"configuracao": configuracoes_df,
|
|
76
|
+
"data": datas_df,
|
|
77
|
+
"indice_usina": uhes_df,
|
|
78
|
+
"valor": dados,
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
self.data = df
|
|
82
|
+
|
|
83
|
+
def write(self, file: IO, *args, **kwargs):
|
|
84
|
+
dados = self.data["valor"].to_numpy()
|
|
85
|
+
linha = Line(
|
|
86
|
+
[
|
|
87
|
+
FloatField(size=8, starting_position=8 * i)
|
|
88
|
+
for i in range(len(dados))
|
|
89
|
+
],
|
|
90
|
+
storage="BINARY",
|
|
91
|
+
)
|
|
92
|
+
file.write(linha.write(dados))
|
inewave/newave/pmo.py
CHANGED
|
@@ -7,6 +7,7 @@ from inewave.newave.modelos.pmo import BlocoRiscoDeficitENSPMO
|
|
|
7
7
|
from inewave.newave.modelos.pmo import BlocoCustoOperacaoPMO
|
|
8
8
|
from inewave.newave.modelos.pmo import BlocoCustoOperacaoTotalPMO
|
|
9
9
|
from inewave.newave.modelos.pmo import BlocoProdutibilidadesConfiguracaoPMO
|
|
10
|
+
from inewave.newave.modelos.pmo import BlocoEnergiaArmazenadaMaximaPMO
|
|
10
11
|
from inewave.newave.modelos.pmo import BlocoEnergiaArmazenadaInicialPMO
|
|
11
12
|
from inewave.newave.modelos.pmo import BlocoVolumeArmazenadoInicialPMO
|
|
12
13
|
from inewave.newave.modelos.pmo import BlocoPenalidadeViolacaoOutrosUsosPMO
|
|
@@ -20,6 +21,10 @@ from inewave.newave.modelos.pmo import (
|
|
|
20
21
|
from inewave.newave.modelos.pmo import (
|
|
21
22
|
BlocoPenalidadeViolacaoTurbinamentoMinimoPMO,
|
|
22
23
|
)
|
|
24
|
+
from inewave.newave.modelos.pmo import (
|
|
25
|
+
BlocoGeracaoMinimaUsinasTermicasPMO,
|
|
26
|
+
BlocoGeracaoMaximaUsinasTermicasPMO,
|
|
27
|
+
)
|
|
23
28
|
|
|
24
29
|
from cfinterface.files.blockfile import BlockFile
|
|
25
30
|
from typing import TypeVar, Optional
|
|
@@ -52,6 +57,7 @@ class Pmo(BlockFile):
|
|
|
52
57
|
BlocoCustoOperacaoPMO,
|
|
53
58
|
BlocoCustoOperacaoTotalPMO,
|
|
54
59
|
BlocoProdutibilidadesConfiguracaoPMO,
|
|
60
|
+
BlocoEnergiaArmazenadaMaximaPMO,
|
|
55
61
|
BlocoEnergiaArmazenadaInicialPMO,
|
|
56
62
|
BlocoVolumeArmazenadoInicialPMO,
|
|
57
63
|
BlocoPenalidadeViolacaoOutrosUsosPMO,
|
|
@@ -61,6 +67,8 @@ class Pmo(BlockFile):
|
|
|
61
67
|
BlocoPenalidadeViolacaoEvaporacaoPMO,
|
|
62
68
|
BlocoPenalidadeViolacaoTurbinamentoMaximoPMO,
|
|
63
69
|
BlocoPenalidadeViolacaoTurbinamentoMinimoPMO,
|
|
70
|
+
BlocoGeracaoMinimaUsinasTermicasPMO,
|
|
71
|
+
BlocoGeracaoMaximaUsinasTermicasPMO,
|
|
64
72
|
]
|
|
65
73
|
|
|
66
74
|
@property
|
|
@@ -150,6 +158,25 @@ class Pmo(BlockFile):
|
|
|
150
158
|
b = self.data.get_blocks_of_type(BlocoConfiguracoesExpansaoPMO)
|
|
151
159
|
if isinstance(b, list):
|
|
152
160
|
return b[2].data
|
|
161
|
+
elif isinstance(b, BlocoConfiguracoesExpansaoPMO):
|
|
162
|
+
return b.data
|
|
163
|
+
return None
|
|
164
|
+
|
|
165
|
+
@property
|
|
166
|
+
def energia_armazenada_maxima(self) -> Optional[pd.DataFrame]:
|
|
167
|
+
"""
|
|
168
|
+
Valores da energia armazenada máxima para cada REE do caso.
|
|
169
|
+
|
|
170
|
+
- nome_ree (`str`)
|
|
171
|
+
- configuracao (`int`)
|
|
172
|
+
- valor_MWmes (`float`)
|
|
173
|
+
|
|
174
|
+
:return: As energias em um DataFrame.
|
|
175
|
+
:rtype: pd.DataFrame | None
|
|
176
|
+
"""
|
|
177
|
+
b = self.data.get_blocks_of_type(BlocoEnergiaArmazenadaMaximaPMO)
|
|
178
|
+
if isinstance(b, BlocoEnergiaArmazenadaMaximaPMO):
|
|
179
|
+
return b.data
|
|
153
180
|
return None
|
|
154
181
|
|
|
155
182
|
@property
|
|
@@ -161,7 +188,7 @@ class Pmo(BlockFile):
|
|
|
161
188
|
- valor_MWmes (`float`)
|
|
162
189
|
- valor_percentual (`float`)
|
|
163
190
|
|
|
164
|
-
:return: As
|
|
191
|
+
:return: As energias em um DataFrame.
|
|
165
192
|
:rtype: pd.DataFrame | None
|
|
166
193
|
"""
|
|
167
194
|
b = self.data.get_blocks_of_type(BlocoEnergiaArmazenadaInicialPMO)
|
|
@@ -502,3 +529,57 @@ class Pmo(BlockFile):
|
|
|
502
529
|
if isinstance(b, BlocoPenalidadeViolacaoEvaporacaoPMO):
|
|
503
530
|
return b.data
|
|
504
531
|
return None
|
|
532
|
+
|
|
533
|
+
@property
|
|
534
|
+
def geracao_minima_usinas_termicas(
|
|
535
|
+
self,
|
|
536
|
+
) -> Optional[pd.DataFrame]:
|
|
537
|
+
"""
|
|
538
|
+
Tabela de geração térmica mínima por usina térmica
|
|
539
|
+
existente no caso.
|
|
540
|
+
|
|
541
|
+
- codigo_usina (`int`)
|
|
542
|
+
- nome_usina (`str`)
|
|
543
|
+
- data (`datetime`)
|
|
544
|
+
- valor_MWmed (`float`)
|
|
545
|
+
|
|
546
|
+
:return: As gerações em um DataFrame.
|
|
547
|
+
:rtype: pd.DataFrame | None
|
|
548
|
+
"""
|
|
549
|
+
b = self.data.get_blocks_of_type(BlocoGeracaoMinimaUsinasTermicasPMO)
|
|
550
|
+
cols = ["codigo_usina", "nome_usina", "data", "valor_MWmed"]
|
|
551
|
+
if isinstance(b, list):
|
|
552
|
+
df = pd.concat([b.data for b in b], ignore_index=True)
|
|
553
|
+
df = df.sort_values(by=["codigo_usina", "data"])
|
|
554
|
+
return df[cols]
|
|
555
|
+
elif isinstance(b, BlocoGeracaoMinimaUsinasTermicasPMO):
|
|
556
|
+
df = b.data.sort_values(by=["codigo_usina", "data"])
|
|
557
|
+
return df[cols]
|
|
558
|
+
return None
|
|
559
|
+
|
|
560
|
+
@property
|
|
561
|
+
def geracao_maxima_usinas_termicas(
|
|
562
|
+
self,
|
|
563
|
+
) -> Optional[pd.DataFrame]:
|
|
564
|
+
"""
|
|
565
|
+
Tabela de geração térmica máxima por usina térmica
|
|
566
|
+
existente no caso.
|
|
567
|
+
|
|
568
|
+
- codigo_usina (`int`)
|
|
569
|
+
- nome_usina (`str`)
|
|
570
|
+
- data (`datetime`)
|
|
571
|
+
- valor_MWmed (`float`)
|
|
572
|
+
|
|
573
|
+
:return: As gerações em um DataFrame.
|
|
574
|
+
:rtype: pd.DataFrame | None
|
|
575
|
+
"""
|
|
576
|
+
b = self.data.get_blocks_of_type(BlocoGeracaoMaximaUsinasTermicasPMO)
|
|
577
|
+
cols = ["codigo_usina", "nome_usina", "data", "valor_MWmed"]
|
|
578
|
+
if isinstance(b, list):
|
|
579
|
+
df = pd.concat([b.data for b in b], ignore_index=True)
|
|
580
|
+
df = df.sort_values(by=["codigo_usina", "data"])
|
|
581
|
+
return df[cols]
|
|
582
|
+
elif isinstance(b, BlocoGeracaoMaximaUsinasTermicasPMO):
|
|
583
|
+
df = b.data.sort_values(by=["codigo_usina", "data"])
|
|
584
|
+
return df[cols]
|
|
585
|
+
return None
|
inewave/newave/sistema.py
CHANGED
|
@@ -130,8 +130,8 @@ class Sistema(SectionFile):
|
|
|
130
130
|
Tabela com a geração das usinas não simuladas por fonte
|
|
131
131
|
de geração.
|
|
132
132
|
|
|
133
|
-
-
|
|
134
|
-
-
|
|
133
|
+
- codigo_submercado (`int`)
|
|
134
|
+
- indice_bloco (`int`)
|
|
135
135
|
- fonte (`str`)
|
|
136
136
|
- data (`int`)
|
|
137
137
|
- valor (`float`)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from cfinterface.files.sectionfile import SectionFile
|
|
2
|
+
from inewave.newave.modelos.vazinat import SecaoDadosVazinat
|
|
3
|
+
import pandas as pd # type: ignore
|
|
4
|
+
|
|
5
|
+
from typing import TypeVar, Optional
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Vazinat(SectionFile):
|
|
9
|
+
"""
|
|
10
|
+
Armazena os dados de saída do NEWAVE referentes às séries históricas
|
|
11
|
+
de vazão por UHE.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
T = TypeVar("T")
|
|
15
|
+
|
|
16
|
+
SECTIONS = [SecaoDadosVazinat]
|
|
17
|
+
STORAGE = "BINARY"
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def series(self) -> Optional[pd.DataFrame]:
|
|
21
|
+
"""
|
|
22
|
+
Obtém a tabela com os dados das séries de vazão
|
|
23
|
+
incremental por UHE.
|
|
24
|
+
|
|
25
|
+
- data (`datetime`): data para o valor histórico
|
|
26
|
+
- indice_usina (`int`): índice da usina conforme ordem de
|
|
27
|
+
declaração no arquivo de configuração de usinas hidrelétricas
|
|
28
|
+
- valor (`float`): vazão incremental em m3/s
|
|
29
|
+
|
|
30
|
+
:return: A tabela com os dados das séries
|
|
31
|
+
:rtype: pd.DataFrame | None
|
|
32
|
+
"""
|
|
33
|
+
sections = [r for r in self.data.of_type(SecaoDadosVazinat)]
|
|
34
|
+
if len(sections) > 0:
|
|
35
|
+
return sections[0].data
|
|
36
|
+
else:
|
|
37
|
+
return None
|
|
38
|
+
|
|
39
|
+
@series.setter
|
|
40
|
+
def series(self, df: pd.DataFrame):
|
|
41
|
+
sections = [r for r in self.data.of_type(SecaoDadosVazinat)]
|
|
42
|
+
if len(sections) > 0:
|
|
43
|
+
sections[0].data = df
|
inewave/nwlistop/__init__.py
CHANGED
|
@@ -83,8 +83,15 @@ from .hmont import Hmont # noqa
|
|
|
83
83
|
from .intercambio import Intercambio # noqa
|
|
84
84
|
from .invade import Invade # noqa
|
|
85
85
|
from .invadem import Invadem # noqa
|
|
86
|
-
from .mediasmerc import Mediasmerc # noqa
|
|
87
86
|
from .mediassin import Mediassin # noqa
|
|
87
|
+
from .mediasmerc import Mediasmerc # noqa
|
|
88
|
+
from .mediasree import Mediasree # noqa
|
|
89
|
+
from .mediasusih import Mediasusih # noqa
|
|
90
|
+
from .mediasusit import Mediasusit # noqa
|
|
91
|
+
from .mediasusie import Mediasusie # noqa
|
|
92
|
+
from .mediasrep import Mediasrep # noqa
|
|
93
|
+
from .mediasrhq import Mediasrhq # noqa
|
|
94
|
+
from .mediasrhv import Mediasrhv # noqa
|
|
88
95
|
from .mercl import Mercl # noqa
|
|
89
96
|
from .merclsin import Merclsin # noqa
|
|
90
97
|
from .mevmin import Mevmin # noqa
|
inewave/nwlistop/mediasmerc.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import pandas as pd # type: ignore
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from cfinterface.files.sectionfile import SectionFile
|
|
4
4
|
|
|
5
|
+
from inewave.nwlistop.modelos.mediasmerc import TabelaMediasmerc
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
|
|
8
|
+
class Mediasmerc(SectionFile):
|
|
7
9
|
"""
|
|
8
10
|
Armazena os dados das saídas referentes às médias de diversas variáveis
|
|
9
11
|
agrupadas por submercado.
|
|
@@ -13,26 +15,23 @@ class Mediasmerc:
|
|
|
13
15
|
|
|
14
16
|
"""
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
self.__dados = dados
|
|
18
|
-
|
|
19
|
-
def __eq__(self, o: object) -> bool:
|
|
20
|
-
"""
|
|
21
|
-
A igualdade entre Mediasmerc avalia todos os valores da tabela.
|
|
22
|
-
"""
|
|
23
|
-
if not isinstance(o, Mediasmerc):
|
|
24
|
-
return False
|
|
25
|
-
m: Mediasmerc = o
|
|
26
|
-
return self.medias.equals(m.medias)
|
|
18
|
+
SECTIONS = [TabelaMediasmerc]
|
|
27
19
|
|
|
28
20
|
@property
|
|
29
|
-
def
|
|
30
|
-
|
|
21
|
+
def valores(self) -> pd.DataFrame:
|
|
22
|
+
"""
|
|
23
|
+
Tabela com os valores de médias para as variáveis dos submercados.
|
|
31
24
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
- estagio (`int`)
|
|
26
|
+
- codigo_submercado (`int`)
|
|
27
|
+
- <variavel_1> (`float`)
|
|
28
|
+
- ...
|
|
29
|
+
- <variavel_n> (`float`)
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
:return: A tabela como um DataFrame
|
|
32
|
+
:rtype: pd.DataFrame | None
|
|
33
|
+
"""
|
|
34
|
+
b = self.data.get_sections_of_type(TabelaMediasmerc)
|
|
35
|
+
if isinstance(b, TabelaMediasmerc):
|
|
36
|
+
return b.data
|
|
37
|
+
return None
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import pandas as pd # type: ignore
|
|
2
|
+
|
|
3
|
+
from cfinterface.files.sectionfile import SectionFile
|
|
4
|
+
|
|
5
|
+
from inewave.nwlistop.modelos.mediasree import TabelaMediasree
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Mediasree(SectionFile):
|
|
9
|
+
"""
|
|
10
|
+
Armazena os dados das saídas referentes às médias de diversas variáveis
|
|
11
|
+
agrupadas por REE.
|
|
12
|
+
|
|
13
|
+
Esta classe lida com as informações de saída fornecidas pelo
|
|
14
|
+
NWLISTOP e reproduzidas nos `MEDIAS-REE.CSV`.
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
SECTIONS = [TabelaMediasree]
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def valores(self) -> pd.DataFrame:
|
|
22
|
+
"""
|
|
23
|
+
Tabela com os valores de médias para as variáveis dos REE.
|
|
24
|
+
|
|
25
|
+
- estagio (`int`)
|
|
26
|
+
- codigo_ree (`int`)
|
|
27
|
+
- <variavel_1> (`float`)
|
|
28
|
+
- ...
|
|
29
|
+
- <variavel_n> (`float`)
|
|
30
|
+
|
|
31
|
+
:return: A tabela como um DataFrame
|
|
32
|
+
:rtype: pd.DataFrame | None
|
|
33
|
+
"""
|
|
34
|
+
b = self.data.get_sections_of_type(TabelaMediasree)
|
|
35
|
+
if isinstance(b, TabelaMediasree):
|
|
36
|
+
return b.data
|
|
37
|
+
return None
|