NicollasMarques commited on
Commit
c3e94f7
·
verified ·
1 Parent(s): 74bbc3c

Upload imovel.py

Browse files
Files changed (1) hide show
  1. imovel.py +194 -0
imovel.py ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """Untitled1.ipynb
3
+
4
+ Automatically generated by Colab.
5
+
6
+ Original file is located at
7
+ https://colab.research.google.com/drive/1DZAQZfrXvTy358Vg2qfUg_ge6b3kcgBy
8
+ """
9
+
10
+ # app.py
11
+ import pandas as pd
12
+ import requests
13
+ import io
14
+ import itertools
15
+ from collections import defaultdict
16
+ import gradio as gr
17
+ import time
18
+
19
+ # 🔧 CONFIGURAÇÕES GLOBAIS
20
+ # Certifique-se de que este FILE_ID esteja acessível publicamente ou para "Qualquer pessoa com o link"
21
+ FILE_ID = "1iz6SKyiqxTjMz_MuDj6quc8pEGXErWRk"
22
+ URL = f"https://drive.google.com/uc?export=download&id={FILE_ID}"
23
+
24
+ # Variável global para armazenar o DataFrame
25
+ df = None
26
+
27
+ def carregar_planilha():
28
+ """Carrega e prepara a planilha para análise."""
29
+ global df
30
+ try:
31
+ print("⏳ Carregando planilha...")
32
+ response = requests.get(URL)
33
+ response.raise_for_status()
34
+ data = io.BytesIO(response.content)
35
+ df = pd.read_excel(data)
36
+
37
+ # Padroniza nomes das colunas
38
+ df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")
39
+
40
+ # Converte colunas numéricas
41
+ colunas_numericas = ['valor_credito', 'valor_entrada', 'valor_parcela', 'saldo_devedor', 'qtd_parcelas']
42
+ for coluna in colunas_numericas:
43
+ if coluna in df.columns:
44
+ df[coluna] = pd.to_numeric(df[coluna], errors='coerce').fillna(0)
45
+
46
+ # Verifica colunas essenciais
47
+ if 'tipo_do_bem' not in df.columns or 'administradora' not in df.columns:
48
+ raise ValueError("Colunas essenciais não encontradas")
49
+
50
+ # Remove duplicatas
51
+ df.drop_duplicates(inplace=True)
52
+
53
+ print("✅ Planilha carregada com sucesso")
54
+ return True
55
+
56
+ except Exception as e:
57
+ print(f"❌ Erro ao carregar planilha: {str(e)}")
58
+ return False
59
+
60
+ def agrupar_por_administradora(dataframe):
61
+ """Agrupa cotas por administradora."""
62
+ grupos = defaultdict(list)
63
+ for _, row in dataframe.iterrows():
64
+ grupos[row['administradora']].append(row.to_dict())
65
+ return grupos
66
+
67
+ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
68
+ """Busca combinações de cotas dentro dos parâmetros especificados."""
69
+ # Garante que o DataFrame está carregado
70
+ if df is None:
71
+ # Tenta carregar se ainda não foi carregado
72
+ if not carregar_planilha():
73
+ return "❌ Erro: Planilha não carregada. Por favor, tente novamente."
74
+
75
+ # Filtra por tipo de bem e administradoras
76
+ df_filtrado = df[df['tipo_do_bem'].str.lower() == 'imovel']
77
+ if administradoras:
78
+ # Certifica-se de que administradoras é uma lista (Gradio retorna tupla)
79
+ if isinstance(administradoras, tuple):
80
+ administradoras = list(administradoras)
81
+ df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
82
+
83
+ if df_filtrado.empty:
84
+ return "🚫 Nenhuma cota encontrada com os filtros aplicados. Tente ajustar os parâmetros."
85
+
86
+ # Define faixas de tolerância
87
+ credito_min, credito_max = credito_desejado * 0.93, credito_desejado * 1.07
88
+ entrada_min, entrada_max = entrada_desejada * 0.93, entrada_desejada * 1.07
89
+ parcela_min, parcela_max = parcela_desejada * 0.75, parcela_desejada * 1.25
90
+
91
+ grupos = agrupar_por_administradora(df_filtrado)
92
+ resultados = []
93
+
94
+ for adm, cotas in grupos.items():
95
+ for r in range(1, min(3, len(cotas)) + 1): # Máximo 3 cotas por combinação
96
+ for combinacao in itertools.combinations(cotas, r):
97
+ total_credito = sum(c['valor_credito'] for c in combinacao)
98
+ total_entrada = sum(c['valor_entrada'] for c in combinacao)
99
+ total_parcelas = sum(c['valor_parcela'] for c in combinacao)
100
+
101
+ if (credito_min <= total_credito <= credito_max and
102
+ entrada_min <= total_entrada <= entrada_max and
103
+ parcela_min <= total_parcelas <= parcela_max):
104
+
105
+ total_saldo = sum(c['saldo_devedor'] for c in combinacao)
106
+ valor_final = round(total_entrada + total_saldo, 2)
107
+ diferenca = abs(valor_final - total_credito) # Diferença do valor final pelo crédito (para ordenação)
108
+
109
+ resultados.append((adm, combinacao, diferenca))
110
+
111
+ if not resultados:
112
+ return "🚫 Nenhuma combinação adequada encontrada com os parâmetros fornecidos."
113
+
114
+ resultados.sort(key=lambda x: x[2]) # Ordena pela diferença
115
+
116
+ return formatar_resultados(resultados)
117
+
118
+ def formatar_resultados(resultados):
119
+ """Formata os resultados para exibição."""
120
+ resposta = ""
121
+ # Limita a 15 resultados para evitar saídas muito longas
122
+ for idx, (adm, combinacao, _) in enumerate(resultados[:15], 1):
123
+ codigos = [str(c.get('codigo', 'N/A')) for c in combinacao] # Adicionado .get para segurança
124
+ total_credito = sum(c['valor_credito'] for c in combinacao)
125
+ total_entrada = sum(c['valor_entrada'] for c in combinacao)
126
+ total_saldo = sum(c['saldo_devedor'] for c in combinacao)
127
+ total_parcelas = sum(c['valor_parcela'] for c in combinacao)
128
+ maior_prazo = max(int(c.get('qtd_parcelas', 0)) for c in combinacao) # Adicionado .get para segurança
129
+
130
+ valor_final = round(total_entrada + total_saldo, 2)
131
+ credito_real = round(total_credito - total_entrada, 2)
132
+ taxa_total = total_saldo - credito_real
133
+ taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
134
+ taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
135
+
136
+ resposta += f"""
137
+ --- COMBINAÇÃO {idx} ---
138
+ 🏢 Administradora: {adm}
139
+ 🔢 Códigos: {', '.join(codigos)}
140
+ 💰 Crédito Total: R$ {total_credito:,.2f}
141
+ 💵 Entrada (+comissão): R$ {total_entrada:,.2f}
142
+ 📉 Saldo Devedor: R$ {total_saldo:,.2f}
143
+ 💲 Parcela: R$ {total_parcelas:,.2f}
144
+ ⏳ Prazo: {maior_prazo} meses
145
+ 🔚 Valor Final: R$ {valor_final:,.2f}
146
+ 💠 Crédito Líquido: R$ {credito_real:,.2f}
147
+ 📊 Taxa Total: {taxa_percentual:.2f}% (R$ {taxa_total:,.2f})
148
+ 🗓️ Taxa Mensal: {taxa_mensal:.2f}%
149
+ 🗓️ Taxa Anual: {taxa_mensal * 12:.2f}%
150
+ """
151
+ return resposta
152
+
153
+ # Carrega a planilha uma vez quando o aplicativo inicia
154
+ carregar_planilha()
155
+
156
+ # Prepara a lista de administradoras para o Gradio
157
+ def get_administradoras_options():
158
+ if df is not None:
159
+ adm_list = df[df['tipo_do_bem'].str.lower() == 'imovel']['administradora'].unique()
160
+ return sorted(adm_list)
161
+ return []
162
+
163
+ # Criando a interface Gradio
164
+ with gr.Blocks(title="Sistema de Busca de Consórcio Imóvel") as demo:
165
+ gr.Markdown("# 🏠 Busca de Combinações de Consórcio Imóvel")
166
+ gr.Markdown("Insira os valores desejados para crédito, entrada e parcela, e filtre por administradora.")
167
+
168
+ with gr.Row():
169
+ credito_input = gr.Number(label="Crédito Desejado (R$)", value=300000, step=1000)
170
+ entrada_input = gr.Number(label="Entrada Desejada (R$)", value=30000, step=1000)
171
+ parcela_input = gr.Number(label="Parcela Desejada (R$)", value=1500, step=100)
172
+
173
+ administradoras_multiselect = gr.CheckboxGroup(
174
+ label="Filtrar por Administradoras",
175
+ choices=get_administradoras_options(),
176
+ value=get_administradoras_options() # Seleciona todas por padrão
177
+ )
178
+
179
+ submit_btn = gr.Button("🔍 Buscar Combinações", variant="primary")
180
+
181
+ output_text = gr.Textbox(label="Resultados da Busca", lines=20, max_lines=40, interactive=False, placeholder="Os resultados aparecerão aqui...")
182
+
183
+ submit_btn.click(
184
+ fn=buscar_combinacoes,
185
+ inputs=[credito_input, entrada_input, parcela_input, administradoras_multiselect],
186
+ outputs=output_text
187
+ )
188
+
189
+ gr.Markdown("---")
190
+ gr.Markdown("Desenvolvido para auxiliar na busca por cotas de consórcio ideais.")
191
+
192
+ # Inicia o aplicativo Gradio
193
+ if __name__ == "__main__":
194
+ demo.launch() # Você não precisa disso no Colab, mas sim no arquivo que você fará o deploy