fschwartzer commited on
Commit
72bcb33
·
verified ·
1 Parent(s): c694ea4

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -0
app.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import numpy as np
3
+ import gradio as gr
4
+
5
+ def processar_diagnostico_gradio(arquivo):
6
+ if arquivo is None:
7
+ return "Por favor, faça o upload de um arquivo Excel.", None
8
+
9
+ try:
10
+ # Carregar o dataframe
11
+ df = pd.read_excel(arquivo.name)
12
+
13
+ # Validação básica de colunas
14
+ colunas_obrigatorias = ['data_encaminhamento', 'siat_inscricao', 'siat_logradouro',
15
+ 'siat_numero', 'siat_complemento', 'valor_oferta']
16
+
17
+ for col in colunas_obrigatorias:
18
+ if col not in df.columns:
19
+ return f"Erro: A coluna '{col}' não foi encontrada no arquivo.", None
20
+
21
+ # Processamento de datas
22
+ df['data_encaminhamento'] = pd.to_datetime(df['data_encaminhamento'])
23
+ df = df.sort_values(['siat_inscricao', 'data_encaminhamento'])
24
+
25
+ chaves = ['siat_inscricao', 'siat_logradouro', 'siat_numero', 'siat_complemento']
26
+
27
+ # Agrupamento
28
+ metricas = df.groupby(chaves).agg(
29
+ primeira_data=('data_encaminhamento', 'min'),
30
+ ultima_data=('data_encaminhamento', 'max'),
31
+ preco_inicial=('valor_oferta', 'first'),
32
+ preco_final=('valor_oferta', 'last'),
33
+ preco_minimo=('valor_oferta', 'min'),
34
+ contagem_repeticoes=('data_encaminhamento', 'count')
35
+ ).reset_index()
36
+
37
+ # Cálculos
38
+ metricas['variacao_total_rs'] = metricas['preco_final'] - metricas['preco_inicial']
39
+ metricas['percentual_reducao'] = (metricas['variacao_total_rs'] / metricas['preco_inicial']) * 100
40
+ metricas['dias_exposicao'] = (metricas['ultima_data'] - metricas['primeira_data']).dt.days
41
+
42
+ # Saneamento de Outliers (IQR)
43
+ q1 = metricas['dias_exposicao'].quantile(0.25)
44
+ q3 = metricas['dias_exposicao'].quantile(0.75)
45
+ iqr = q3 - q1
46
+ limite_superior = q3 + 1.5 * iqr
47
+ metricas_saneadas = metricas[metricas['dias_exposicao'] <= limite_superior].copy()
48
+
49
+ # Diagnóstico para o resumo (markdown)
50
+ imoveis_com_desconto = (metricas_saneadas['variacao_total_rs'] < 0).sum()
51
+ reducao_media = metricas_saneadas[metricas_saneadas['variacao_total_rs'] < 0]['percentual_reducao'].mean()
52
+ tempo_medio = metricas_saneadas['dias_exposicao'].mean()
53
+
54
+ resumo = f"""
55
+ ### 📊 Diagnóstico de Performance de Preço
56
+ - **Imóveis com redução de preço:** {imoveis_com_desconto}
57
+ - **Redução média (nos com desconto):** {reducao_media:.2f}%
58
+ - **Tempo Médio de Exposição:** {tempo_medio:.1f} dias
59
+ """
60
+
61
+ return resumo, metricas_saneadas
62
+
63
+ except Exception as e:
64
+ return f"Ocorreu um erro ao processar o arquivo: {str(e)}", None
65
+
66
+ # Interface Gradio
67
+ with gr.Blocks(title="Análise de Diagnóstico Imobiliário") as demo:
68
+ gr.Markdown("# 🏢 Processador de Diagnóstico de Preços")
69
+ gr.Markdown("Faça upload do seu arquivo Excel para calcular variações de preço e tempo de exposição.")
70
+
71
+ with gr.Row():
72
+ upload_file = gr.File(label="Upload Arquivo Excel (.xlsx)", file_types=[".xlsx"])
73
+
74
+ with gr.Row():
75
+ btn_processar = gr.Button("Processar Diagnóstico", variant="primary")
76
+
77
+ with gr.Column():
78
+ output_resumo = gr.Markdown()
79
+ output_table = gr.DataFrame(label="Métricas Processadas")
80
+
81
+ btn_processar.click(
82
+ fn=processar_diagnostico_gradio,
83
+ inputs=[upload_file],
84
+ outputs=[output_resumo, output_table]
85
+ )
86
+
87
+ # Para rodar no Hugging Face, demo.launch() é suficiente
88
+ if __name__ == "__main__":
89
+ demo.launch()