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
@@ -0,0 +1,38 @@
1
+ import pandas as pd # type: ignore
2
+
3
+ from cfinterface.files.sectionfile import SectionFile
4
+
5
+ from inewave.nwlistop.modelos.mediasrep import TabelaMediasrep
6
+
7
+
8
+ class Mediasrep(SectionFile):
9
+ """
10
+ Armazena os dados das saídas referentes às médias
11
+ das restrições elétricas especiais.
12
+
13
+ Esta classe lida com as informações de saída fornecidas pelo
14
+ NWLISTOP e reproduzidas nos `MEDIAS-REP.CSV`.
15
+
16
+ """
17
+
18
+ SECTIONS = [TabelaMediasrep]
19
+
20
+ @property
21
+ def valores(self) -> pd.DataFrame:
22
+ """
23
+ Tabela com os valores de médias para as variáveis das
24
+ restrições elétricas especiais.
25
+
26
+ - estagio (`int`)
27
+ - codigo_restricao (`int`)
28
+ - <variavel_1> (`float`)
29
+ - ...
30
+ - <variavel_n> (`float`)
31
+
32
+ :return: A tabela como um DataFrame
33
+ :rtype: pd.DataFrame | None
34
+ """
35
+ b = self.data.get_sections_of_type(TabelaMediasrep)
36
+ if isinstance(b, TabelaMediasrep):
37
+ return b.data
38
+ return None
@@ -0,0 +1,38 @@
1
+ import pandas as pd # type: ignore
2
+
3
+ from cfinterface.files.sectionfile import SectionFile
4
+
5
+ from inewave.nwlistop.modelos.mediasrhq import TabelaMediasrhq
6
+
7
+
8
+ class Mediasrhq(SectionFile):
9
+ """
10
+ Armazena os dados das saídas referentes às médias
11
+ das restrições hidráulicas de vazão.
12
+
13
+ Esta classe lida com as informações de saída fornecidas pelo
14
+ NWLISTOP e reproduzidas nos `MEDIAS-RHQ.CSV`.
15
+
16
+ """
17
+
18
+ SECTIONS = [TabelaMediasrhq]
19
+
20
+ @property
21
+ def valores(self) -> pd.DataFrame:
22
+ """
23
+ Tabela com os valores de médias para as variáveis das
24
+ restrições hidráulicas de vazão.
25
+
26
+ - estagio (`int`)
27
+ - codigo_restricao (`int`)
28
+ - <variavel_1> (`float`)
29
+ - ...
30
+ - <variavel_n> (`float`)
31
+
32
+ :return: A tabela como um DataFrame
33
+ :rtype: pd.DataFrame | None
34
+ """
35
+ b = self.data.get_sections_of_type(TabelaMediasrhq)
36
+ if isinstance(b, TabelaMediasrhq):
37
+ return b.data
38
+ return None
@@ -0,0 +1,38 @@
1
+ import pandas as pd # type: ignore
2
+
3
+ from cfinterface.files.sectionfile import SectionFile
4
+
5
+ from inewave.nwlistop.modelos.mediasrhv import TabelaMediasrhv
6
+
7
+
8
+ class Mediasrhv(SectionFile):
9
+ """
10
+ Armazena os dados das saídas referentes às médias
11
+ das restrições hidráulicas de volume.
12
+
13
+ Esta classe lida com as informações de saída fornecidas pelo
14
+ NWLISTOP e reproduzidas nos `MEDIAS-RHV.CSV`.
15
+
16
+ """
17
+
18
+ SECTIONS = [TabelaMediasrhv]
19
+
20
+ @property
21
+ def valores(self) -> pd.DataFrame:
22
+ """
23
+ Tabela com os valores de médias para as variáveis das
24
+ restrições hidráulicas de volume.
25
+
26
+ - estagio (`int`)
27
+ - codigo_restricao (`int`)
28
+ - <variavel_1> (`float`)
29
+ - ...
30
+ - <variavel_n> (`float`)
31
+
32
+ :return: A tabela como um DataFrame
33
+ :rtype: pd.DataFrame | None
34
+ """
35
+ b = self.data.get_sections_of_type(TabelaMediasrhv)
36
+ if isinstance(b, TabelaMediasrhv):
37
+ return b.data
38
+ return None
@@ -1,9 +1,11 @@
1
1
  import pandas as pd # type: ignore
2
2
 
3
- from inewave.nwlistop.modelos.mediassin import LeituraMediasSIN
3
+ from cfinterface.files.sectionfile import SectionFile
4
4
 
5
+ from inewave.nwlistop.modelos.mediassin import TabelaMediassin
5
6
 
6
- class Mediassin:
7
+
8
+ class Mediassin(SectionFile):
7
9
  """
8
10
  Armazena os dados das saídas referentes às médias de diversas variáveis
9
11
  para o SIN.
@@ -13,26 +15,22 @@ class Mediassin:
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 Mediassin avalia todos os valores da tabela.
22
- """
23
- if not isinstance(o, Mediassin):
24
- return False
25
- m: Mediassin = o
26
- return self.medias.equals(m.medias)
18
+ SECTIONS = [TabelaMediassin]
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 do SIN.
31
24
 
32
- @medias.setter
33
- def medias(self, d: pd.DataFrame) -> pd.DataFrame:
34
- self.__dados = d
25
+ - estagio (`int`)
26
+ - <variavel_1> (`float`)
27
+ - ...
28
+ - <variavel_n> (`float`)
35
29
 
36
- @classmethod
37
- def le_arquivo(cls, diretorio: str, nome_arquivo="MEDIAS-SIN.CSV"):
38
- return cls(LeituraMediasSIN(diretorio).le_arquivo(nome_arquivo))
30
+ :return: A tabela como um DataFrame
31
+ :rtype: pd.DataFrame | None
32
+ """
33
+ b = self.data.get_sections_of_type(TabelaMediassin)
34
+ if isinstance(b, TabelaMediassin):
35
+ return b.data
36
+ return None
@@ -0,0 +1,38 @@
1
+ import pandas as pd # type: ignore
2
+
3
+ from cfinterface.files.sectionfile import SectionFile
4
+
5
+ from inewave.nwlistop.modelos.mediasusie import TabelaMediasusie
6
+
7
+
8
+ class Mediasusie(SectionFile):
9
+ """
10
+ Armazena os dados das saídas referentes às médias de diversas variáveis
11
+ de cada estação elevatória.
12
+
13
+ Esta classe lida com as informações de saída fornecidas pelo
14
+ NWLISTOP e reproduzidas nos `MEDIAS-USIE.CSV`.
15
+
16
+ """
17
+
18
+ SECTIONS = [TabelaMediasusie]
19
+
20
+ @property
21
+ def valores(self) -> pd.DataFrame:
22
+ """
23
+ Tabela com os valores de médias para as variáveis das estações
24
+ elevatórias.
25
+
26
+ - estagio (`int`)
27
+ - codigo_usina (`int`)
28
+ - <variavel_1> (`float`)
29
+ - ...
30
+ - <variavel_n> (`float`)
31
+
32
+ :return: A tabela como um DataFrame
33
+ :rtype: pd.DataFrame | None
34
+ """
35
+ b = self.data.get_sections_of_type(TabelaMediasusie)
36
+ if isinstance(b, TabelaMediasusie):
37
+ return b.data
38
+ 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.mediasusih import TabelaMediasusih
6
+
7
+
8
+ class Mediasusih(SectionFile):
9
+ """
10
+ Armazena os dados das saídas referentes às médias de diversas variáveis
11
+ de cada UHE.
12
+
13
+ Esta classe lida com as informações de saída fornecidas pelo
14
+ NWLISTOP e reproduzidas nos `MEDIAS-USIH.CSV`.
15
+
16
+ """
17
+
18
+ SECTIONS = [TabelaMediasusih]
19
+
20
+ @property
21
+ def valores(self) -> pd.DataFrame:
22
+ """
23
+ Tabela com os valores de médias para as variáveis das UHE.
24
+
25
+ - estagio (`int`)
26
+ - codigo_usina (`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(TabelaMediasusih)
35
+ if isinstance(b, TabelaMediasusih):
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.mediasusit import TabelaMediasusit
6
+
7
+
8
+ class Mediasusit(SectionFile):
9
+ """
10
+ Armazena os dados das saídas referentes às médias de diversas variáveis
11
+ de cada UTE.
12
+
13
+ Esta classe lida com as informações de saída fornecidas pelo
14
+ NWLISTOP e reproduzidas nos `MEDIAS-USIT.CSV`.
15
+
16
+ """
17
+
18
+ SECTIONS = [TabelaMediasusit]
19
+
20
+ @property
21
+ def valores(self) -> pd.DataFrame:
22
+ """
23
+ Tabela com os valores de médias para as variáveis das UHE.
24
+
25
+ - estagio (`int`)
26
+ - codigo_usina (`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(TabelaMediasusit)
35
+ if isinstance(b, TabelaMediasusit):
36
+ return b.data
37
+ return None
@@ -1,40 +1,52 @@
1
- # Imports do próprio módulo
2
- from inewave._utils.leituracsv import LeituraCSV
3
-
4
1
  # Imports de módulos externos
2
+ from cfinterface.components.section import Section
3
+ from typing import IO
4
+ import pandas as pd # type: ignore
5
5
 
6
6
 
7
- class LeituraMediasMerc(LeituraCSV):
7
+ class TabelaMediasmerc(Section):
8
8
  """
9
- Realiza a leitura do arquivo MEDIAS-MERC.CSV
10
- existente em um diretório de saídas do NEWAVE.
11
-
12
- Esta classe contém o conjunto de utilidades para ler
13
- e interpretar os campos do arquivo MEDIAS-MERC.CSV, construindo um
14
- objeto `MediasMerc` cujas informações são as mesmas do arquivo.
15
-
16
- Este objeto existe para retirar do modelo de dados a complexidade
17
- de iterar pelas linhas do arquivo, recortar colunas, converter
18
- tipos de dados, dentre outras tarefas necessárias para a leitura.
19
-
9
+ Bloco com o conteúdo da tabela existente no arquivo `MEDIAS-MERC.CSV`.
20
10
  """
21
11
 
22
- def __init__(self, diretorio: str) -> None:
23
- super().__init__(diretorio)
24
-
25
- def processa_dados_lidos(self):
26
- # Remove os espaços dos índices
27
- vars_atuais = list(self._dados.index)
28
- vars_novas = [v.strip() for v in vars_atuais]
29
- self._dados.index = vars_novas
30
- # Renomeia as colunas
31
- cols_atuais = list(self._dados.columns)
32
- cols_novas = [c.strip() for c in cols_atuais]
33
- cols_novas[0] = "Submercado"
34
- self._dados.columns = cols_novas
35
- # Exclui a última coluna (em branco)
36
- self._dados.drop(columns=[cols_novas[-1]], inplace=True)
37
- # Substitui os elementos da primeira coluna pelos submercados
38
- mapa_termos = {0: "SIN", 1: "SE", 2: "S", 3: "NE", 4: "N"}
39
- nova_coluna = [mapa_termos[i] for i in self._dados["Submercado"]]
40
- self._dados["Submercado"] = nova_coluna
12
+ def __init__(self, previous=None, next=None, data=None) -> None:
13
+ super().__init__(previous, next, data)
14
+
15
+ def __eq__(self, o: object) -> bool:
16
+ if not isinstance(o, TabelaMediasmerc):
17
+ return False
18
+ bloco: TabelaMediasmerc = o
19
+ if not all(
20
+ [
21
+ isinstance(self.data, pd.DataFrame),
22
+ isinstance(o.data, pd.DataFrame),
23
+ ]
24
+ ):
25
+ return False
26
+ else:
27
+ return self.data.equals(bloco.data)
28
+
29
+ # Override
30
+ def read(self, file: IO, *args, **kwargs):
31
+ tabela = pd.read_csv(file, skipinitialspace=True)
32
+ col_sbm = "SBM_ext"
33
+ tabela = tabela.rename(columns={col_sbm: "codigo_submercado"})
34
+ tabela = tabela.loc[tabela["codigo_submercado"] > 0]
35
+ cols = tabela.columns.tolist()
36
+ df = tabela.drop(columns=[cols[-1]])
37
+ cols_id = ["VAR", "codigo_submercado"]
38
+ cols_estagios = [c for c in df.columns.tolist() if c not in cols_id]
39
+ df = df.melt(
40
+ id_vars=cols_id,
41
+ value_vars=cols_estagios,
42
+ var_name="estagio",
43
+ value_name="valor",
44
+ )
45
+ df["estagio"] = df["estagio"].astype(int)
46
+ df["estagio"] -= df["estagio"].min() - 1
47
+ df = df.pivot_table(
48
+ index=["estagio", "codigo_submercado"],
49
+ columns="VAR",
50
+ values="valor",
51
+ ).reset_index()
52
+ self.data = df
@@ -0,0 +1,52 @@
1
+ # Imports de módulos externos
2
+ from cfinterface.components.section import Section
3
+ from typing import IO
4
+ import pandas as pd # type: ignore
5
+
6
+
7
+ class TabelaMediasree(Section):
8
+ """
9
+ Bloco com o conteúdo da tabela existente no arquivo `MEDIAS-REE.CSV`.
10
+ """
11
+
12
+ def __init__(self, previous=None, next=None, data=None) -> None:
13
+ super().__init__(previous, next, data)
14
+
15
+ def __eq__(self, o: object) -> bool:
16
+ if not isinstance(o, TabelaMediasree):
17
+ return False
18
+ bloco: TabelaMediasree = o
19
+ if not all(
20
+ [
21
+ isinstance(self.data, pd.DataFrame),
22
+ isinstance(o.data, pd.DataFrame),
23
+ ]
24
+ ):
25
+ return False
26
+ else:
27
+ return self.data.equals(bloco.data)
28
+
29
+ # Override
30
+ def read(self, file: IO, *args, **kwargs):
31
+ tabela = pd.read_csv(file, skipinitialspace=True)
32
+ col_ree = "REE_ext"
33
+ tabela = tabela.rename(columns={col_ree: "codigo_ree"})
34
+ tabela = tabela.loc[tabela["codigo_ree"] > 0]
35
+ cols = tabela.columns.tolist()
36
+ df = tabela.drop(columns=[cols[-1]])
37
+ cols_id = ["VAR", "codigo_ree"]
38
+ cols_estagios = [c for c in df.columns.tolist() if c not in cols_id]
39
+ df = df.melt(
40
+ id_vars=cols_id,
41
+ value_vars=cols_estagios,
42
+ var_name="estagio",
43
+ value_name="valor",
44
+ )
45
+ df["estagio"] = df["estagio"].astype(int)
46
+ df["estagio"] -= df["estagio"].min() - 1
47
+ df = df.pivot_table(
48
+ index=["estagio", "codigo_ree"],
49
+ columns="VAR",
50
+ values="valor",
51
+ ).reset_index()
52
+ self.data = df
@@ -0,0 +1,52 @@
1
+ # Imports de módulos externos
2
+ from cfinterface.components.section import Section
3
+ from typing import IO
4
+ import pandas as pd # type: ignore
5
+
6
+
7
+ class TabelaMediasrep(Section):
8
+ """
9
+ Bloco com o conteúdo da tabela existente no arquivo `MEDIAS-REP.CSV`.
10
+ """
11
+
12
+ def __init__(self, previous=None, next=None, data=None) -> None:
13
+ super().__init__(previous, next, data)
14
+
15
+ def __eq__(self, o: object) -> bool:
16
+ if not isinstance(o, TabelaMediasrep):
17
+ return False
18
+ bloco: TabelaMediasrep = o
19
+ if not all(
20
+ [
21
+ isinstance(self.data, pd.DataFrame),
22
+ isinstance(o.data, pd.DataFrame),
23
+ ]
24
+ ):
25
+ return False
26
+ else:
27
+ return self.data.equals(bloco.data)
28
+
29
+ # Override
30
+ def read(self, file: IO, *args, **kwargs):
31
+ tabela = pd.read_csv(file, skipinitialspace=True)
32
+ col_rep = "REP_ext"
33
+ tabela = tabela.rename(columns={col_rep: "codigo_restricao"})
34
+ tabela = tabela.loc[tabela["codigo_restricao"] > 0]
35
+ cols = tabela.columns.tolist()
36
+ df = tabela.drop(columns=[cols[-1]])
37
+ cols_id = ["VAR", "codigo_restricao"]
38
+ cols_estagios = [c for c in df.columns.tolist() if c not in cols_id]
39
+ df = df.melt(
40
+ id_vars=cols_id,
41
+ value_vars=cols_estagios,
42
+ var_name="estagio",
43
+ value_name="valor",
44
+ )
45
+ df["estagio"] = df["estagio"].astype(int)
46
+ df["estagio"] -= df["estagio"].min() - 1
47
+ df = df.pivot_table(
48
+ index=["estagio", "codigo_restricao"],
49
+ columns="VAR",
50
+ values="valor",
51
+ ).reset_index()
52
+ self.data = df
@@ -0,0 +1,52 @@
1
+ # Imports de módulos externos
2
+ from cfinterface.components.section import Section
3
+ from typing import IO
4
+ import pandas as pd # type: ignore
5
+
6
+
7
+ class TabelaMediasrhq(Section):
8
+ """
9
+ Bloco com o conteúdo da tabela existente no arquivo `MEDIAS-RHQ.CSV`.
10
+ """
11
+
12
+ def __init__(self, previous=None, next=None, data=None) -> None:
13
+ super().__init__(previous, next, data)
14
+
15
+ def __eq__(self, o: object) -> bool:
16
+ if not isinstance(o, TabelaMediasrhq):
17
+ return False
18
+ bloco: TabelaMediasrhq = o
19
+ if not all(
20
+ [
21
+ isinstance(self.data, pd.DataFrame),
22
+ isinstance(o.data, pd.DataFrame),
23
+ ]
24
+ ):
25
+ return False
26
+ else:
27
+ return self.data.equals(bloco.data)
28
+
29
+ # Override
30
+ def read(self, file: IO, *args, **kwargs):
31
+ tabela = pd.read_csv(file, skipinitialspace=True)
32
+ col_rhq = "RHQ_ext"
33
+ tabela = tabela.rename(columns={col_rhq: "codigo_restricao"})
34
+ tabela = tabela.loc[tabela["codigo_restricao"] > 0]
35
+ cols = tabela.columns.tolist()
36
+ df = tabela.drop(columns=[cols[-1]])
37
+ cols_id = ["VAR", "codigo_restricao"]
38
+ cols_estagios = [c for c in df.columns.tolist() if c not in cols_id]
39
+ df = df.melt(
40
+ id_vars=cols_id,
41
+ value_vars=cols_estagios,
42
+ var_name="estagio",
43
+ value_name="valor",
44
+ )
45
+ df["estagio"] = df["estagio"].astype(int)
46
+ df["estagio"] -= df["estagio"].min() - 1
47
+ df = df.pivot_table(
48
+ index=["estagio", "codigo_restricao"],
49
+ columns="VAR",
50
+ values="valor",
51
+ ).reset_index()
52
+ self.data = df
@@ -0,0 +1,52 @@
1
+ # Imports de módulos externos
2
+ from cfinterface.components.section import Section
3
+ from typing import IO
4
+ import pandas as pd # type: ignore
5
+
6
+
7
+ class TabelaMediasrhv(Section):
8
+ """
9
+ Bloco com o conteúdo da tabela existente no arquivo `MEDIAS-RHV.CSV`.
10
+ """
11
+
12
+ def __init__(self, previous=None, next=None, data=None) -> None:
13
+ super().__init__(previous, next, data)
14
+
15
+ def __eq__(self, o: object) -> bool:
16
+ if not isinstance(o, TabelaMediasrhv):
17
+ return False
18
+ bloco: TabelaMediasrhv = o
19
+ if not all(
20
+ [
21
+ isinstance(self.data, pd.DataFrame),
22
+ isinstance(o.data, pd.DataFrame),
23
+ ]
24
+ ):
25
+ return False
26
+ else:
27
+ return self.data.equals(bloco.data)
28
+
29
+ # Override
30
+ def read(self, file: IO, *args, **kwargs):
31
+ tabela = pd.read_csv(file, skipinitialspace=True)
32
+ col_rhv = "RHV_ext"
33
+ tabela = tabela.rename(columns={col_rhv: "codigo_restricao"})
34
+ tabela = tabela.loc[tabela["codigo_restricao"] > 0]
35
+ cols = tabela.columns.tolist()
36
+ df = tabela.drop(columns=[cols[-1]])
37
+ cols_id = ["VAR", "codigo_restricao"]
38
+ cols_estagios = [c for c in df.columns.tolist() if c not in cols_id]
39
+ df = df.melt(
40
+ id_vars=cols_id,
41
+ value_vars=cols_estagios,
42
+ var_name="estagio",
43
+ value_name="valor",
44
+ )
45
+ df["estagio"] = df["estagio"].astype(int)
46
+ df["estagio"] -= df["estagio"].min() - 1
47
+ df = df.pivot_table(
48
+ index=["estagio", "codigo_restricao"],
49
+ columns="VAR",
50
+ values="valor",
51
+ ).reset_index()
52
+ self.data = df
@@ -1,35 +1,51 @@
1
- # Imports do próprio módulo
2
- from inewave._utils.leituracsv import LeituraCSV
3
-
4
1
  # Imports de módulos externos
2
+ from cfinterface.components.section import Section
3
+ from typing import IO
4
+ import pandas as pd # type: ignore
5
5
 
6
6
 
7
- class LeituraMediasSIN(LeituraCSV):
7
+ class TabelaMediassin(Section):
8
8
  """
9
- Realiza a leitura do arquivo MEDIAS-SIN.CSV
10
- existente em um diretório de saídas do NEWAVE.
11
-
12
- Esta classe contém o conjunto de utilidades para ler
13
- e interpretar os campos do arquivo MEDIAS-SIN.CSV, construindo um
14
- objeto `MediasSIN` cujas informações são as mesmas do arquivo.
15
-
16
- Este objeto existe para retirar do modelo de dados a complexidade
17
- de iterar pelas linhas do arquivo, recortar colunas, converter
18
- tipos de dados, dentre outras tarefas necessárias para a leitura.
19
-
9
+ Bloco com o conteúdo da tabela existente no arquivo `MEDIAS-SIN.CSV`.
20
10
  """
21
11
 
22
- def __init__(self, diretorio: str) -> None:
23
- super().__init__(diretorio)
24
-
25
- def processa_dados_lidos(self):
26
- # Remove os espaços dos índices
27
- vars_atuais = list(self._dados.index)
28
- vars_novas = [v.strip() for v in vars_atuais]
29
- self._dados.index = vars_novas
30
- # Renomeia as colunas
31
- cols_atuais = list(self._dados.columns)
32
- cols_novas = [c.strip() for c in cols_atuais]
33
- self._dados.columns = cols_novas
34
- # Exclui a primeira e a última coluna (todos 0 | em branco)
35
- self._dados.drop(columns=[cols_novas[0], cols_novas[-1]], inplace=True)
12
+ def __init__(self, previous=None, next=None, data=None) -> None:
13
+ super().__init__(previous, next, data)
14
+
15
+ def __eq__(self, o: object) -> bool:
16
+ if not isinstance(o, TabelaMediassin):
17
+ return False
18
+ bloco: TabelaMediassin = o
19
+ if not all(
20
+ [
21
+ isinstance(self.data, pd.DataFrame),
22
+ isinstance(o.data, pd.DataFrame),
23
+ ]
24
+ ):
25
+ return False
26
+ else:
27
+ return self.data.equals(bloco.data)
28
+
29
+ # Override
30
+ def read(self, file: IO, *args, **kwargs):
31
+ tabela = pd.read_csv(file, skipinitialspace=True)
32
+ col_sin = "SIN"
33
+ tabela = tabela.rename(columns={col_sin: "codigo_sin"})
34
+ cols = tabela.columns.tolist()
35
+ df = tabela.drop(columns=[cols[0], cols[-1]])
36
+ cols_id = ["VAR"]
37
+ cols_estagios = [c for c in df.columns.tolist() if c not in cols_id]
38
+ df = df.melt(
39
+ id_vars=cols_id,
40
+ value_vars=cols_estagios,
41
+ var_name="estagio",
42
+ value_name="valor",
43
+ )
44
+ df["estagio"] = df["estagio"].astype(int)
45
+ df["estagio"] -= df["estagio"].min() - 1
46
+ df = df.pivot_table(
47
+ index=["estagio"],
48
+ columns="VAR",
49
+ values="valor",
50
+ ).reset_index()
51
+ self.data = df