Files
jean_app/processar.py
2025-06-01 16:44:49 -03:00

261 lines
10 KiB
Python
Executable File

import os
import pandas as pd
import numpy as np
from time import sleep
##---------------------
def listar_pastas(diretorio):
pastas = [nome for nome in os.listdir(diretorio) if os.path.isdir(os.path.join(diretorio, nome))]
return pastas
def processar_linha(row):
valor = str(row['VALOR']).replace(',', '.')
try:
valor = float(valor)
except:
valor = -10
return valor
def completar_com_valores_menos_um(dados, estacao, output):
print("completar valores com -1 1980 -2024")
dados_df = pd.read_csv(dados, sep=';', decimal='.', parse_dates=['DATA'], dayfirst=True)
dados_df['CODIGO'] = dados_df['CODIGO'].astype(int)
start_date = '1980-01-01'
end_date = '2024-12-31'
filtered_df = dados_df[(dados_df['DATA'] >= start_date) & (dados_df['DATA'] <= end_date)]
dados_df=filtered_df
dados_df.head(2)
estacao_df = pd.read_csv(estacao, encoding='utf-8', sep=';', decimal='.')
estacao_df.head(2)
# Filtrar colunas que terminam com 'c' e começam com um número
colunas_c = [col for col in estacao_df.columns if col.endswith('c') and col[:-1].isdigit()]
# Exibir resultado
colunas_c=len(colunas_c)
log_info = []
# Variável booleana para verificar se encontrou somente valores <= -1
somente_valores_menores_ou_igual_a_menos_um = False
# Variáveis para armazenar o último código e valor encontrados
ultimo_codigo_achado = 0
ultimo_valor_atualizado = 0
# Copiar dados_df para uma variável para atualização
AtualizaDados = dados_df.copy()
AtualizaDados['CODIGO'] = AtualizaDados['CODIGO'].astype(int)
# Caminho do arquivo de log no diretório atual
log_file_path = os.path.join(os.getcwd(), output+'.txt')
# Abrir o arquivo de log para escrita
total = len(AtualizaDados)
AtualizaDados['VALOR'] = AtualizaDados.apply(processar_linha, axis=1)
with open(log_file_path, 'w') as log_file:
# Iterar sobre AtualizaDados para atualizar os valores
for index, row in enumerate(AtualizaDados.itertuples(index=False)):
print(f"\rProcessando linha {index+1}/{total}", end='')
valor = row.VALOR
data = row.DATA
if valor <= -1:
log_file.write(f"Código: {row.CODIGO}, Data: {row.DATA}, Valor: {valor}\n")
codigo_filtrado = int(row.CODIGO)
linhas_filtradas = estacao_df.loc[estacao_df['CODIGO'] == codigo_filtrado]
# Iterar sobre os códigos próximos (1codigo, 2codigo, 3codigo)
for i in range(1, colunas_c): # Considerando as três primeiras colunas de códigos
codigo_proximo = linhas_filtradas[f'{i}c'].iloc[0]
filtro = (dados_df['CODIGO'] == codigo_proximo) & (dados_df['DATA'] == data)
valor_proximo = dados_df.loc[filtro, 'VALOR'].values
log_file.write(f"{i}codigo: {codigo_proximo} Valor: {valor_proximo}\n")
if len(valor_proximo) > 0:
try:
valor_num = float(valor_proximo[0].replace(',', '.')) # Converte para número
if valor_num > -1:
AtualizaDados.loc[index, 'VALOR'] = valor_num
ultimo_codigo_achado = codigo_proximo
ultimo_valor_atualizado = valor_num
log_file.write(f"Valor atual {row.VALOR} - Valor atualizado para: {valor_num}\n")
break # Parar o loop se encontrar um valor válido
except ValueError:
log_file.write(f"****Erro ao converter valor_proximo: {valor_proximo[0]}\n")
# Caso não encontre um valor válido
log_file.write(f"****Não achou o valor \n")
somente_valores_menores_ou_igual_a_menos_um = True
log_info.append({
'CODIGO': int(row.CODIGO),
'DATA': row.DATA,
'VALOR': valor,
'ULTIMO_CODIGO_ACHADO': ultimo_codigo_achado,
'ULTIMO_VALOR_ATUALIZADO': ultimo_valor_atualizado
})
log_file.write("---------------------------------------------------\n")
# Criar DataFrame com as informações do log e salvar em um CSV
log_df = pd.DataFrame(log_info)
log_df.to_csv(output+'-valores de origem .csv', sep=";", encoding='utf-8', decimal=',', index=False)
# Exibir mensagem após completar o processo
print("Dados atualizados:")
AtualizaDados['CODIGO'] = AtualizaDados['CODIGO'].astype(int)
AtualizaDados.to_csv(output, sep=";", encoding='utf-8', decimal=',', index=False)
#print(AtualizaDados)
return somente_valores_menores_ou_igual_a_menos_um
#df.to_csv(output_csv, sep=";", encoding='utf-8', decimal=',', index=False)
def completar_com_valores_menos_um_back(dados, estacao, output):
print("completar valores com -1 1980 -2024")
dados_df = pd.read_csv(dados, sep=';', decimal='.', parse_dates=['DATA'], dayfirst=True)
start_date = '1980-01-01'
end_date = '2024-12-31'
filtered_df = dados_df[(dados_df['DATA'] >= start_date) & (dados_df['DATA'] <= end_date)]
dados_df=filtered_df
dados_df.head(2)
estacao_df = pd.read_csv(estacao, encoding='utf-8', sep=';', decimal='.')
estacao_df.head(2)
log_info = []
# Variável booleana para verificar se encontrou somente valores <= -1
somente_valores_menores_ou_igual_a_menos_um = False
# Variáveis para armazenar o último código e valor encontrados
ultimo_codigo_achado = None
ultimo_valor_atualizado = None
# Copiar dados_df para uma variável para atualização
AtualizaDados = dados_df.copy()
# Caminho do arquivo de log no diretório atual
log_file_path = os.path.join(os.getcwd(), output+'.txt')
# Abrir o arquivo de log para escrita
total = len(AtualizaDados)
with open(log_file_path, 'w') as log_file:
# Iterar sobre AtualizaDados para atualizar os valores
for index, row in AtualizaDados.iterrows():
print(f"\rProcessando linha {index+1}/{total}", end='')
valor_str = row['VALOR'].replace(',', '.') # Substitui vírgula por ponto
try:
valor = float(valor_str) # Converte para número
except ValueError:
print(f"Erro ao converter o valor: {row['VALOR']}")
valor = -1 # Define um valor padrão ou trata o erro de outra forma
data = row['DATA']
if valor <= -1:
log_file.write(f"Código: {row['CODIGO']}, Data: {row['DATA']}, Valor: {valor}\n")
codigo_filtrado = row['CODIGO']
linhas_filtradas = estacao_df.loc[estacao_df['CODIGO'] == codigo_filtrado]
# Iterar sobre os códigos próximos (1codigo, 2codigo, 3codigo)
for i in range(1, 11): # Considerando as três primeiras colunas de códigos
codigo_proximo = linhas_filtradas[f'{i}c'].iloc[0]
filtro = (dados_df['CODIGO'] == codigo_proximo) & (dados_df['DATA'] == data)
valor_proximo = dados_df.loc[filtro, 'VALOR'].values
log_file.write(f"{i}codigo: {codigo_proximo} Valor: {valor_proximo}\n")
if len(valor_proximo) > 0:
try:
valor_num = float(valor_proximo[0].replace(',', '.')) # Converte para número
if valor_num > -1:
AtualizaDados.loc[index, 'VALOR'] = valor_num
ultimo_codigo_achado = codigo_proximo
ultimo_valor_atualizado = valor_num
log_file.write(f"Valor atual {row['VALOR']} - Valor atualizado para: {valor_num}\n")
break # Parar o loop se encontrar um valor válido
except ValueError:
log_file.write(f"****Erro ao converter valor_proximo: {valor_proximo[0]}\n")
# Caso não encontre um valor válido
log_file.write(f"****Não achou o valor \n")
somente_valores_menores_ou_igual_a_menos_um = True
log_info.append({
'CODIGO': row['CODIGO'],
'DATA': row['DATA'],
'VALOR': valor,
'ULTIMO_CODIGO_ACHADO': ultimo_codigo_achado,
'ULTIMO_VALOR_ATUALIZADO': ultimo_valor_atualizado
})
log_file.write("---------------------------------------------------\n")
# Criar DataFrame com as informações do log e salvar em um CSV
log_df = pd.DataFrame(log_info)
log_df.to_csv(output+'-valores de origem .csv', sep=";", encoding='utf-8', decimal=',', index=False)
# Exibir mensagem após completar o processo
print("Dados atualizados:")
AtualizaDados.to_csv(output, sep=";", encoding='utf-8', decimal=',', index=False)
#print(AtualizaDados)
return somente_valores_menores_ou_igual_a_menos_um
#df.to_csv(output_csv, sep=";", encoding='utf-8', decimal=',', index=False)
def processar_arquivos_com_menos_um():
print("Carregando arquivo...")
diretorio = 'data' # nome da pasta principal
pastas = listar_pastas(diretorio)
destino= "20dadosmenosum"
if not os.path.exists(destino):
os.makedirs(destino)
print(f"Pasta '{destino}' criada.")
for pasta in pastas:
print(f"Encontrada pasta: {pasta}")
estacao = f"./11estacaoproxima/proxima_{pasta}.csv"
dados = f"./01processados/{pasta}_dados.csv"
output=f"./{destino}/{pasta}_processada.csv"
completar_com_valores_menos_um(dados, estacao, output)
sleep(3)