Arthur-Attili commited on
Commit
c6a96a8
·
verified ·
1 Parent(s): 17fce21

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +17 -7
app.py CHANGED
@@ -63,8 +63,6 @@ def agrupar_por_administradora(dataframe):
63
 
64
  def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
65
  """Busca combinações de cotas para automóveis dentro dos parâmetros especificados."""
66
- # Garante que o DataFrame está carregado antes de cada busca
67
- # Isso é útil caso a sessão expire ou o DF seja limpo por algum motivo no servidor do HF.
68
  global df
69
  if df is None:
70
  if not carregar_planilha():
@@ -73,12 +71,11 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
73
  # Filtra por tipo de bem (Auto) e administradoras selecionadas
74
  df_filtrado = df[df['tipo_do_bem'].str.lower() == 'auto']
75
  if administradoras:
76
- if isinstance(administradoras, tuple): # Gradio SelectMultiple retorna uma tupla
77
  administradoras = list(administradoras)
78
- administradoras = [a.strip().lower() for a in administradoras] # Normaliza os nomes
79
  df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
80
 
81
-
82
  if df_filtrado.empty:
83
  return "🚫 Nenhuma cota de automóvel encontrada com os filtros aplicados."
84
 
@@ -89,13 +86,20 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
89
 
90
  grupos = agrupar_por_administradora(df_filtrado)
91
  resultados = []
 
92
 
93
  for adm, cotas in grupos.items():
94
- for r in range(1, min(3, len(cotas)) + 1): # Máximo 3 cotas por combinação
 
 
 
95
  for combinacao in itertools.combinations(cotas, r):
 
 
 
96
  total_credito = sum(c['valor_credito'] for c in combinacao)
97
  total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
98
- total_entrada = total_entrada_base + (total_credito * 0.085) # aplica os 8,5% sobre o crédito
99
  total_parcelas = sum(c['valor_parcela'] for c in combinacao)
100
 
101
  if (credito_min <= total_credito <= credito_max and
@@ -107,11 +111,17 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
107
  diferenca = abs(valor_final - total_credito)
108
 
109
  resultados.append((adm, combinacao, diferenca))
 
110
 
111
  if not resultados:
112
  return "Nenhuma combinação adequada encontrada para automóveis com os parâmetros fornecidos."
113
 
 
114
  resultados.sort(key=lambda x: x[2])
 
 
 
 
115
  return formatar_resultados(resultados)
116
 
117
  def formatar_moeda(valor):
 
63
 
64
  def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
65
  """Busca combinações de cotas para automóveis dentro dos parâmetros especificados."""
 
 
66
  global df
67
  if df is None:
68
  if not carregar_planilha():
 
71
  # Filtra por tipo de bem (Auto) e administradoras selecionadas
72
  df_filtrado = df[df['tipo_do_bem'].str.lower() == 'auto']
73
  if administradoras:
74
+ if isinstance(administradoras, tuple):
75
  administradoras = list(administradoras)
76
+ administradoras = [a.strip().lower() for a in administradoras]
77
  df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
78
 
 
79
  if df_filtrado.empty:
80
  return "🚫 Nenhuma cota de automóvel encontrada com os filtros aplicados."
81
 
 
86
 
87
  grupos = agrupar_por_administradora(df_filtrado)
88
  resultados = []
89
+ MAX_COMBINACOES_POR_ADM = 1000 # Limite para evitar processamento excessivo
90
 
91
  for adm, cotas in grupos.items():
92
+ cotas = cotas[:20] # Limita a 20 cotas por administradora para evitar combinações explosivas
93
+ combinacoes_validas = 0
94
+
95
+ for r in range(1, min(5, len(cotas)) + 1): # Agora até 5 cotas
96
  for combinacao in itertools.combinations(cotas, r):
97
+ if combinacoes_validas >= MAX_COMBINACOES_POR_ADM:
98
+ break
99
+
100
  total_credito = sum(c['valor_credito'] for c in combinacao)
101
  total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
102
+ total_entrada = total_entrada_base + (total_credito * 0.085)
103
  total_parcelas = sum(c['valor_parcela'] for c in combinacao)
104
 
105
  if (credito_min <= total_credito <= credito_max and
 
111
  diferenca = abs(valor_final - total_credito)
112
 
113
  resultados.append((adm, combinacao, diferenca))
114
+ combinacoes_validas += 1
115
 
116
  if not resultados:
117
  return "Nenhuma combinação adequada encontrada para automóveis com os parâmetros fornecidos."
118
 
119
+ # Ordena por diferença (melhores combinações primeiro)
120
  resultados.sort(key=lambda x: x[2])
121
+
122
+ # Limita o número total de resultados para evitar sobrecarga
123
+ resultados = resultados[:500]
124
+
125
  return formatar_resultados(resultados)
126
 
127
  def formatar_moeda(valor):