Arthur-Attili commited on
Commit
bcad208
·
verified ·
1 Parent(s): 5afc6de

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -8
app.py CHANGED
@@ -65,14 +65,12 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
65
  """Busca combinações de cotas dentro dos parâmetros especificados."""
66
  # Garante que o DataFrame está carregado
67
  if df is None:
68
- # Tenta carregar se ainda não foi carregado
69
  if not carregar_planilha():
70
  return "❌ Erro: Planilha não carregada. Por favor, tente novamente."
71
 
72
  # Filtra por tipo de bem e administradoras
73
  df_filtrado = df[df['tipo_do_bem'].str.lower() == 'imovel']
74
  if administradoras:
75
- # Certifica-se de que administradoras é uma lista (Gradio retorna tupla)
76
  if isinstance(administradoras, tuple):
77
  administradoras = list(administradoras)
78
  df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
@@ -87,14 +85,52 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
87
 
88
  grupos = agrupar_por_administradora(df_filtrado)
89
  resultados = []
 
 
 
 
90
 
91
  for adm, cotas in grupos.items():
92
- # 🔥 ALTERAÇÃO PRINCIPAL: Mudado de 3 para 10 cotas máximas
93
- for r in range(1, min(10, len(cotas)) + 1): # Máximo 10 cotas por combinação ← AQUI!
94
- for combinacao in itertools.combinations(cotas, r):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  total_credito = sum(c['valor_credito'] for c in combinacao)
96
  total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
97
- total_entrada = total_entrada_base + (total_credito * 0.085) # aplica os 8,5% sobre o crédito
98
  total_parcelas = sum(c['valor_parcela'] for c in combinacao)
99
 
100
  if (credito_min <= total_credito <= credito_max and
@@ -103,16 +139,25 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
103
 
104
  total_saldo = sum(c['saldo_devedor'] for c in combinacao)
105
  valor_final = round(total_entrada + total_saldo, 2)
106
- diferenca = abs(valor_final - total_credito) # Diferença do valor final pelo crédito (para ordenação)
107
 
108
  resultados.append((adm, combinacao, diferenca))
 
 
 
 
 
 
 
 
 
109
 
110
  if not resultados:
111
  return "🚫 Nenhuma combinação adequada encontrada com os parâmetros fornecidos."
112
 
113
  resultados.sort(key=lambda x: x[2]) # Ordena pela diferença
114
 
115
- return formatar_resultados(resultados)
116
 
117
  # ✅ MODIFIQUE A FUNÇÃO PRINCIPAL PARA USAR FALLBACK
118
  def ajustar_e_buscar(credito_desejado, entrada_desejada, parcela_desejada, administradoras):
 
65
  """Busca combinações de cotas dentro dos parâmetros especificados."""
66
  # Garante que o DataFrame está carregado
67
  if df is None:
 
68
  if not carregar_planilha():
69
  return "❌ Erro: Planilha não carregada. Por favor, tente novamente."
70
 
71
  # Filtra por tipo de bem e administradoras
72
  df_filtrado = df[df['tipo_do_bem'].str.lower() == 'imovel']
73
  if administradoras:
 
74
  if isinstance(administradoras, tuple):
75
  administradoras = list(administradoras)
76
  df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
 
85
 
86
  grupos = agrupar_por_administradora(df_filtrado)
87
  resultados = []
88
+
89
+ # ⚡ OTIMIZAÇÃO: Timeout de 30 segundos
90
+ start_time = time.time()
91
+ TIME_LIMIT = 30 # segundos
92
 
93
  for adm, cotas in grupos.items():
94
+ if time.time() - start_time > TIME_LIMIT:
95
+ break
96
+
97
+ # ⚡ OTIMIZAÇÃO: Pré-filtra cotas que individualmente já estão dentro dos limites
98
+ cotas_filtradas = []
99
+ for cota in cotas:
100
+ credito = cota.get('valor_credito', 0)
101
+ parcela = cota.get('valor_parcela', 0)
102
+ if (credito_min <= credito <= credito_max and
103
+ parcela_min <= parcela <= parcela_max):
104
+ cotas_filtradas.append(cota)
105
+
106
+ if not cotas_filtradas:
107
+ continue
108
+
109
+ # ⚡ OTIMIZAÇÃO: Limita para 12 cotas por administradora
110
+ if len(cotas_filtradas) > 12:
111
+ # Pega as cotas mais próximas do valor desejado
112
+ cotas_filtradas.sort(key=lambda x: abs(x.get('valor_credito', 0) - credito_desejado/3))
113
+ cotas_filtradas = cotas_filtradas[:12]
114
+
115
+ # ⚡ OTIMIZAÇÃO: Busca primeiro combinações menores (mais rápidas)
116
+ for r in range(1, min(10, len(cotas_filtradas)) + 1):
117
+ if time.time() - start_time > TIME_LIMIT:
118
+ break
119
+
120
+ # ⚡ OTIMIZAÇÃO: Amostragem inteligente - não testa todas as combinações
121
+ max_combinations = 100 # Limite de combinações por tamanho
122
+ count = 0
123
+
124
+ for combinacao in itertools.combinations(cotas_filtradas, r):
125
+ if time.time() - start_time > TIME_LIMIT:
126
+ break
127
+
128
+ if count >= max_combinations:
129
+ break
130
+
131
  total_credito = sum(c['valor_credito'] for c in combinacao)
132
  total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
133
+ total_entrada = total_entrada_base + (total_credito * 0.085)
134
  total_parcelas = sum(c['valor_parcela'] for c in combinacao)
135
 
136
  if (credito_min <= total_credito <= credito_max and
 
139
 
140
  total_saldo = sum(c['saldo_devedor'] for c in combinacao)
141
  valor_final = round(total_entrada + total_saldo, 2)
142
+ diferenca = abs(valor_final - total_credito)
143
 
144
  resultados.append((adm, combinacao, diferenca))
145
+
146
+ # ⚡ OTIMIZAÇÃO: Limita resultados por administradora
147
+ if len([r for r in resultados if r[0] == adm]) >= 5:
148
+ break
149
+
150
+ count += 1
151
+
152
+ if time.time() - start_time > TIME_LIMIT:
153
+ break
154
 
155
  if not resultados:
156
  return "🚫 Nenhuma combinação adequada encontrada com os parâmetros fornecidos."
157
 
158
  resultados.sort(key=lambda x: x[2]) # Ordena pela diferença
159
 
160
+ return formatar_resultados(resultados[:10]) # Limita a 10 resultados
161
 
162
  # ✅ MODIFIQUE A FUNÇÃO PRINCIPAL PARA USAR FALLBACK
163
  def ajustar_e_buscar(credito_desejado, entrada_desejada, parcela_desejada, administradoras):