def le_tabela(linha: str) -> np.ndarray: indice_ree = int(linha.split("REE: ")[1].split("-")[0].strip()) ree = linha.split("REE: ")[1].split("/")[0].split("-")[1].strip() subsis = linha.split("SUBSISTEMA: ")[1].split("-")[1].strip() # Salta uma linha para identificar o número de estágios arq.readline() lin = arq.readline() sems = [ s for s in lin.split(" ") if (len(s) > 0 and ("Sem" in s or "Mes" in s)) ] n_semanas = len(sems) arq.readline() # Começa a ler os cenários reg_cen = RegistroIn(3) reg_ena = RegistroFn(8) tab = np.zeros((1000, n_semanas + 1)) i = 0 while True: lin = arq.readline() if len(lin) < 4: tab = tab[:i, :] break tab[i, 0] = reg_cen.le_registro(lin, 4) tab[i, 1:] = reg_ena.le_linha_tabela(lin, 8, 1, n_semanas) indices_rees.append(indice_ree) rees.append(ree) subsistemas.append(subsis) i += 1 return tab
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: df = pd.DataFrame(tabela) cols = ["Earmax"] + [f"Estágio Pré {s}" for s in range(1, 6)] df.columns = cols df["Subsistema"] = subsistemas df = df[["Subsistema"] + cols] # Remove as colunas preenchidas com 0 for c in cols: if df[c].max() == 0: df.drop(columns=c, inplace=True) return df # Salta 4 linhas for _ in range(4): arq.readline() reg_ssis = RegistroAn(14) reg_ena = RegistroFn(8) subsistemas: List[str] = [] tabela = np.zeros((MAX_SUBSISTEMAS, 6)) i = 0 while True: # Confere se a leitura não acabou linha = arq.readline() if "X--------------X" in linha: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break # Senão, lê mais uma linha # Subsistema e REE ssis = reg_ssis.le_registro(linha, 4) subsistemas.append(ssis) # Semanas tabela[i, :] = reg_ena.le_linha_tabela(linha, 24, 1, 6) i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: df = pd.DataFrame(tabela) cols = ["Earmax"] + [f"Estágio Pré {s}" for s in range(1, 12)] df.columns = cols df["REE"] = rees df = df[["REE"] + cols] return df # Salta 4 linhas for _ in range(4): arq.readline() reg_ree = RegistroAn(14) reg_ena = RegistroFn(8) rees: List[str] = [] tabela = np.zeros((20, 12)) i = 0 while True: # Confere se a leitura não acabou linha = arq.readline() if "X--------------X" in linha: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break # Senão, lê mais uma linha # Subsistema e REE ssis = reg_ree.le_registro(linha, 4) rees.append(ssis) # Semanas tabela[i, :] = reg_ena.le_linha_tabela(linha, 29, 1, 12) i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: cols = [ "GT Min Pat. 1", "GT Max Pat. 1", "Custo Pat. 1", "GT Min Pat. 2", "GT Max Pat. 2", "Custo Pat. 2", "GT Min Pat. 3", "GT Max Pat. 3", "Custo Pat. 3" ] df = pd.DataFrame(tabela, columns=cols) df["Código"] = numeros df["Usina"] = usinas df["Subsistema"] = subsistemas df["Estágio"] = estagios df = df[["Código", "Usina", "Subsistema", "Estágio"] + cols] return df # Salta as linhas de cabeçalho for _ in range(4): arq.readline() reg_num = RegistroIn(3) reg_usina = RegistroAn(10) reg_subsis = RegistroAn(6) reg_estagio = RegistroIn(7) reg_valores = RegistroFn(7) numeros: List[int] = [] usinas: List[str] = [] subsistemas: List[str] = [] estagios: List[int] = [] tabela = np.zeros((5000, 9)) i = 0 num_atual = 0 usina_atual = "" subsis_atual = "" while True: # Confere se a leitura não acabou linha = arq.readline() if "X---X----------X" in linha: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break # Senão, lê mais uma linha # Verifica se começa uma nova UTE na linha if len(linha[4:7].strip()) > 0: num_atual = reg_num.le_registro(linha, 4) usina_atual = reg_usina.le_registro(linha, 8) subsis_atual = reg_subsis.le_registro(linha, 19) # Lê as propriedades existentes em todas as linhas numeros.append(num_atual) usinas.append(usina_atual) subsistemas.append(subsis_atual) estagios.append(reg_estagio.le_registro(linha, 26)) tabela[i, :] = reg_valores.le_linha_tabela(linha, 34, 1, 9) i += 1
def le(self, arq: IO): def converte_tabela_para_df() -> pd.DataFrame: df = pd.DataFrame(tabela) cols = [ "Mercado", "Bacia", "Cbomba", "Ghid", "Gter", "GterAT", "Deficit", "Compra", "Venda", "Itaipu50", "Itaipu60" ] df.columns = cols df["Subsistema"] = subsistemas df = df[["Subsistema"] + cols] return df # Variáveis auxiliares reg_tabela = RegistroFn(7) str_subsis = " Subsistema" str_medio = " Medio" subsis = "FC" subsistemas = [] # Salta uma linha e extrai a semana tabela = np.zeros((MAX_ESTAGIOS * MAX_SUBSISTEMAS, 11)) i = 0 while True: linha = arq.readline() # Verifica se acabou if BlocoBalancoEnergeticoRelato.str_fim in linha: tabela = tabela[:i, :] self._dados = converte_tabela_para_df() break # Senão, procura a linha que identifica o subsistema if str_subsis in linha: subsis = linha.split(str_subsis)[1][:3].strip() # Se está lendo um subsistema e achou a linha de valores médios if subsis != "FC" and str_medio in linha: subsistemas.append(subsis) tabela[i, :9] = reg_tabela.le_linha_tabela(linha, 10, 1, 9) # TODO - Começar a ler a interligação # Para o SE, lê as gerações de Itaipu50 e Itaipu60 if subsis == "SE": tabela[i, 9:] = reg_tabela.le_linha_tabela(linha, 96, 1, 2) # Reseta o indicador de subsistema subsis = "FC" i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: colunas = [ "GT Min Pat 1", "GT Max Pat 1", "Custo GT Pat 1", "GT Min Pat 2", "GT Max Pat 2", "Custo GT Pat 2", "GT Min Pat 3", "GT Max Pat 3", "Custo GT Pat 3" ] df = pd.DataFrame(tabela, columns=colunas) df["Código"] = numeros df["Usina"] = usinas df["Subsistema"] = subsistemas df["Estágio"] = estagios df = df[["Código", "Usina", "Subsistema", "Estágio"] + colunas] return df # Pula 4 linhas for _ in range(4): arq.readline() # Variáveis auxiliares reg_num = RegistroIn(3) reg_nome = RegistroAn(10) reg_subsis = RegistroAn(6) reg_estagio = RegistroIn(7) reg_valores = RegistroFn(7) numeros: List[int] = [] usinas: List[str] = [] subsistemas: List[str] = [] estagios: List[int] = [] tabela = np.zeros((2000, 9)) numero_atual = 0 usina_atual = "" subsistema_atual = "" i = 0 while True: linha: str = arq.readline() if BlocoDadosUsinasRelGNL.str_fim in linha: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break if linha[4:7].strip().isnumeric(): numero_atual = reg_num.le_registro(linha, 4) if len(linha[8:18].strip()) > 0: usina_atual = reg_nome.le_registro(linha, 8) if len(linha[19:26].strip()) > 0: subsistema_atual = reg_subsis.le_registro(linha, 19) numeros.append(numero_atual) usinas.append(usina_atual) subsistemas.append(subsistema_atual) estagios.append(reg_estagio.le_registro(linha, 26)) tabela[i, :] = reg_valores.le_linha_tabela(linha, 34, 1, 9) i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: df = pd.DataFrame(tabela) cols = ["Inicial" ] + [f"Estágio {s}" for s in range(1, n_semanas + 1)] df.columns = cols df["Usina"] = usinas df["Número"] = numeros df = df[["Número", "Usina"] + cols] return df # Salta duas linhas arq.readline() arq.readline() # Descobre o número de semanas linha = arq.readline() sems = [ s for s in linha.split(" ") if (len(s) > 0 and ("Sem" in s or "Mes" in s)) ] reg_usina = RegistroAn(12) reg_numero = RegistroIn(4) reg_vol = RegistroFn(6) n_semanas = len(sems) usinas: List[str] = [] numeros: List[int] = [] tabela = np.zeros((300, n_semanas + 1)) # Salta outra linha arq.readline() i = 0 while True: # Confere se a leitura não acabou linha = arq.readline() if "X-------X" in linha: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break # Senão, lê mais uma linha # Subsistema e REE numero = reg_numero.le_registro(linha, 4) usina = reg_usina.le_registro(linha, 9) numeros.append(numero) usinas.append(usina) # Semanas tabela[i, :] = reg_vol.le_linha_tabela(linha, 23, 1, n_semanas + 1) i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: colunas = ["Pat 1", "Pat 2", "Pat 3"] df = pd.DataFrame(tabela, columns=colunas) df["Código"] = numeros df["Usina"] = usinas df["Lag"] = lags df["Subsistema"] = subsistemas df["Período"] = periodos df = df[["Código", "Usina", "Lag", "Subsistema", "Período"] + colunas] return df # Pula 4 linhas for _ in range(4): arq.readline() # Variáveis auxiliares reg_num = RegistroIn(3) reg_nome = RegistroAn(10) reg_subsis = RegistroAn(6) reg_lag = RegistroIn(3) reg_periodo = RegistroIn(9) reg_valores = RegistroFn(10) numeros: List[int] = [] usinas: List[str] = [] subsistemas: List[str] = [] periodos: List[int] = [] lags: List[int] = [] tabela = np.zeros((2000, 3)) i = 0 while True: linha: str = arq.readline() if len(linha) < 3: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break numeros.append(reg_num.le_registro(linha, 3)) usinas.append(reg_nome.le_registro(linha, 8)) lags.append(reg_lag.le_registro(linha, 20)) subsistemas.append(reg_subsis.le_registro(linha, 24)) periodos.append(reg_periodo.le_registro(linha, 31)) tabela[i, :] = reg_valores.le_linha_tabela(linha, 41, 1, 3) i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: df = pd.DataFrame(tabela) cols = [f"Estágio {s}" for s in range(1, n_semanas + 1)] df.columns = cols df["Subsistema"] = subsistemas df["Patamar"] = patamares df = df[["Subsistema", "Patamar"] + cols] return df # Salta uma linha arq.readline() # Descobre o número de semanas linha = arq.readline() sems = [ s for s in linha.split(" ") if (len(s) > 0 and ("Sem" in s or "Mes" in s)) ] reg_pat = RegistroAn(6) reg_cmo = RegistroFn(10) n_semanas = len(sems) subsistemas: List[str] = [] patamares: List[str] = [] tabela = np.zeros((4 * len(SUBSISTEMAS), n_semanas)) # Salta outra linha arq.readline() i = 0 while True: # Confere se a leitura não acabou linha = arq.readline() if "X------X" in linha: self._dados = converte_tabela_em_df() break # Senão, lê mais uma linha # Subsistema e patamar ssis = SUBSISTEMAS[int(i / 4)] str_pat = reg_pat.le_registro(linha, 4) pat = "Médio" if "Med" in str_pat else str_pat.split("_")[1] subsistemas.append(ssis) patamares.append(pat) # Semanas tabela[i, :] = reg_cmo.le_linha_tabela(linha, 11, 1, n_semanas) i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: cols = [ "Patamar 1", "Mercado 1", "Patamar 2", "Mercado 2", "Patamar 3", "Mercado 3" ] df = pd.DataFrame(tabela, columns=cols) df["Estágio"] = estagios df["Subsistema"] = subsistemas df = df[["Estágio", "Subsistema"] + cols] return df # Salta as linhas de cabeçalho for _ in range(4): arq.readline() reg_estagio = RegistroIn(9) reg_subsis = RegistroAn(6) reg_valores = RegistroFn(9) estagios: List[int] = [] subsistemas: List[str] = [] tabela = np.zeros((100, 6)) i = 0 estagio_atual = 0 while True: # Confere se a leitura não acabou linha = arq.readline() if "X---------X------X" in linha: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break # Senão, lê mais uma linha # Verifica se começa um novo estágio na linha if len(linha[4:13].strip()) > 0: estagio_atual = reg_estagio.le_registro(linha, 4) # Lê as propriedades existentes em todas as linhas estagios.append(estagio_atual) subsistemas.append(reg_subsis.le_registro(linha, 14)) tabela[i, :] = reg_valores.le_linha_tabela(linha, 21, 1, 6) i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: cols = [f"Estágio {i}" for i in range(1, n_semanas + 1)] df = pd.DataFrame(tabela, columns=cols) df["Código"] = numeros df["Usina"] = usinas df = df[["Código", "Usina"] + cols] return df # Salta uma linha arq.readline() # Descobre o número de estágios linha = arq.readline() sems = [ s for s in linha.split(" ") if (len(s) > 0 and ("Sem" in s or "Mes" in s)) ] n_semanas = len(sems) reg_num = RegistroIn(3) reg_usina = RegistroAn(12) reg_valores = RegistroFn(6) numeros: List[int] = [] usinas: List[str] = [] tabela = np.zeros((300, n_semanas)) # Salta outra linha arq.readline() i = 0 while True: # Confere se a leitura não acabou linha = arq.readline() if "X---X------------X" in linha: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break # Senão, lê mais uma linha numeros.append(reg_num.le_registro(linha, 4)) usinas.append(reg_usina.le_registro(linha, 8)) tabela[i, :] = reg_valores.le_linha_tabela(linha, 21, 1, n_semanas) i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: df = pd.DataFrame(tabela) cols = ["Inicial" ] + [f"Estágio {s}" for s in range(1, n_semanas + 1)] df.columns = cols df["Subsistema"] = subsistemas df = df[["Subsistema"] + cols] return df # Salta uma linha arq.readline() # Descobre o número de semanas linha = arq.readline() sems = [ s for s in linha.split(" ") if (len(s) > 0 and ("Sem" in s or "Mes" in s)) ] reg_ssis = RegistroAn(12) reg_earm = RegistroFn(6) n_semanas = len(sems) subsistemas: List[str] = [] tabela = np.zeros((MAX_SUBSISTEMAS, n_semanas + 1)) # Salta outra linha arq.readline() i = 0 while True: # Confere se a leitura não acabou linha = arq.readline() if "X------------X" in linha: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break # Senão, lê mais uma linha # Subsistema e REE ssis = reg_ssis.le_registro(linha, 4) subsistemas.append(ssis) # Semanas tabela[i, :] = reg_earm.le_linha_tabela(linha, 23, 1, n_semanas + 1) i += 1
def le(self, arq: IO): def converte_tabela_para_df() -> pd.DataFrame: cols = [ "Volume Ini (% V.U)", "Volume Fin (% V.U)", "Volume Esp. (% V.U)", "Qnat (m3/s)", "Qnat (% MLT)", "Qafl (m3/s)", "Qdef (m3/s)", "Geração Pat 1", "Geração Pat 2", "Geração Pat 3", "Geração Média", "Vertimento Turbinável", "Vertimento Não-Turbinável", "Ponta", "FPCGC" ] df = pd.DataFrame(tabela, columns=cols) cols_adic = [ "Código", "Usina", "Evaporação", "Tempo de Viagem", "Cota Abaixo da Crista do Vert", "Def. Mínima = 0" ] df["Código"] = numeros df["Usina"] = usinas df["Evaporação"] = evaporacao df["Tempo de Viagem"] = tv_afluencia df["Cota Abaixo da Crista do Vert"] = cota_abaixo_crista df["Def. Mínima = 0"] = def_minima_zero df = df[cols_adic + cols] return df def le_se_tem_valor(digitos: int, linha: str, coluna_inicio: int): coluna_fim = coluna_inicio + digitos trecho = linha[coluna_inicio:coluna_fim].strip() valor = None if len(trecho) > 0 and "---" not in trecho: reg = RegistroFn(digitos) valor = reg.le_registro(linha, coluna_inicio) else: valor = np.nan return valor # Salta duas linhas arq.readline() arq.readline() # Variáveis auxiliares reg_numero = RegistroIn(4) reg_usina = RegistroAn(12) reg_flags = RegistroAn(4) reg_volume = RegistroFn(5) reg_tabela = RegistroFn(7) numeros: List[int] = [] usinas: List[str] = [] evaporacao: List[bool] = [] tv_afluencia: List[bool] = [] cota_abaixo_crista: List[bool] = [] def_minima_zero: List[bool] = [] # Salta uma linha e extrai a semana tabela = np.zeros((300, 15)) i = 0 while True: linha: str = arq.readline() # Verifica se acabou if BlocoRelatorioOperacaoUHERelato.str_fim in linha: tabela = tabela[:i, :] self._dados = converte_tabela_para_df() break numeros.append(reg_numero.le_registro(linha, 4)) usinas.append(reg_usina.le_registro(linha, 9)) flags = reg_flags.le_registro(linha, 22) evaporacao.append("#" in flags) tv_afluencia.append("*" in flags) cota_abaixo_crista.append("@" in flags) def_minima_zero.append("$" in flags) tem_volume = len(linha[27:33].strip()) > 0 if tem_volume: tabela[i, :3] = reg_volume.le_linha_tabela(linha, 27, 1, 3) else: tabela[i, :3] = np.nan tabela[i, 3] = le_se_tem_valor(7, linha, 45) tabela[i, 4] = le_se_tem_valor(6, linha, 54) tabela[i, 5] = le_se_tem_valor(7, linha, 63) tabela[i, 6:11] = reg_tabela.le_linha_tabela(linha, 72, 5, 1) tabela[i, 11] = le_se_tem_valor(7, linha, 112) tabela[i, 12] = le_se_tem_valor(7, linha, 120) tabela[i, 13] = le_se_tem_valor(7, linha, 128) tabela[i, 14] = le_se_tem_valor(7, linha, 136) i += 1