Arthur-Attili commited on
Commit
6178dc6
·
verified ·
1 Parent(s): f0e7021

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -37
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # app.py - VERSÃO CORRIGIDA E OTIMIZADA
2
  import pandas as pd
3
  import requests
4
  import io
@@ -70,6 +70,38 @@ def agrupar_por_administradora(dataframe):
70
  grupos[row['administradora']].append(row.to_dict())
71
  return grupos
72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  def buscar_combinacoes_otimizado(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None, max_combinacoes=15):
74
  """Busca combinações de cotas dentro dos parâmetros especificados de forma otimizada."""
75
  global df_imovel, grupos_imovel
@@ -93,17 +125,16 @@ def buscar_combinacoes_otimizado(credito_desejado, entrada_desejada, parcela_des
93
  print(f"🔍 Total de administradoras no filtro: {len(grupos_filtrados)}")
94
 
95
  # TOLERÂNCIAS - Ajustadas para valores altos
96
- # Para valores muito altos, aumentamos as tolerâncias
97
- if credito_desejado > 10000000: # Para valores acima de 10 milhões
98
- tolerancia_credito = 0.50 # 50%
99
- tolerancia_entrada = 0.50 # 50%
100
- tolerancia_parcela = 1.00 # 100%
101
- max_cotas_combinacao = 25 # Até 25 cotas por combinação
102
  else:
103
- tolerancia_credito = 0.25 # 05%
104
- tolerancia_entrada = 0.25 # 05%
105
- tolerancia_parcela = 0.50 # 25%
106
- max_cotas_combinacao = 15 # Até 15 cotas por combinação
107
 
108
  # Define faixas de tolerância
109
  credito_min = credito_desejado * (1 - tolerancia_credito)
@@ -114,11 +145,6 @@ def buscar_combinacoes_otimizado(credito_desejado, entrada_desejada, parcela_des
114
  parcela_max = parcela_desejada * (1 + tolerancia_parcela)
115
 
116
  print(f"💰 Valores desejados: Crédito: R$ {credito_desejado:,.2f}, Entrada: R$ {entrada_desejada:,.2f}, Parcela: R$ {parcela_desejada:,.2f}")
117
- print(f"🔧 Tolerâncias: Crédito: ±{tolerancia_credito*100:.1f}%, Entrada: ±{tolerancia_entrada*100:.1f}%, Parcela: ±{tolerancia_parcela*100:.1f}%")
118
- print(f"🔧 Faixas aceitáveis: Crédito: R$ {credito_min:,.2f} - R$ {credito_max:,.2f}")
119
- print(f"🔧 Faixas aceitáveis: Entrada: R$ {entrada_min:,.2f} - R$ {entrada_max:,.2f}")
120
- print(f"🔧 Faixas aceitáveis: Parcela: R$ {parcela_min:,.2f} - R$ {parcela_max:,.2f}")
121
- print(f"🔧 Máximo de cotas por combinação: {max_cotas_combinacao}")
122
 
123
  resultados = []
124
  total_combinacoes_testadas = 0
@@ -127,13 +153,10 @@ def buscar_combinacoes_otimizado(credito_desejado, entrada_desejada, parcela_des
127
  for adm, cotas in grupos_filtrados.items():
128
  print(f"🔍 Analisando administradora: {adm} ({len(cotas)} cotas)")
129
 
130
- # Para valores altos, NÃO filtramos cotas individuais primeiro
131
- # Isso permite que cotas menores sejam combinadas para atingir valores altos
132
  cotas_para_combinar = cotas
133
 
134
  # Gera combinações
135
  for r in range(1, min(max_cotas_combinacao + 1, len(cotas_para_combinar) + 1)):
136
- # Limita o número de combinações testadas por administradora
137
  if credito_desejado > 10000000:
138
  max_combinacoes_por_adm = 7000
139
  else:
@@ -163,7 +186,6 @@ def buscar_combinacoes_otimizado(credito_desejado, entrada_desejada, parcela_des
163
 
164
  resultados.append((adm, combinacao, diferenca))
165
 
166
- # Para se já encontrou combinações suficientes
167
  if len(resultados) >= max_combinacoes * 3:
168
  break
169
 
@@ -196,16 +218,16 @@ def buscar_combinacoes_amplo(credito_desejado, entrada_desejada, parcela_desejad
196
  grupos_filtrados = grupos_imovel
197
 
198
  # Tolerâncias mais amplas para valores altos
199
- if credito_desejado > 10000000: # Para valores acima de 10 milhões
200
- tolerancia_credito = 0.50 # 50%
201
- tolerancia_entrada = 0.50 # 50%
202
- tolerancia_parcela = 1.00 # 100%
203
- max_cotas_combinacao = 25 # Até 25 cotas por combinação
204
  else:
205
- tolerancia_credito = 0.25 # 05%
206
- tolerancia_entrada = 0.25 # 05%
207
- tolerancia_parcela = 0.50 # 25%
208
- max_cotas_combinacao = 15 # Até 15 cotas por combinação
209
 
210
  credito_min = credito_desejado * (1 - tolerancia_credito)
211
  credito_max = credito_desejado * (1 + tolerancia_credito)
@@ -214,9 +236,6 @@ def buscar_combinacoes_amplo(credito_desejado, entrada_desejada, parcela_desejad
214
  parcela_min = parcela_desejada * (1 - tolerancia_parcela)
215
  parcela_max = parcela_desejada * (1 + tolerancia_parcela)
216
 
217
- print(f"🔍 BUSCA AMPLA: Tolerâncias: Crédito: ±{tolerancia_credito*100:.1f}%, Entrada: ±{tolerancia_entrada*100:.1f}%, Parcela: ±{tolerancia_parcela*100:.1f}%")
218
- print(f"🔍 BUSCA AMPLA: Máximo de cotas por combinação: {max_cotas_combinacao}")
219
-
220
  resultados = []
221
  total_combinacoes_testadas = 0
222
 
@@ -259,7 +278,6 @@ def buscar_combinacoes_amplo(credito_desejado, entrada_desejada, parcela_desejad
259
  if len(resultados) >= max_combinacoes * 2:
260
  break
261
 
262
- print(f"🔍 BUSCA AMPLA: Total de combinações testadas: {total_combinacoes_testadas}")
263
  print(f"🔍 BUSCA AMPLA: Combinações válidas encontradas: {len(resultados)}")
264
 
265
  if not resultados:
@@ -272,7 +290,7 @@ def formatar_moeda(valor):
272
  return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".")
273
 
274
  def formatar_resultados(resultados):
275
- """Formata os resultados para exibição."""
276
  if not resultados:
277
  return "🚫 Nenhuma combinação adequada encontrada com os parâmetros fornecidos."
278
 
@@ -291,6 +309,9 @@ def formatar_resultados(resultados):
291
  taxa_total = total_saldo - credito_real
292
  taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
293
  taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
 
 
 
294
 
295
  resposta += f"""
296
  --- COMBINAÇÃO {idx} ---
@@ -306,6 +327,10 @@ def formatar_resultados(resultados):
306
  📊 Taxa Total: {taxa_percentual:.2f}% ({formatar_moeda(taxa_total)})
307
  🗓️ Taxa Mensal: {taxa_mensal:.2f}%
308
  🗓️ Taxa Anual: {taxa_mensal * 12:.2f}%
 
 
 
 
309
  """
310
  return resposta
311
 
@@ -324,7 +349,7 @@ def get_administradoras_options():
324
  return sorted(adm_list)
325
  return []
326
 
327
- # Criando a interface Gradio
328
  with gr.Blocks(title="Sistema de Busca de Consórcio Imóvel") as demo:
329
  gr.HTML("""
330
  <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
@@ -424,5 +449,4 @@ with gr.Blocks(title="Sistema de Busca de Consórcio Imóvel") as demo:
424
 
425
  # Inicia o aplicativo Gradio
426
  if __name__ == "__main__":
427
- demo.launch() # Você não precisa disso no Colab, mas sim no arquivo que você fará o deploy
428
- #
 
1
+ # app.py - VERSÃO COM TEMPO DE PARCELAS
2
  import pandas as pd
3
  import requests
4
  import io
 
70
  grupos[row['administradora']].append(row.to_dict())
71
  return grupos
72
 
73
+ def calcular_tempo_parcelas(combinacao):
74
+ """Calcula o tempo de parcelas baseado nas cotas da combinação."""
75
+ if not combinacao:
76
+ return ""
77
+
78
+ try:
79
+ # Encontra o maior prazo entre as cotas
80
+ maior_prazo = max(int(c.get('qtd_parcelas', 0)) for c in combinacao)
81
+
82
+ if maior_prazo <= 0:
83
+ return ""
84
+
85
+ # Soma os valores das parcelas de todas as cotas
86
+ valor_parcela_total = sum(c.get('valor_parcela', 0) for c in combinacao)
87
+
88
+ # Define as faixas de parcelamento (lógica similar ao outro sistema)
89
+ if maior_prazo <= 36:
90
+ # Uma única faixa
91
+ return f"1 à {maior_prazo}x: {formatar_moeda(valor_parcela_total)}/mês"
92
+ else:
93
+ # Duas faixas (exemplo: 1-36 e 37-final)
94
+ primeira_faixa = 36
95
+ segunda_faixa = maior_prazo - 36
96
+
97
+ # Para simplificar, usamos o mesmo valor para ambas as faixas
98
+ # Em um sistema mais complexo, você poderia calcular valores diferentes
99
+ return f"1 à {primeira_faixa}x: {formatar_moeda(valor_parcela_total)}/mês\n{primeira_faixa+1} à {maior_prazo}x: {formatar_moeda(valor_parcela_total)}/mês"
100
+
101
+ except Exception as e:
102
+ print(f"❌ Erro ao calcular tempo de parcelas: {str(e)}")
103
+ return ""
104
+
105
  def buscar_combinacoes_otimizado(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None, max_combinacoes=15):
106
  """Busca combinações de cotas dentro dos parâmetros especificados de forma otimizada."""
107
  global df_imovel, grupos_imovel
 
125
  print(f"🔍 Total de administradoras no filtro: {len(grupos_filtrados)}")
126
 
127
  # TOLERÂNCIAS - Ajustadas para valores altos
128
+ if credito_desejado > 10000000:
129
+ tolerancia_credito = 0.50
130
+ tolerancia_entrada = 0.50
131
+ tolerancia_parcela = 1.00
132
+ max_cotas_combinacao = 25
 
133
  else:
134
+ tolerancia_credito = 0.25
135
+ tolerancia_entrada = 0.25
136
+ tolerancia_parcela = 0.50
137
+ max_cotas_combinacao = 15
138
 
139
  # Define faixas de tolerância
140
  credito_min = credito_desejado * (1 - tolerancia_credito)
 
145
  parcela_max = parcela_desejada * (1 + tolerancia_parcela)
146
 
147
  print(f"💰 Valores desejados: Crédito: R$ {credito_desejado:,.2f}, Entrada: R$ {entrada_desejada:,.2f}, Parcela: R$ {parcela_desejada:,.2f}")
 
 
 
 
 
148
 
149
  resultados = []
150
  total_combinacoes_testadas = 0
 
153
  for adm, cotas in grupos_filtrados.items():
154
  print(f"🔍 Analisando administradora: {adm} ({len(cotas)} cotas)")
155
 
 
 
156
  cotas_para_combinar = cotas
157
 
158
  # Gera combinações
159
  for r in range(1, min(max_cotas_combinacao + 1, len(cotas_para_combinar) + 1)):
 
160
  if credito_desejado > 10000000:
161
  max_combinacoes_por_adm = 7000
162
  else:
 
186
 
187
  resultados.append((adm, combinacao, diferenca))
188
 
 
189
  if len(resultados) >= max_combinacoes * 3:
190
  break
191
 
 
218
  grupos_filtrados = grupos_imovel
219
 
220
  # Tolerâncias mais amplas para valores altos
221
+ if credito_desejado > 10000000:
222
+ tolerancia_credito = 0.50
223
+ tolerancia_entrada = 0.50
224
+ tolerancia_parcela = 1.00
225
+ max_cotas_combinacao = 25
226
  else:
227
+ tolerancia_credito = 0.25
228
+ tolerancia_entrada = 0.25
229
+ tolerancia_parcela = 0.50
230
+ max_cotas_combinacao = 15
231
 
232
  credito_min = credito_desejado * (1 - tolerancia_credito)
233
  credito_max = credito_desejado * (1 + tolerancia_credito)
 
236
  parcela_min = parcela_desejada * (1 - tolerancia_parcela)
237
  parcela_max = parcela_desejada * (1 + tolerancia_parcela)
238
 
 
 
 
239
  resultados = []
240
  total_combinacoes_testadas = 0
241
 
 
278
  if len(resultados) >= max_combinacoes * 2:
279
  break
280
 
 
281
  print(f"🔍 BUSCA AMPLA: Combinações válidas encontradas: {len(resultados)}")
282
 
283
  if not resultados:
 
290
  return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".")
291
 
292
  def formatar_resultados(resultados):
293
+ """Formata os resultados para exibição INCLUINDO TEMPO DE PARCELAS."""
294
  if not resultados:
295
  return "🚫 Nenhuma combinação adequada encontrada com os parâmetros fornecidos."
296
 
 
309
  taxa_total = total_saldo - credito_real
310
  taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
311
  taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
312
+
313
+ # NOVO: Calcular tempo de parcelas
314
+ tempo_parcelas = calcular_tempo_parcelas(combinacao)
315
 
316
  resposta += f"""
317
  --- COMBINAÇÃO {idx} ---
 
327
  📊 Taxa Total: {taxa_percentual:.2f}% ({formatar_moeda(taxa_total)})
328
  🗓️ Taxa Mensal: {taxa_mensal:.2f}%
329
  🗓️ Taxa Anual: {taxa_mensal * 12:.2f}%
330
+
331
+ ⏰ TEMPO DE PARCELAS:
332
+ {tempo_parcelas}
333
+
334
  """
335
  return resposta
336
 
 
349
  return sorted(adm_list)
350
  return []
351
 
352
+ # Criando a interface Gradio (mantenha igual)
353
  with gr.Blocks(title="Sistema de Busca de Consórcio Imóvel") as demo:
354
  gr.HTML("""
355
  <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
 
449
 
450
  # Inicia o aplicativo Gradio
451
  if __name__ == "__main__":
452
+ demo.launch()