Skip to content

Commit

Permalink
padroniza dadger e dadgnl
Browse files Browse the repository at this point in the history
  • Loading branch information
rjmalves committed Aug 9, 2023
1 parent 6498277 commit 768eeca
Show file tree
Hide file tree
Showing 9 changed files with 537 additions and 478 deletions.
6 changes: 3 additions & 3 deletions examples/plot_dadger.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@
import plotly.express as px
import pandas as pd

gtmin_pat1 = [t.inflexibilidades[0] for t in termicas_semana1]
gtmax_pat1 = [t.disponibilidades[0] for t in termicas_semana1]
cvus_pat1 = [t.cvus[0] for t in termicas_semana1]
gtmin_pat1 = [t.inflexibilidade[0] for t in termicas_semana1]
gtmax_pat1 = [t.disponibilidade[0] for t in termicas_semana1]
cvus_pat1 = [t.cvu[0] for t in termicas_semana1]
df = pd.DataFrame(data={"cvu": cvus_pat1, "gt": gtmax_pat1})
df.sort_values("cvu", inplace=True)
df["gt"] = df["gt"].cumsum()
Expand Down
20 changes: 7 additions & 13 deletions examples/plot_edit_dadger.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,6 @@
Edição do dadger.rv0
========================================
.. warning::
Este exemplo lida com propriedades do registro `PQ` do arquivo :ref:`dadger.rvX <dadger>`. Uma delas
é a `PQ.subsistema`, que viola o padrão de nomenclatura para entidades que é recomendado nas diretrizes
do módulo idecomp e, portanto, pode sofrer alterações em versões futuras para `PQ.submercado`.
"""

# %%
Expand Down Expand Up @@ -37,17 +31,17 @@
# objetos que modelam cada registro, e isto é feito ao não forçar o argumento opcional
# `df=True`. Assim como para outros registros, é possível filtrar arbitrariamente pelos
# registros que são desejados passando as propriedades destes como argumentos opcionais
print(arq.pq(subsistema=1))
print(arq.pq(codigo_submercado=1))


# %%
# Para realizar a edição dos valores dos registros é possível acessar os objetos realizando
# os filtros adequados e alterar os valores das suas propriedades. Por exemplo, como só
# existe um registro `PQ` por submercado e estágio, os valores das suas gerações podem ser
# modificados diretamente:
reg_pq = arq.pq(subsistema=1, estagio=1)
reg_pq.geracoes = [10.0, 10.0, 10.0]
print(arq.pq(subsistema=1, estagio=1).geracoes)
reg_pq = arq.pq(codigo_submercado=1, estagio=1)
reg_pq.geracao = [10.0, 10.0, 10.0]
print(arq.pq(codigo_submercado=1, estagio=1).geracao)

# %%
# Caso seja desejado refazer completamente o bloco dos registros PQ, também é permitido
Expand Down Expand Up @@ -84,7 +78,7 @@
"NORTE",
"NORTE",
],
"subsistema": [1, 1, 2, 2, 3, 3, 4, 4],
"submercado": [1, 1, 2, 2, 3, 3, 4, 4],
"geracao_pat1": [10.0, 10.0, 20.0, 20.0, 30.0, 30.0, 40.0, 40.0],
"geracao_pat2": [11.0, 11.0, 21.0, 21.0, 31.0, 31.0, 41.0, 41.0],
"geracao_pat3": [12.0, 12.0, 22.0, 22.0, 32.0, 32.0, 42.0, 42.0],
Expand All @@ -95,8 +89,8 @@
r = PQ()
r.estagio = linha["estagio"]
r.nome = linha["nome"]
r.subsistema = linha["subsistema"]
r.geracoes = linha[
r.codigo_submercado = linha["submercado"]
r.geracao = linha[
["geracao_pat1", "geracao_pat2", "geracao_pat3"]
].tolist()
arq.data.add_after(registro_base, r)
Expand Down
7 changes: 6 additions & 1 deletion examples/plot_relato.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,10 @@
import plotly.express as px

# sphinx_gallery_thumbnail_number = 1
fig = px.line(df, x="Estágio", y="Earm Final Percentual", color="Subsistema")
fig = px.line(
df,
x="estagio",
y="energia_armazenada_final_percentual",
color="nome_submercado",
)
fig
50 changes: 30 additions & 20 deletions idecomp/decomp/dadger.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,11 +235,29 @@ def escreve_arquivo(self, diretorio: str, nome_arquivo="dadger.rv0"):
warnings.warn(msg, category=FutureWarning)
self.write(join(diretorio, nome_arquivo))

def __expande_colunas_df(self, df: pd.DataFrame) -> pd.DataFrame:
colunas_com_listas = df.applymap(
lambda linha: isinstance(linha, list)
).all()
nomes_colunas = [
c for c in colunas_com_listas[colunas_com_listas].index
]
for c in nomes_colunas:
num_elementos = len(df.at[0, c])
particoes_coluna = [
f"{c}_{i}" for i in range(1, num_elementos + 1)
]
df[particoes_coluna] = df.apply(
lambda linha: linha[c], axis=1, result_type="expand"
)
df.drop(columns=[c], inplace=True)
return df

def __registros_ou_df(
self, t: Type[T], **kwargs
) -> Optional[Union[T, List[T], pd.DataFrame]]:
if kwargs.get("df"):
return self._as_df(t)
return self.__expande_colunas_df(self._as_df(t))
else:
kwargs_sem_df = {k: v for k, v in kwargs.items() if k != "df"}
return self.data.get_registers_of_type(t, **kwargs_sem_df)
Expand Down Expand Up @@ -469,7 +487,7 @@ def pq(

def ac(
self,
uhe: int,
codigo_usina: int,
modificacao: Any,
df: bool = False,
**kwargs,
Expand All @@ -478,8 +496,8 @@ def ac(
Obtém um registro que define modificações nos parâmetros
das UHE em um :class:`Dadger`.
:param uhe: código da UHE modificada
:type uhe: int
:param codigo_usina: código da UHE modificada
:type codigo_usina: int
:param modificacao: classe da modificação realizada
:type modificacao: subtipos do tipo `AC`
:param df: ignorar os filtros e retornar
Expand All @@ -490,7 +508,7 @@ def ac(
:rtype: `AC` | list[`AC`] | :class:`pd.DataFrame` | None
"""
return self.__registros_ou_df(
modificacao, **{"uhe": uhe, **kwargs, "df": df}
modificacao, **{"codigo_usina": codigo_usina, **kwargs, "df": df}
)

def cd(
Expand Down Expand Up @@ -698,19 +716,15 @@ def cria_registro() -> Optional[LU]:
novo_registro.codigo_restricao = (
ultimo_registro.codigo_restricao
)
novo_registro.limites_inferiores = (
ultimo_registro.limites_inferiores
)
novo_registro.limites_superiores = (
ultimo_registro.limites_superiores
)
novo_registro.limite_inferior = ultimo_registro.limite_inferior
novo_registro.limite_superior = ultimo_registro.limite_superior
novo_registro.estagio = estagio
self.data.add_after(ultimo_registro, novo_registro)
return novo_registro
return None

if df:
return self._as_df(LU)
return self.__expande_colunas_df(self._as_df(LU))
else:
lu = self.data.get_registers_of_type(
LU, codigo_restricao=codigo_restricao, estagio=estagio
Expand Down Expand Up @@ -1224,7 +1238,7 @@ def cria_registro() -> Optional[LV]:
return None

if df:
return self._as_df(LV)
return self.__expande_colunas_df(self._as_df(LV))
else:
lv = self.data.get_registers_of_type(
LV, codigo_restricao=codigo_restricao, estagio=estagio
Expand Down Expand Up @@ -1383,19 +1397,15 @@ def cria_registro() -> Optional[LQ]:
data=[None] * len(ultimo_registro.data),
)
novo_registro.codigo_restricao = codigo_restricao
novo_registro.limites_superiores = (
ultimo_registro.limites_superiores
)
novo_registro.limites_inferiores = (
ultimo_registro.limites_inferiores
)
novo_registro.limite_superior = ultimo_registro.limite_superior
novo_registro.limite_inferior = ultimo_registro.limite_inferior
novo_registro.estagio = estagio
self.data.add_after(ultimo_registro, novo_registro)
return novo_registro
return None

if df:
return self._as_df(LQ)
return self.__expande_colunas_df(self._as_df(LQ))
else:
lq = self.data.get_registers_of_type(
LQ, codigo_restricao=codigo_restricao, estagio=estagio
Expand Down
70 changes: 46 additions & 24 deletions idecomp/decomp/dadgnl.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,37 @@ def escreve_arquivo(self, diretorio: str, nome_arquivo="dadgnl.rv0"):
warnings.warn(msg, category=FutureWarning)
self.write(join(diretorio, nome_arquivo))

def __expande_colunas_df(self, df: pd.DataFrame) -> pd.DataFrame:
colunas_com_listas = df.applymap(
lambda linha: isinstance(linha, list)
).all()
nomes_colunas = [
c for c in colunas_com_listas[colunas_com_listas].index
]
for c in nomes_colunas:
num_elementos = len(df.at[0, c])
particoes_coluna = [
f"{c}_{i}" for i in range(1, num_elementos + 1)
]
df[particoes_coluna] = df.apply(
lambda linha: linha[c], axis=1, result_type="expand"
)
df.drop(columns=[c], inplace=True)
return df

def __registros_ou_df(
self, t: Type[T], **kwargs
) -> Optional[Union[T, List[T], pd.DataFrame]]:
if kwargs.get("df"):
return self._as_df(t)
return self.__expande_colunas_df(self._as_df(t))
else:
kwargs_sem_df = {k: v for k, v in kwargs.items() if k != "df"}
return self.data.get_registers_of_type(t, **kwargs_sem_df)

def tg(
self,
codigo: Optional[int] = None,
subsistema: Optional[int] = None,
codigo_usina: Optional[int] = None,
codigo_submercado: Optional[int] = None,
nome: Optional[str] = None,
estagio: Optional[int] = None,
df: bool = False,
Expand All @@ -72,12 +90,12 @@ def tg(
Obtém um registro que define uma usina termelétrica existente
no estudo descrito pelo :class:`DadGNL`.
:param codigo: código que especifica o registro
:param codigo_usina: código que especifica o registro
da UTE
:type codigo: int | None
:param subsistema: código que especifica o subsistema
:type codigo_usina: int | None
:param codigo_submercado: código que especifica o submercado
da UTE
:type subsistema: int | None
:type codigo_submercado: int | None
:param nome: nome da UTE
:type nome: str | None
:param estagio: Índice do estágio para o qual foi cadastrado
Expand All @@ -92,8 +110,8 @@ def tg(
"""
return self.__registros_ou_df(
TG,
codigo=codigo,
subsistema=subsistema,
codigo_usina=codigo_usina,
codigo_submercado=codigo_submercado,
nome=nome,
estagio=estagio,
df=df,
Expand Down Expand Up @@ -124,19 +142,19 @@ def gs(

def nl(
self,
codigo: Optional[int] = None,
subsistema: Optional[int] = None,
codigo_usina: Optional[int] = None,
codigo_submercado: Optional[int] = None,
lag: Optional[int] = None,
df: bool = False,
) -> Optional[Union[NL, List[NL], pd.DataFrame]]:
"""
Obtém um registro que define o número de lags para o despacho
de uma UTE.
:param codigo: código da UTE
:type codigo: int | None
:param subsistema: subsistema da UTE
:type subsistema: int | None
:param codigo_usina: código da UTE
:type codigo_usina: int | None
:param codigo_submercado: código do submercado da UTE
:type codigo_submercado: int | None
:param lag: número de lags da UTE
:type lag: int | None
:param df: ignorar os filtros e retornar
Expand All @@ -147,13 +165,17 @@ def nl(
:rtype: :class:`NL` | list[:class:`NL`] | :class:`pd.DataFrame` | None
"""
return self.__registros_ou_df(
NL, codigo=codigo, subsistema=subsistema, lag=lag, df=df
NL,
codigo_usina=codigo_usina,
codigo_submercado=codigo_submercado,
lag=lag,
df=df,
)

def gl(
self,
codigo: Optional[int] = None,
subsistema: Optional[int] = None,
codigo_usina: Optional[int] = None,
codigo_submercado: Optional[int] = None,
estagio: Optional[int] = None,
data_inicio: Optional[str] = None,
df: bool = False,
Expand All @@ -162,11 +184,11 @@ def gl(
Obtém um registro que define o despacho por patamar
e a duração dos patamares para uma UTE GNL.
:param codigo: código que especifica o registro
:param codigo_usina: código que especifica o registro
da UTE
:type codigo: int | None
:param subsistema: subsistema da UTE
:type subsistema: int | None
:type codigo_usina: int | None
:param codigo_submercado: código do submercado da UTE
:type codigo_submercado: int | None
:param estagio: estágio do despacho da UTE
:type estagio: int | None
:param data_inicio: data de início do estágio
Expand All @@ -181,8 +203,8 @@ def gl(
"""
return self.__registros_ou_df(
GL,
codigo=codigo,
subsistema=subsistema,
codigo_usina=codigo_usina,
codigo_submercado=codigo_submercado,
estagio=estagio,
data_inicio=data_inicio,
df=df,
Expand Down
Loading

0 comments on commit 768eeca

Please sign in to comment.