import pandas as pd import numpy as np import gradio as gr def processar_diagnostico_gradio(arquivo): if arquivo is None: return "Por favor, faça o upload de um arquivo Excel.", None try: # Carregar o dataframe df = pd.read_excel(arquivo.name) # Validação básica de colunas colunas_obrigatorias = ['data_encaminhamento', 'siat_inscricao', 'siat_logradouro', 'siat_numero', 'siat_complemento', 'valor_oferta'] for col in colunas_obrigatorias: if col not in df.columns: return f"Erro: A coluna '{col}' não foi encontrada no arquivo.", None # Processamento de datas df['data_encaminhamento'] = pd.to_datetime(df['data_encaminhamento']) df = df.sort_values(['siat_inscricao', 'data_encaminhamento']) chaves = ['siat_inscricao', 'siat_logradouro', 'siat_numero', 'siat_complemento'] # Agrupamento metricas = df.groupby(chaves).agg( primeira_data=('data_encaminhamento', 'min'), ultima_data=('data_encaminhamento', 'max'), preco_inicial=('valor_oferta', 'first'), preco_final=('valor_oferta', 'last'), preco_minimo=('valor_oferta', 'min'), contagem_repeticoes=('data_encaminhamento', 'count') ).reset_index() # Cálculos metricas['variacao_total_rs'] = metricas['preco_final'] - metricas['preco_inicial'] metricas['percentual_reducao'] = (metricas['variacao_total_rs'] / metricas['preco_inicial']) * 100 metricas['dias_exposicao'] = (metricas['ultima_data'] - metricas['primeira_data']).dt.days # Saneamento de Outliers (IQR) q1 = metricas['dias_exposicao'].quantile(0.25) q3 = metricas['dias_exposicao'].quantile(0.75) iqr = q3 - q1 limite_superior = q3 + 1.5 * iqr metricas_saneadas = metricas[metricas['dias_exposicao'] <= limite_superior].copy() # Diagnóstico para o resumo (markdown) imoveis_com_desconto = (metricas_saneadas['variacao_total_rs'] < 0).sum() reducao_media = metricas_saneadas[metricas_saneadas['variacao_total_rs'] < 0]['percentual_reducao'].mean() tempo_medio = metricas_saneadas['dias_exposicao'].mean() resumo = f""" ### 📊 Diagnóstico de Performance de Preço - **Imóveis com redução de preço:** {imoveis_com_desconto} - **Redução média (nos com desconto):** {reducao_media:.2f}% - **Tempo Médio de Exposição:** {tempo_medio:.1f} dias """ return resumo, metricas_saneadas except Exception as e: return f"Ocorreu um erro ao processar o arquivo: {str(e)}", None # Interface Gradio with gr.Blocks(title="Análise de Diagnóstico Imobiliário") as demo: gr.Markdown("# 🏢 Processador de Diagnóstico de Preços") gr.Markdown("Faça upload do seu arquivo Excel para calcular variações de preço e tempo de exposição.") with gr.Row(): upload_file = gr.File(label="Upload Arquivo Excel (.xlsx)", file_types=[".xlsx"]) with gr.Row(): btn_processar = gr.Button("Processar Diagnóstico", variant="primary") with gr.Column(): output_resumo = gr.Markdown() output_table = gr.DataFrame(label="Métricas Processadas") btn_processar.click( fn=processar_diagnostico_gradio, inputs=[upload_file], outputs=[output_resumo, output_table] ) # Para rodar no Hugging Face, demo.launch() é suficiente if __name__ == "__main__": demo.launch()