Arthur-Attili commited on
Commit
16042bb
·
verified ·
1 Parent(s): a7992d0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +68 -36
app.py CHANGED
@@ -63,67 +63,95 @@ def formatar_moeda(valor):
63
  except:
64
  return f"R$ {valor}"
65
 
66
- def buscar_combinacoes_rapido(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
67
- """Busca combinações de forma rápida e eficiente."""
68
  try:
 
 
69
  if df is None:
 
70
  if not carregar_planilha():
71
  return "❌ Erro: Planilha não carregada."
72
 
 
 
 
 
73
  # Filtra por tipo de bem
 
 
 
74
  df_filtrado = df[df['tipo_do_bem'].str.lower() == 'imovel']
 
75
 
76
  if administradoras:
77
  if isinstance(administradoras, tuple):
78
  administradoras = list(administradoras)
 
79
  df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
 
80
 
81
  if df_filtrado.empty:
82
  return "🚫 Nenhuma cota encontrada com os filtros aplicados."
83
 
84
- # Tolerâncias amplas
85
- credito_min, credito_max = credito_desejado * 0.85, credito_desejado * 1.15
86
- entrada_min, entrada_max = entrada_desejada * 0.80, entrada_desejada * 1.20
87
- parcela_min, parcela_max = parcela_desejada * 0.60, parcela_desejada * 1.40
 
 
 
 
88
 
89
  grupos = agrupar_por_administradora(df_filtrado)
90
- resultados = []
91
 
 
92
  MIN_COTAS = 3
93
  MAX_COTAS = 10
94
 
95
  for adm, cotas in grupos.items():
 
 
96
  if len(cotas) < MIN_COTAS:
97
  continue
98
 
99
- # Amostra aleatória para performance
100
- if len(cotas) > 20:
101
- cotas = random.sample(cotas, 20)
102
-
103
- # Busca combinações de 3 a 10 cotas
104
- for r in range(MIN_COTAS, min(MAX_COTAS + 1, len(cotas) + 1)):
105
- for combinacao in itertools.combinations(cotas, r):
106
- try:
107
- total_credito = sum(c['valor_credito'] for c in combinacao)
108
- total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
109
- total_entrada = total_entrada_base + (total_credito * 0.085)
110
- total_parcelas = sum(c['valor_parcela'] for c in combinacao)
111
-
112
- if (credito_min <= total_credito <= credito_max and
113
- entrada_min <= total_entrada <= entrada_max and
114
- parcela_min <= total_parcelas <= parcela_max):
115
-
116
- total_saldo = sum(c['saldo_devedor'] for c in combinacao)
117
- valor_final = round(total_entrada + total_saldo, 2)
118
- diferenca = abs(valor_final - total_credito)
119
-
120
- resultados.append((adm, combinacao, diferenca))
121
 
122
- if len(resultados) >= 50: # Limite seguro
123
- break
124
- except KeyError as e:
125
- print(f"⚠️ Coluna não encontrada: {e}")
126
- continue
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
 
128
  if len(resultados) >= 50:
129
  break
@@ -131,14 +159,18 @@ def buscar_combinacoes_rapido(credito_desejado, entrada_desejada, parcela_deseja
131
  if len(resultados) >= 50:
132
  break
133
 
 
 
134
  if not resultados:
135
- return "🚫 Nenhuma combinação adequada encontrada. Tente ajustar os valores."
136
 
137
  resultados.sort(key=lambda x: x[2])
138
  return formatar_resultados(resultados[:15])
139
 
140
  except Exception as e:
141
- return f"❌ Erro inesperado: {str(e)}"
 
 
142
 
143
  def formatar_resultados(resultados):
144
  """Formata os resultados para exibição com diversificação por administradora."""
 
63
  except:
64
  return f"R$ {valor}"
65
 
66
+ def buscar_combinacoes_eficiente(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
67
+ """Busca combinações de forma eficiente e garantida."""
68
  try:
69
+ print("🔍 Iniciando busca de combinações...")
70
+
71
  if df is None:
72
+ print("⚠️ DataFrame não carregado, tentando carregar...")
73
  if not carregar_planilha():
74
  return "❌ Erro: Planilha não carregada."
75
 
76
+ # Debug: verifica se o DataFrame foi carregado
77
+ print(f"✅ DataFrame carregado com {len(df)} linhas")
78
+ print(f"📋 Colunas disponíveis: {list(df.columns)}")
79
+
80
  # Filtra por tipo de bem
81
+ if 'tipo_do_bem' not in df.columns:
82
+ return "❌ Coluna 'tipo_do_bem' não encontrada na planilha."
83
+
84
  df_filtrado = df[df['tipo_do_bem'].str.lower() == 'imovel']
85
+ print(f"📊 Imóveis filtrados: {len(df_filtrado)} linhas")
86
 
87
  if administradoras:
88
  if isinstance(administradoras, tuple):
89
  administradoras = list(administradoras)
90
+ print(f"🎯 Administradoras selecionadas: {administradoras}")
91
  df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
92
+ print(f"📊 Após filtrar administradoras: {len(df_filtrado)} linhas")
93
 
94
  if df_filtrado.empty:
95
  return "🚫 Nenhuma cota encontrada com os filtros aplicados."
96
 
97
+ # Debug: mostra algumas administradoras disponíveis
98
+ adm_disponiveis = df_filtrado['administradora'].unique()[:5]
99
+ print(f"🏢 Primeiras administradoras disponíveis: {adm_disponiveis}")
100
+
101
+ # Tolerâncias amplas para garantir resultados
102
+ credito_min, credito_max = credito_desejado * 0.80, credito_desejado * 1.20
103
+ entrada_min, entrada_max = entrada_desejada * 0.75, entrada_desejada * 1.25
104
+ parcela_min, parcela_max = parcela_desejada * 0.50, parcela_desejada * 1.50
105
 
106
  grupos = agrupar_por_administradora(df_filtrado)
107
+ print(f"📦 Grupos formados: {len(grupos)} administradoras")
108
 
109
+ resultados = []
110
  MIN_COTAS = 3
111
  MAX_COTAS = 10
112
 
113
  for adm, cotas in grupos.items():
114
+ print(f"🔍 Processando {adm} com {len(cotas)} cotas")
115
+
116
  if len(cotas) < MIN_COTAS:
117
  continue
118
 
119
+ # Ordena por valor de crédito (otimização)
120
+ cotas_ordenadas = sorted(cotas, key=lambda x: x.get('valor_credito', 0))
121
+
122
+ # Busca combinações de forma inteligente
123
+ for tamanho in range(MIN_COTAS, min(MAX_COTAS + 1, len(cotas_ordenadas) + 1)):
124
+ # Amostra para evitar explosão combinatória
125
+ for i in range(0, len(cotas_ordenadas), max(1, len(cotas_ordenadas) // 5)):
126
+ for j in range(i + tamanho, min(i + 20, len(cotas_ordenadas))):
127
+ combinacao = cotas_ordenadas[i:j]
128
+ if len(combinacao) != tamanho:
129
+ continue
 
 
 
 
 
 
 
 
 
 
 
130
 
131
+ try:
132
+ total_credito = sum(c.get('valor_credito', 0) for c in combinacao)
133
+ total_entrada_base = sum(c.get('valor_entrada', 0) for c in combinacao)
134
+ total_entrada = total_entrada_base + (total_credito * 0.085)
135
+ total_parcelas = sum(c.get('valor_parcela', 0) for c in combinacao)
136
+
137
+ if (credito_min <= total_credito <= credito_max and
138
+ entrada_min <= total_entrada <= entrada_max and
139
+ parcela_min <= total_parcelas <= parcela_max):
140
+
141
+ total_saldo = sum(c.get('saldo_devedor', 0) for c in combinacao)
142
+ valor_final = round(total_entrada + total_saldo, 2)
143
+ diferenca = abs(valor_final - total_credito)
144
+
145
+ resultados.append((adm, combinacao, diferenca))
146
+
147
+ if len(resultados) >= 50:
148
+ break
149
+ except Exception as e:
150
+ print(f"⚠️ Erro em combinação: {e}")
151
+ continue
152
+
153
+ if len(resultados) >= 50:
154
+ break
155
 
156
  if len(resultados) >= 50:
157
  break
 
159
  if len(resultados) >= 50:
160
  break
161
 
162
+ print(f"✅ Busca concluída: {len(resultados)} combinações encontradas")
163
+
164
  if not resultados:
165
+ return "🚫 Nenhuma combinação adequada encontrada. Tente ampliar os filtros."
166
 
167
  resultados.sort(key=lambda x: x[2])
168
  return formatar_resultados(resultados[:15])
169
 
170
  except Exception as e:
171
+ error_msg = f"❌ Erro inesperado: {str(e)}"
172
+ print(error_msg)
173
+ return error_msg
174
 
175
  def formatar_resultados(resultados):
176
  """Formata os resultados para exibição com diversificação por administradora."""