Files
jean_app/classificacao_veranicos.py
2025-02-08 22:59:52 -03:00

192 lines
7.9 KiB
Python

import os
import pandas as pd
import numpy as np
from time import sleep
from datetime import datetime
import csv
def listar_csvs(diretorio):
arquivos_csv = [nome for nome in os.listdir(diretorio) if nome.endswith('.csv') and os.path.isfile(os.path.join(diretorio, nome))]
return arquivos_csv
def processar_Classificao_Veranicos():
print("processar classificacao veranicos..")
diretorio = 'classificacao_veranicos' # nome da pasta principal
files = listar_csvs(diretorio)
decendio = carregar_decendios('decendio.csv')
for file in files:
print(f"Encontrada pasta: {file}")
qtd_veranicos,cod_estacao = carregar_estacao_com_veranico(file)
print(cod_estacao)
rodar_decendio(decendio,qtd_veranicos, cod_estacao)
from datetime import datetime
def diferenca_dias(data1, data2):
formato = "%Y-%m-%d"
# Converter para string se for Timestamp
if not isinstance(data1, str):
data1 = data1.strftime(formato)
if not isinstance(data2, str):
data2 = data2.strftime(formato)
# Verificar se as datas são válidas
if not data1 or not data2:
print(f"Erro: Data inválida -> data1: {data1}, data2: {data2}")
return None
try:
d1 = datetime.strptime(data1, formato)
d2 = datetime.strptime(data2, formato)
return (d2 - d1).days
except ValueError as e:
print(f"Erro ao converter datas: {data1}, {data2} - {e}")
return None
def rodar_decendio(decendios,qtd_veranicos, estacoes):
print("Decendio...")
estacoes= [2244035]
#decendios = decendios.head(24)
resultados = []
for estacao in estacoes: # percorre todas as estações array de estacoes
#estacao_fitrada = qtd_veranicos['CODIGO'] == estacao
estacao_fitrada = qtd_veranicos[qtd_veranicos['CODIGO'] == estacao]
estacao_fitrada = estacao_fitrada.head(10)
for index, selecao_estacao in estacao_fitrada.iterrows(): # Itera pelas linhas do DataFrame
data_inicio = pd.to_datetime(selecao_estacao['INICIO'])
data_fim = pd.to_datetime(selecao_estacao['FINAL'])
filtro = decendios[(decendios['INICIO'] <= data_fim) & (decendios['FINAL'] >= data_inicio)]
dia =selecao_estacao['QTDDIAS']
filtro = filtro.copy() # Para evitar avisos do Pandas
filtro['dias_chuva'] = 0
filtro['dias_decendio'] = 0
diferenca=diferenca_dias(data_inicio, data_fim)
quantidade_veranicos = len(filtro) # Conta o número de linhas
print(index,"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -")
print ('estacao: ',selecao_estacao , 'data_inicio' , '--- ', data_fim ,' Qtd Dias: ', diferenca)
if quantidade_veranicos <=0:
print(f"Tem algum problema registros ({quantidade_veranicos} linhas).")
elif quantidade_veranicos <= 1:
print(f"Tem mais de 1 registros ({quantidade_veranicos} linhas).")
filtro.loc[filtro.index[0], 'dias_chuva'] = diferenca_dias(data_inicio, data_fim)+1
filtro.loc[filtro.index[0], 'dias_decendio'] =diferenca_dias(filtro.iloc[0]['INICIO'], filtro.iloc[0]['FINAL'])+1
elif quantidade_veranicos <= 2:
print(f"Tem mais de 2 registros ({quantidade_veranicos} linhas).")
filtro.loc[filtro.index[0], 'dias_chuva'] = diferenca_dias(data_inicio, filtro.iloc[0]['FINAL'])+1
filtro.loc[filtro.index[1], 'dias_chuva'] = diferenca_dias(filtro.iloc[1]['INICIO'], data_fim)+1
filtro.loc[filtro.index[0], 'dias_decendio'] =diferenca_dias(filtro.iloc[0]['INICIO'], filtro.iloc[0]['FINAL'])+1
filtro.loc[filtro.index[1], 'dias_decendio'] =diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL'])+1
elif quantidade_veranicos <= 3:
print(f"Tem mais de 3 registros ({quantidade_veranicos} linhas).")
filtro.loc[filtro.index[0], 'dias_chuva'] = diferenca_dias(data_inicio, filtro.iloc[0]['FINAL'])+1
filtro.loc[filtro.index[1], 'dias_chuva'] = diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL']) +1
filtro.loc[filtro.index[2], 'dias_chuva'] = diferenca_dias(filtro.iloc[2]['INICIO'], data_fim)+1
filtro.loc[filtro.index[0], 'dias_decendio'] =diferenca_dias(filtro.iloc[0]['INICIO'], filtro.iloc[0]['FINAL'])+1
filtro.loc[filtro.index[1], 'dias_decendio'] =diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL'])+1
filtro.loc[filtro.index[2], 'dias_decendio'] =diferenca_dias(filtro.iloc[2]['INICIO'], filtro.iloc[2]['FINAL'])+1
elif quantidade_veranicos <= 4:
print(f"Tem mais de 4 registros ({quantidade_veranicos} linhas).")
filtro.loc[filtro.index[0], 'dias_chuva'] = diferenca_dias(data_inicio, filtro.iloc[0]['FINAL'])
filtro.loc[filtro.index[1], 'dias_chuva'] = diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL'])
filtro.loc[filtro.index[2], 'dias_chuva'] = diferenca_dias(filtro.iloc[2]['INICIO'], filtro.iloc[2]['FINAL'])
filtro.loc[filtro.index[3], 'dias_chuva'] = diferenca_dias(filtro.iloc[3]['INICIO'], data_fim)+1
filtro.loc[filtro.index[0], 'dias_decendio'] =diferenca_dias(filtro.iloc[0]['INICIO'], filtro.iloc[0]['FINAL'])+1
filtro.loc[filtro.index[1], 'dias_decendio'] =diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL'])+1
filtro.loc[filtro.index[2], 'dias_decendio'] =diferenca_dias(filtro.iloc[2]['INICIO'], filtro.iloc[2]['FINAL'])+1
filtro.loc[filtro.index[3], 'dias_decendio'] =diferenca_dias(filtro.iloc[3]['INICIO'], filtro.iloc[3]['FINAL'])+1
print(filtro)
dados = []
# print('->', selecao_estacao)
for index, row in filtro.iterrows():
dados.append({
'CODIGO': selecao_estacao['CODIGO'],
'DECENDIO': row['DECENDIO'],
'AMPLITUDE': row['dias_chuva']
})
print('************************************************************')
resultados.append(pd.DataFrame(dados))
if os.path.exists('saida.csv'): os.remove('saida.csv')
pd.concat(resultados, ignore_index=True).to_csv('saida.csv', sep=';', encoding='utf-8', index=False)
def transformar_decendio():
df = pd.read_csv("saida.csv", sep=";")
# Transformar a tabela para o formato desejado
df_pivot = df.pivot(index="CODIGO", columns="DECENDIO", values="AMPLITUDE")
# Resetar o índice para salvar corretamente
df_pivot.reset_index(inplace=True)
# Salvar o resultado no CSV
df_pivot.to_csv("saida_transformado.csv", sep=";", encoding="utf-8", index=False)
def carregar_decendios(file):
print("Abrindo arquivo decendio.")
dados_df = pd.read_csv(file, sep=';', decimal=',', parse_dates=['INICIO', 'FINAL'], dayfirst=True)
start_date = '1980-01-01'
end_date = '2022-12-31'
filtered_df = dados_df[(dados_df['INICIO'] >= start_date) & (dados_df['FINAL'] <= end_date)]
dados_df=filtered_df
#dados_df.to_csv('-valores de origem .csv', sep=";", encoding='utf-8', decimal=',', index=False)
return dados_df
def carregar_estacao_com_veranico(file):
print("Abrindo estacao com veranico")
dados_df = pd.read_csv('./classificacao_veranicos/'+file, sep=';', decimal=',', parse_dates=['INICIO', 'FINAL'])
codigos_unicos = dados_df['CODIGO'].unique() # Retorna uma lista de valores únicos
return dados_df, codigos_unicos