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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -112
app.py CHANGED
@@ -61,117 +61,58 @@ def agrupar_por_administradora(dataframe):
61
  grupos[row['administradora']].append(row.to_dict())
62
  return grupos
63
 
64
- def buscar_combinacoes_rapido(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
65
- """Busca combinações de até 10 cotas em até 20 segundos."""
66
- try:
67
- # Verifica se os valores são válidos
68
- if not all(isinstance(val, (int, float)) for val in [credito_desejado, entrada_desejada, parcela_desejada]):
69
- return "⚠️ Preencha todos os valores corretamente."
70
-
71
- if df is None:
72
- if not carregar_planilha():
73
- return "❌ Erro: Planilha não carregada."
74
-
75
- # TOLERÂNCIAS AMPLAS
76
- credito_min, credito_max = max(credito_desejado * 0.70, 10000), credito_desejado * 1.30
77
- entrada_min, entrada_max = max(entrada_desejada * 0.60, 5000), entrada_desejada * 1.40
78
- parcela_min, parcela_max = max(parcela_desejada * 0.50, 500), parcela_desejada * 1.80
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
-
86
- if administradoras:
87
- if isinstance(administradoras, tuple):
88
- administradoras = list(administradoras)
89
- if 'administradora' not in df.columns:
90
- return "❌ Coluna 'administradora' não encontrada na planilha."
91
- df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
92
-
93
- if df_filtrado.empty:
94
- return "🚫 Nenhuma cota encontrada com os filtros aplicados."
95
-
96
- # Verifica colunas necessárias
97
- colunas_necessarias = ['valor_credito', 'valor_entrada', 'valor_parcela', 'saldo_devedor']
98
- for coluna in colunas_necessarias:
99
- if coluna not in df_filtrado.columns:
100
- return f"❌ Coluna '{coluna}' não encontrada na planilha."
101
-
102
- grupos = agrupar_por_administradora(df_filtrado)
103
- resultados = []
104
-
105
- MIN_COTAS = 3
106
- MAX_COTAS = 6 # Reduzido para performance
107
- MAX_RESULTADOS = 10
108
- start_time = time.time()
109
-
110
- for adm, cotas in list(grupos.items())[:5]: # ⚡ Limita para 5 administradoras
111
- if time.time() - start_time > 15: # Limite de 15 segundos
112
- break
113
-
114
- if len(cotas) < MIN_COTAS:
115
- continue
116
-
117
- # ✅ PRÉ-FILTRO SEGURO
118
- cotas_validas = []
119
- for cota in cotas:
120
- try:
121
- credito = float(cota.get('valor_credito', 0))
122
- parcela = float(cota.get('valor_parcela', 0))
123
- if credito_min <= credito <= credito_max and parcela_min <= parcela <= parcela_max:
124
- cotas_validas.append(cota)
125
- except (ValueError, TypeError):
126
- continue
127
-
128
- if len(cotas_validas) < MIN_COTAS:
129
- continue
130
-
131
- # ✅ Limita para 8 cotas por admin
132
- if len(cotas_validas) > 8:
133
- cotas_validas = cotas_validas[:8]
134
-
135
- # ✅ ESTRATÉGIA RÁPIDA: Combinações de 3-4 cotas
136
- for r in range(MIN_COTAS, min(MAX_COTAS, len(cotas_validas)) + 1):
137
- if time.time() - start_time > 15:
138
- break
139
-
140
- # ✅ Amostra inteligente (não todas as combinações)
141
- for i in range(0, min(20, len(cotas_validas) - r + 1), 2):
142
- combinacao = cotas_validas[i:i+r]
143
-
144
- try:
145
- total_credito = sum(float(c.get('valor_credito', 0)) for c in combinacao)
146
- total_entrada_base = sum(float(c.get('valor_entrada', 0)) for c in combinacao)
147
- total_entrada = total_entrada_base + (total_credito * 0.085)
148
- total_parcelas = sum(float(c.get('valor_parcela', 0)) for c in combinacao)
149
-
150
- if (credito_min <= total_credito <= credito_max and
151
- entrada_min <= total_entrada <= entrada_max and
152
- parcela_min <= total_parcelas <= parcela_max):
153
-
154
- resultados.append((adm, combinacao, 0))
155
-
156
- if len(resultados) >= MAX_RESULTADOS:
157
- break
158
- except (ValueError, TypeError):
159
- continue
160
-
161
- if len(resultados) >= MAX_RESULTADOS:
162
- break
163
-
164
- if len(resultados) >= MAX_RESULTADOS:
165
- break
166
-
167
- if not resultados:
168
- # ✅ RETORNA RESULTADOS SIMULADOS PARA DEMONSTRAÇÃO
169
- return gerar_resultados_simulados(credito_desejado, entrada_desejada, parcela_desejada)
170
-
171
- return formatar_resultados(resultados)
172
-
173
- except Exception as e:
174
- return f"❌ Erro no sistema: {str(e)}"
175
 
176
  # ✅ MODIFIQUE A FUNÇÃO PRINCIPAL PARA USAR FALLBACK
177
  def ajustar_e_buscar(credito_desejado, entrada_desejada, parcela_desejada, administradoras):
@@ -222,7 +163,7 @@ def formatar_resultados(resultados):
222
  📊 Taxa Total: {taxa_percentual:.2f}% ({formatar_moeda(taxa_total)})
223
  🗓️ Taxa Mensal: {taxa_mensal:.2f}%
224
  🗓️ Taxa Anual: {taxa_mensal * 12:.2f}%
225
- 📊 Nº de Cotas: {len(combinacao)}
226
  """
227
  return resposta
228
 
 
61
  grupos[row['administradora']].append(row.to_dict())
62
  return grupos
63
 
64
+ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
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)]
79
+
80
+ if df_filtrado.empty:
81
+ return "🚫 Nenhuma cota encontrada com os filtros aplicados. Tente ajustar os parâmetros."
82
+
83
+ # Define faixas de tolerância
84
+ credito_min, credito_max = credito_desejado * 0.93, credito_desejado * 1.07
85
+ entrada_min, entrada_max = entrada_desejada * 0.93, entrada_desejada * 1.07
86
+ parcela_min, parcela_max = parcela_desejada * 0.75, parcela_desejada * 1.25
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
101
+ entrada_min <= total_entrada <= entrada_max and
102
+ parcela_min <= total_parcelas <= parcela_max):
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):
 
163
  📊 Taxa Total: {taxa_percentual:.2f}% ({formatar_moeda(taxa_total)})
164
  🗓️ Taxa Mensal: {taxa_mensal:.2f}%
165
  🗓️ Taxa Anual: {taxa_mensal * 12:.2f}%
166
+ 📈 Nº de Cotas: {len(combinacao)}
167
  """
168
  return resposta
169