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.
Files changed (44) hide show
  1. inewave/__init__.py +1 -1
  2. inewave/newave/__init__.py +10 -0
  3. inewave/newave/modelos/pmo.py +243 -3
  4. inewave/newave/modelos/vazinat.py +92 -0
  5. inewave/newave/pmo.py +82 -1
  6. inewave/newave/sistema.py +2 -2
  7. inewave/newave/vazinat.py +43 -0
  8. inewave/nwlistop/__init__.py +8 -1
  9. inewave/nwlistop/mediasmerc.py +20 -21
  10. inewave/nwlistop/mediasree.py +37 -0
  11. inewave/nwlistop/mediasrep.py +38 -0
  12. inewave/nwlistop/mediasrhq.py +38 -0
  13. inewave/nwlistop/mediasrhv.py +38 -0
  14. inewave/nwlistop/mediassin.py +19 -21
  15. inewave/nwlistop/mediasusie.py +38 -0
  16. inewave/nwlistop/mediasusih.py +37 -0
  17. inewave/nwlistop/mediasusit.py +37 -0
  18. inewave/nwlistop/modelos/mediasmerc.py +46 -34
  19. inewave/nwlistop/modelos/mediasree.py +52 -0
  20. inewave/nwlistop/modelos/mediasrep.py +52 -0
  21. inewave/nwlistop/modelos/mediasrhq.py +52 -0
  22. inewave/nwlistop/modelos/mediasrhv.py +52 -0
  23. inewave/nwlistop/modelos/mediassin.py +45 -29
  24. inewave/nwlistop/modelos/mediasusie.py +52 -0
  25. inewave/nwlistop/modelos/mediasusih.py +54 -0
  26. inewave/nwlistop/modelos/mediasusit.py +52 -0
  27. {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/METADATA +1 -1
  28. {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/RECORD +43 -20
  29. tests/mocks/arquivos/pmo.py +1741 -149
  30. tests/newave/test_pmo.py +59 -0
  31. tests/newave/test_vazinat.py +66 -0
  32. tests/nwlistop/test_mediasmerc.py +4 -8
  33. tests/nwlistop/test_mediasree.py +12 -0
  34. tests/nwlistop/test_mediasrep.py +12 -0
  35. tests/nwlistop/test_mediasrhq.py +12 -0
  36. tests/nwlistop/test_mediasrhv.py +11 -0
  37. tests/nwlistop/test_mediassin.py +4 -9
  38. tests/nwlistop/test_mediasusie.py +12 -0
  39. tests/nwlistop/test_mediasusih.py +11 -0
  40. tests/nwlistop/test_mediasusit.py +12 -0
  41. inewave/_utils/leituracsv.py +0 -57
  42. {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/LICENSE.md +0 -0
  43. {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/WHEEL +0 -0
  44. {inewave-1.6.0.dist-info → inewave-1.7.1.dist-info}/top_level.txt +0 -0
inewave/__init__.py CHANGED
@@ -6,7 +6,7 @@ inewave é um módulo em Python para manipulação dos arquivos de entrada
6
6
  e saída do NEWAVE.
7
7
  """
8
8
 
9
- __version__ = "1.6.0"
9
+ __version__ = "1.7.1"
10
10
 
11
11
  from . import newave # noqa
12
12
  from . import nwlistcf # noqa
@@ -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
@@ -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 "PRODUTIBILIDADES ACUMULADAS PARA CALCULO DE" in linha:
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 configurações em um DataFrame.
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
- - submercado (`int`)
134
- - bloco (`int`)
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
@@ -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
@@ -1,9 +1,11 @@
1
1
  import pandas as pd # type: ignore
2
2
 
3
- from inewave.nwlistop.modelos.mediasmerc import LeituraMediasMerc
3
+ from cfinterface.files.sectionfile import SectionFile
4
4
 
5
+ from inewave.nwlistop.modelos.mediasmerc import TabelaMediasmerc
5
6
 
6
- class Mediasmerc:
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
- def __init__(self, dados: pd.DataFrame):
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 medias(self) -> pd.DataFrame:
30
- return self.__dados
21
+ def valores(self) -> pd.DataFrame:
22
+ """
23
+ Tabela com os valores de médias para as variáveis dos submercados.
31
24
 
32
- @medias.setter
33
- def medias(self, d: pd.DataFrame) -> pd.DataFrame:
34
- self.__dados = d
25
+ - estagio (`int`)
26
+ - codigo_submercado (`int`)
27
+ - <variavel_1> (`float`)
28
+ - ...
29
+ - <variavel_n> (`float`)
35
30
 
36
- @classmethod
37
- def le_arquivo(cls, diretorio: str, nome_arquivo="MEDIAS-MERC.CSV"):
38
- return cls(LeituraMediasMerc(diretorio).le_arquivo(nome_arquivo))
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