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