Spaces:
Sleeping
Sleeping
| 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() |