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["REE"] = rees df = df[["Subsistema", "REE"] + 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_ree = RegistroAn(12) reg_ssis = RegistroIn(4) n_semanas = len(sems) rees: List[str] = [] subsistemas: List[int] = [] tabela = np.zeros((MAX_REES, 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 ree = reg_ree.le_registro(linha, 4) ssis = reg_ssis.le_registro(linha, 22) - 1 rees.append(ree) subsistemas.append(ssis) # Semanas ci = 28 for col in range(n_semanas + 1): cf = ci + 6 conteudo = linha[ci:cf].strip() if not conteudo.replace(".", "0").isnumeric(): tabela[i, col] = np.nan else: tabela[i, col] = float(conteudo) ci = cf + 1 i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: df = pd.DataFrame() df["Estágio"] = estagios df["Cenário"] = cenarios df["Restrição"] = restricoes df["Violação"] = violacoes df["Unidade"] = unidades return df # Salta uma linha arq.readline() reg_estagio = RegistroIn(8) reg_cenario = RegistroIn(8) reg_restricao = RegistroAn(76) reg_violacao = RegistroAn(22) estagios: List[int] = [] cenarios: List[int] = [] restricoes: List[str] = [] violacoes: List[float] = [] unidades: List[str] = [] while True: # Confere se a leitura não acabou linha = arq.readline() if len(linha.strip()) < 5: self._dados = converte_tabela_em_df() break # Senão, lê mais uma linha estagios.append(reg_estagio.le_registro(linha, 4)) cenarios.append(reg_cenario.le_registro(linha, 13)) restricoes.append(reg_restricao.le_registro(linha, 22)) viol = reg_violacao.le_registro(linha, 99) violacao = float(viol.strip().split(" ")[0]) unidade = viol.strip().split(" ")[1] violacoes.append(violacao) unidades.append(unidade)
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: 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): reg_codigo = RegistroIn(3) reg_subsis = RegistroIn(2) reg_nome = RegistroAn(10) reg_estagio = RegistroIn(2) reg_inflex = RegistroFn(5) reg_disp = RegistroFn(5) reg_cvu = RegistroFn(10) self._dados[0] = reg_codigo.le_registro(self._linha, 4) self._dados[1] = reg_subsis.le_registro(self._linha, 9) self._dados[2] = reg_nome.le_registro(self._linha, 14) self._dados[3] = reg_estagio.le_registro(self._linha, 24) for j in range(3): self._dados[4 + 3 * j] = reg_inflex.le_registro(self._linha, 29 + 20 * j) self._dados[5 + 3 * j] = reg_disp.le_registro(self._linha, 34 + 20 * j) self._dados[6 + 3 * j] = reg_cvu.le_registro(self._linha, 39 + 20 * j)
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): reg_cod = RegistroIn(3) reg_subsistema = RegistroIn(2) reg_estagio = RegistroIn(2) reg_geracao = RegistroFn(10) reg_duracao = RegistroFn(5) reg_data = RegistroAn(8) self._dados[0] = reg_cod.le_registro(self._linha, 4) self._dados[1] = reg_subsistema.le_registro(self._linha, 9) self._dados[2] = reg_estagio.le_registro(self._linha, 14) self._dados[3] = reg_geracao.le_registro(self._linha, 19) if len(self._linha[29:34].strip()) > 0: self._dados[4] = reg_duracao.le_registro(self._linha, 29) self._dados[5] = reg_geracao.le_registro(self._linha, 34) if len(self._linha[44:49].strip()) > 0: self._dados[6] = reg_duracao.le_registro(self._linha, 44) self._dados[7] = reg_geracao.le_registro(self._linha, 49) if len(self._linha[59:64].strip()) > 0: self._dados[8] = reg_duracao.le_registro(self._linha, 59) self._dados[9] = reg_data.le_registro(self._linha, 65)
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: df = pd.DataFrame(tabela) cols = [ "Despacho Pat. 1", "Duração Pat. 1", "Despacho Pat. 2", "Duração Pat. 2", "Despacho Pat. 3", "Duração Pat. 3", "Custo" ] df.columns = cols df["Subsistema"] = subsistemas df["Usina"] = usinas df["Lag"] = lags df["Estágio"] = semanas df["Início Semana"] = inicio_semanas df = df[["Subsistema", "Usina", "Lag", "Estágio", "Início Semana"] + cols] return df # Variáveis auxiliares str_tabela = "Sinalizacao de Despacho antecipado em k meses" reg_subsis = RegistroAn(3) reg_usina = RegistroAn(11) reg_lag = RegistroIn(7) reg_semana = RegistroAn(7) reg_despacho = RegistroFn(8) reg_duracao = RegistroFn(7) reg_custo = RegistroFn(10) reg_inicio = RegistroAn(12) subsistemas = [] usinas = [] lags = [] semanas = [] inicio_semanas = [] # Salta uma linha e extrai a semana tabela = np.zeros((MAX_ESTAGIOS * 10, 7)) i = 0 achou_tabela = False while True: linha = arq.readline() # Verifica se acabou if BlocoRelatorioOperacaoRelGNL.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_tabela in linha: achou_tabela = True # Salta 4 linhas for _ in range(4): arq.readline() elif len(linha) < 5: achou_tabela = False # Se está lendo um subsistema e achou a linha de valores médios elif achou_tabela: subsistemas.append(reg_subsis.le_registro(linha, 4)) usinas.append(reg_usina.le_registro(linha, 8)) lags.append(reg_lag.le_registro(linha, 20)) semanas.append(reg_semana.le_registro(linha, 28)) inicio_semanas.append(reg_inicio.le_registro(linha, 98)) tabela[i, 0] = reg_despacho.le_registro(linha, 36) tabela[i, 1] = reg_duracao.le_registro(linha, 44) tabela[i, 2] = reg_despacho.le_registro(linha, 53) tabela[i, 3] = reg_duracao.le_registro(linha, 61) tabela[i, 4] = reg_despacho.le_registro(linha, 70) tabela[i, 5] = reg_duracao.le_registro(linha, 78) tabela[i, 6] = reg_custo.le_registro(linha, 87) i += 1
def le(self, arq: IO): def converte_tabela_em_df() -> pd.DataFrame: colunas = [ "Iteração", "Zinf", "Zsup", "Gap (%)", "Tempo (s)", "Tot. Def. Demanda (MWmed)", "Tot. Def. Niv. Seg. (MWmes)", "Num. Inviab", "Tot. Inviab (MWmed)", "Tot. Inviab (m3/s)", "Tot. Inviab (Hm3)" ] tipos = { "Iteração": np.int64, "Zinf": np.float64, "Zsup": np.float64, "Gap (%)": np.float64, "Tempo (s)": np.int64, "Tot. Def. Demanda (MWmed)": np.float64, "Tot. Def. Niv. Seg. (MWmes)": np.float64, "Num. Inviab": np.int64, "Tot. Inviab (MWmed)": np.float64, "Tot. Inviab (m3/s)": np.float64, "Tot. Inviab (Hm3)": np.float64 } df = pd.DataFrame(tabela, columns=colunas) df = df.astype(tipos) return df # Salta 9 linhas linha for _ in range(9): arq.readline() reg_iter = RegistroIn(4) reg_z = RegistroFn(12) reg_gap = RegistroFn(16) reg_tempo = RegistroAn(8) reg_def_demanda = RegistroFn(10) reg_def_niv_seg = RegistroFn(12) reg_num_inviab = RegistroIn(7) reg_tot_inviab = RegistroFn(12) tabela = np.zeros((999, 11)) i = 0 while True: # Confere se a leitura não acabou linha = arq.readline() if len(linha) < 5: tabela = tabela[:i, :] self._dados = converte_tabela_em_df() break if "----" in linha: continue # Senão, lê mais uma linha tabela[i, 0] = reg_iter.le_registro(linha, 4) if "*" in linha[9:21]: tabela[i, 1] = np.nan else: tabela[i, 1] = reg_z.le_registro(linha, 9) if "*" in linha[22:34]: tabela[i, 2] = np.nan else: tabela[i, 2] = reg_z.le_registro(linha, 22) tabela[i, 3] = reg_gap.le_registro(linha, 35) tempo = reg_tempo.le_registro(linha, 52) parcelas = tempo.split(":") segundos = (int(parcelas[0]) * 3600 + int(parcelas[1]) * 60 + int(parcelas[2])) tabela[i, 4] = segundos tabela[i, 5] = reg_def_demanda.le_registro(linha, 61) if str(linha[72:85]).isnumeric(): tabela[i, 6] = reg_def_niv_seg.le_registro(linha, 72) else: tabela[i, 6] = np.nan tabela[i, 7] = reg_num_inviab.le_registro(linha, 85) tabela[i, 8] = reg_tot_inviab.le_registro(linha, 93) tabela[i, 9] = reg_tot_inviab.le_registro(linha, 106) tabela[i, 10] = reg_tot_inviab.le_registro(linha, 119) 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