File size: 3,634 Bytes
72bcb33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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()