Update app.py
Browse files
app.py
CHANGED
|
@@ -25,11 +25,10 @@ df = None
|
|
| 25 |
df_auto = None
|
| 26 |
grupos_auto = None
|
| 27 |
planilha_carregada = False
|
| 28 |
-
ADMINISTRADORAS_LISTA = [] # Lista global de administradoras
|
| 29 |
|
| 30 |
def carregar_planilha():
|
| 31 |
"""Carrega e prepara a planilha para análise."""
|
| 32 |
-
global df, df_auto, grupos_auto, planilha_carregada
|
| 33 |
|
| 34 |
# Se já carregou, não precisa carregar novamente
|
| 35 |
if planilha_carregada:
|
|
@@ -68,7 +67,7 @@ def carregar_planilha():
|
|
| 68 |
|
| 69 |
# Padroniza os nomes das administradoras
|
| 70 |
if 'administradora' in df.columns:
|
| 71 |
-
df['administradora'] = df['administradora'].astype(str).str.strip()
|
| 72 |
print("✅ Administradoras padronizadas")
|
| 73 |
else:
|
| 74 |
print("⚠️ Coluna 'administradora' não encontrada")
|
|
@@ -113,13 +112,10 @@ def carregar_planilha():
|
|
| 113 |
for adm in list(grupos_auto.keys()):
|
| 114 |
grupos_auto[adm] = grupos_auto[adm][:MAX_COTAS_POR_ADMIN]
|
| 115 |
|
| 116 |
-
# CARREGA A LISTA DE ADMINISTRADORAS PARA A API
|
| 117 |
-
ADMINISTRADORAS_LISTA = obter_lista_administradoras()
|
| 118 |
-
|
| 119 |
planilha_carregada = True
|
| 120 |
print("✅ Planilha carregada e pré-processada com sucesso")
|
| 121 |
print(f"✅ Total de cotas de auto: {len(df_auto)}")
|
| 122 |
-
print(f"✅ Administradoras disponíveis: {
|
| 123 |
return True
|
| 124 |
|
| 125 |
except Exception as e:
|
|
@@ -128,50 +124,6 @@ def carregar_planilha():
|
|
| 128 |
traceback.print_exc()
|
| 129 |
return False
|
| 130 |
|
| 131 |
-
def obter_lista_administradoras():
|
| 132 |
-
"""Obtém a lista de administradoras da planilha."""
|
| 133 |
-
global df
|
| 134 |
-
|
| 135 |
-
if df is None:
|
| 136 |
-
print("⚠️ DataFrame não carregado, retornando lista padrão")
|
| 137 |
-
return ["Ademicon", "Banco do Brasil", "Bancorbrás", "Banrisul", "Bradesco",
|
| 138 |
-
"Caixa CNP", "Caixa XS5", "Canopus", "Embracon", "HS",
|
| 139 |
-
"HS Consórcio", "Itaú"]
|
| 140 |
-
|
| 141 |
-
try:
|
| 142 |
-
# Busca por variações do termo 'auto'
|
| 143 |
-
termos_auto = ['auto', 'automóvel', 'carro', 'veículo', 'automovel']
|
| 144 |
-
mascara_auto = df['tipo_do_bem'].astype(str).str.lower().isin([t.lower() for t in termos_auto])
|
| 145 |
-
|
| 146 |
-
if mascara_auto.any():
|
| 147 |
-
df_filtrado = df[mascara_auto]
|
| 148 |
-
else:
|
| 149 |
-
df_filtrado = df
|
| 150 |
-
|
| 151 |
-
# Verifica se tem a coluna administradora
|
| 152 |
-
if 'administradora' in df_filtrado.columns:
|
| 153 |
-
adm_list = df_filtrado['administradora'].dropna().unique()
|
| 154 |
-
# Remove strings vazias e mantém o formato original
|
| 155 |
-
adm_list = [str(adm).strip() for adm in adm_list if str(adm).strip()]
|
| 156 |
-
adm_list = sorted(list(set(adm_list))) # Remove duplicatas e ordena
|
| 157 |
-
|
| 158 |
-
if adm_list:
|
| 159 |
-
print(f"✅ Lista de administradoras carregada: {len(adm_list)} opções")
|
| 160 |
-
return adm_list
|
| 161 |
-
else:
|
| 162 |
-
print("⚠️ Nenhuma administradora encontrada na planilha")
|
| 163 |
-
return ["Ademicon", "Banco do Brasil", "Bancorbrás", "Banrisul", "Bradesco",
|
| 164 |
-
"Caixa CNP", "Caixa XS5", "Canopus", "Embracon", "HS",
|
| 165 |
-
"HS Consórcio", "Itaú"]
|
| 166 |
-
|
| 167 |
-
except Exception as e:
|
| 168 |
-
print(f"❌ Erro ao obter lista de administradoras: {str(e)}")
|
| 169 |
-
|
| 170 |
-
# Fallback padrão
|
| 171 |
-
return ["Ademicon", "Banco do Brasil", "Bancorbrás", "Banrisul", "Bradesco",
|
| 172 |
-
"Caixa CNP", "Caixa XS5", "Canopus", "Embracon", "HS",
|
| 173 |
-
"HS Consórcio", "Itaú"]
|
| 174 |
-
|
| 175 |
def agrupar_por_administradora(dataframe):
|
| 176 |
"""Agrupa cotas por administradora."""
|
| 177 |
grupos = defaultdict(list)
|
|
@@ -250,7 +202,7 @@ def buscar_combinacoes_otimizado(credito_desejado, entrada_desejada, parcela_des
|
|
| 250 |
|
| 251 |
# Filtra administradoras se especificado
|
| 252 |
if administradoras and len(administradoras) > 0:
|
| 253 |
-
administradoras = [a.strip() for a in administradoras]
|
| 254 |
grupos_filtrados = {adm: cotas for adm, cotas in grupos_auto.items() if adm in administradoras}
|
| 255 |
print(f"🔍 Filtrando por administradoras: {administradoras}")
|
| 256 |
else:
|
|
@@ -378,7 +330,7 @@ def buscar_combinacoes_amplo(credito_desejado, entrada_desejada, parcela_desejad
|
|
| 378 |
|
| 379 |
# Filtra administradoras se especificado
|
| 380 |
if administradoras and len(administradoras) > 0:
|
| 381 |
-
administradoras = [a.strip() for a in administradoras]
|
| 382 |
grupos_filtrados = {adm: cotas for adm, cotas in grupos_auto.items() if adm in administradoras}
|
| 383 |
else:
|
| 384 |
grupos_filtrados = grupos_auto
|
|
@@ -548,6 +500,14 @@ def ajustar_e_buscar(credito_desejado, entrada_desejada, parcela_desejada, admin
|
|
| 548 |
traceback.print_exc()
|
| 549 |
return f"❌ Erro interno do servidor: {str(e)}"
|
| 550 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 551 |
# Criando a interface Gradio
|
| 552 |
with gr.Blocks(title="Sistema de Busca de Consórcio Auto") as demo:
|
| 553 |
gr.HTML("""
|
|
@@ -622,33 +582,14 @@ with gr.Blocks(title="Sistema de Busca de Consórcio Auto") as demo:
|
|
| 622 |
gr.Markdown("Insira os valores desejados para crédito, entrada e parcela, e filtre por administradora.")
|
| 623 |
|
| 624 |
with gr.Row():
|
| 625 |
-
credito_input = gr.Number(
|
| 626 |
-
|
| 627 |
-
|
| 628 |
-
step=1000,
|
| 629 |
-
description="Valor do crédito desejado para o consórcio"
|
| 630 |
-
)
|
| 631 |
-
entrada_input = gr.Number(
|
| 632 |
-
label="Entrada Desejada (R$)",
|
| 633 |
-
value=3000,
|
| 634 |
-
step=100,
|
| 635 |
-
description="Valor da entrada desejada"
|
| 636 |
-
)
|
| 637 |
-
parcela_input = gr.Number(
|
| 638 |
-
label="Parcela Desejada (R$)",
|
| 639 |
-
value=500,
|
| 640 |
-
step=10,
|
| 641 |
-
description="Valor da parcela mensal desejada"
|
| 642 |
-
)
|
| 643 |
|
| 644 |
-
# Carrega a lista de administradoras
|
| 645 |
-
admin_lista = ADMINISTRADORAS_LISTA if ADMINISTRADORAS_LISTA else obter_lista_administradoras()
|
| 646 |
-
|
| 647 |
administradoras_multiselect = gr.CheckboxGroup(
|
| 648 |
label="Filtrar por Administradoras",
|
| 649 |
-
choices=
|
| 650 |
-
value=
|
| 651 |
-
info=f"Total de {len(admin_lista)} administradoras disponíveis"
|
| 652 |
)
|
| 653 |
|
| 654 |
submit_btn = gr.Button("🔍 Buscar Combinações", variant="primary")
|
|
@@ -658,43 +599,9 @@ with gr.Blocks(title="Sistema de Busca de Consórcio Auto") as demo:
|
|
| 658 |
lines=20,
|
| 659 |
max_lines=40,
|
| 660 |
interactive=False,
|
| 661 |
-
placeholder="Os resultados aparecerão aqui..."
|
| 662 |
-
show_copy_button=True
|
| 663 |
)
|
| 664 |
|
| 665 |
-
# Adiciona documentação da API explicitamente
|
| 666 |
-
gr.Markdown("""
|
| 667 |
-
## 📡 API Documentation
|
| 668 |
-
|
| 669 |
-
### Endpoint: `/ajustar_e_buscar`
|
| 670 |
-
|
| 671 |
-
**Parameters:**
|
| 672 |
-
|
| 673 |
-
| Parameter | Type | Default | Description |
|
| 674 |
-
|-----------|------|---------|-------------|
|
| 675 |
-
| `credito_desejado` | `number` | 30000 | Valor do crédito desejado em R$ |
|
| 676 |
-
| `entrada_desejada` | `number` | 3000 | Valor da entrada desejada em R$ |
|
| 677 |
-
| `parcela_desejada` | `number` | 500 | Valor da parcela mensal desejada em R$ |
|
| 678 |
-
| `administradoras` | `string[]` | %s | Lista de administradoras para filtrar |
|
| 679 |
-
|
| 680 |
-
**Administradoras disponíveis:** %s
|
| 681 |
-
|
| 682 |
-
**Example JavaScript API call:**
|
| 683 |
-
```javascript
|
| 684 |
-
import { Client } from "@gradio/client";
|
| 685 |
-
|
| 686 |
-
const client = await Client.connect("BACKUPMAXCON/combinacoescotas");
|
| 687 |
-
const result = await client.predict("/ajustar_e_buscar", {
|
| 688 |
-
credito_desejado: 30000,
|
| 689 |
-
entrada_desejada: 3000,
|
| 690 |
-
parcela_desejada: 500,
|
| 691 |
-
administradoras: ["Ademicon"],
|
| 692 |
-
});
|
| 693 |
-
|
| 694 |
-
console.log(result.data);
|
| 695 |
-
```
|
| 696 |
-
""" % (str(admin_lista[:3]), ", ".join(admin_lista)))
|
| 697 |
-
|
| 698 |
submit_btn.click(
|
| 699 |
fn=ajustar_e_buscar,
|
| 700 |
inputs=[credito_input, entrada_input, parcela_input, administradoras_multiselect],
|
|
@@ -708,11 +615,9 @@ with gr.Blocks(title="Sistema de Busca de Consórcio Auto") as demo:
|
|
| 708 |
# Inicia o aplicativo Gradio
|
| 709 |
if __name__ == "__main__":
|
| 710 |
print("🌐 Iniciando servidor Gradio...")
|
| 711 |
-
print(f"📋 Administradoras carregadas: {ADMINISTRADORAS_LISTA}")
|
| 712 |
demo.launch(
|
| 713 |
server_name="0.0.0.0",
|
| 714 |
server_port=7860,
|
| 715 |
debug=True,
|
| 716 |
-
show_error=True
|
| 717 |
-
share=False
|
| 718 |
)
|
|
|
|
| 25 |
df_auto = None
|
| 26 |
grupos_auto = None
|
| 27 |
planilha_carregada = False
|
|
|
|
| 28 |
|
| 29 |
def carregar_planilha():
|
| 30 |
"""Carrega e prepara a planilha para análise."""
|
| 31 |
+
global df, df_auto, grupos_auto, planilha_carregada
|
| 32 |
|
| 33 |
# Se já carregou, não precisa carregar novamente
|
| 34 |
if planilha_carregada:
|
|
|
|
| 67 |
|
| 68 |
# Padroniza os nomes das administradoras
|
| 69 |
if 'administradora' in df.columns:
|
| 70 |
+
df['administradora'] = df['administradora'].astype(str).str.strip().str.lower()
|
| 71 |
print("✅ Administradoras padronizadas")
|
| 72 |
else:
|
| 73 |
print("⚠️ Coluna 'administradora' não encontrada")
|
|
|
|
| 112 |
for adm in list(grupos_auto.keys()):
|
| 113 |
grupos_auto[adm] = grupos_auto[adm][:MAX_COTAS_POR_ADMIN]
|
| 114 |
|
|
|
|
|
|
|
|
|
|
| 115 |
planilha_carregada = True
|
| 116 |
print("✅ Planilha carregada e pré-processada com sucesso")
|
| 117 |
print(f"✅ Total de cotas de auto: {len(df_auto)}")
|
| 118 |
+
print(f"✅ Administradoras disponíveis: {list(grupos_auto.keys())}")
|
| 119 |
return True
|
| 120 |
|
| 121 |
except Exception as e:
|
|
|
|
| 124 |
traceback.print_exc()
|
| 125 |
return False
|
| 126 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 127 |
def agrupar_por_administradora(dataframe):
|
| 128 |
"""Agrupa cotas por administradora."""
|
| 129 |
grupos = defaultdict(list)
|
|
|
|
| 202 |
|
| 203 |
# Filtra administradoras se especificado
|
| 204 |
if administradoras and len(administradoras) > 0:
|
| 205 |
+
administradoras = [a.strip().lower() for a in administradoras]
|
| 206 |
grupos_filtrados = {adm: cotas for adm, cotas in grupos_auto.items() if adm in administradoras}
|
| 207 |
print(f"🔍 Filtrando por administradoras: {administradoras}")
|
| 208 |
else:
|
|
|
|
| 330 |
|
| 331 |
# Filtra administradoras se especificado
|
| 332 |
if administradoras and len(administradoras) > 0:
|
| 333 |
+
administradoras = [a.strip().lower() for a in administradoras]
|
| 334 |
grupos_filtrados = {adm: cotas for adm, cotas in grupos_auto.items() if adm in administradoras}
|
| 335 |
else:
|
| 336 |
grupos_filtrados = grupos_auto
|
|
|
|
| 500 |
traceback.print_exc()
|
| 501 |
return f"❌ Erro interno do servidor: {str(e)}"
|
| 502 |
|
| 503 |
+
# Prepara a lista de administradoras para o Gradio
|
| 504 |
+
def get_administradoras_options():
|
| 505 |
+
if df is not None and planilha_carregada:
|
| 506 |
+
if 'administradora' in df.columns and 'tipo_do_bem' in df.columns:
|
| 507 |
+
adm_list = df[df['tipo_do_bem'].astype(str).str.lower() == 'auto']['administradora'].unique()
|
| 508 |
+
return sorted([str(adm) for adm in adm_list if adm])
|
| 509 |
+
return ["bradesco", "santander", "itau", "caixa", "banco do brasil"]
|
| 510 |
+
|
| 511 |
# Criando a interface Gradio
|
| 512 |
with gr.Blocks(title="Sistema de Busca de Consórcio Auto") as demo:
|
| 513 |
gr.HTML("""
|
|
|
|
| 582 |
gr.Markdown("Insira os valores desejados para crédito, entrada e parcela, e filtre por administradora.")
|
| 583 |
|
| 584 |
with gr.Row():
|
| 585 |
+
credito_input = gr.Number(label="Crédito Desejado (R$)", value=30000, step=1000)
|
| 586 |
+
entrada_input = gr.Number(label="Entrada Desejada (R$)", value=3000, step=100)
|
| 587 |
+
parcela_input = gr.Number(label="Parcela Desejada (R$)", value=500, step=10)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 588 |
|
|
|
|
|
|
|
|
|
|
| 589 |
administradoras_multiselect = gr.CheckboxGroup(
|
| 590 |
label="Filtrar por Administradoras",
|
| 591 |
+
choices=get_administradoras_options(),
|
| 592 |
+
value=get_administradoras_options()[:3] if len(get_administradoras_options()) >= 3 else get_administradoras_options()
|
|
|
|
| 593 |
)
|
| 594 |
|
| 595 |
submit_btn = gr.Button("🔍 Buscar Combinações", variant="primary")
|
|
|
|
| 599 |
lines=20,
|
| 600 |
max_lines=40,
|
| 601 |
interactive=False,
|
| 602 |
+
placeholder="Os resultados aparecerão aqui..."
|
|
|
|
| 603 |
)
|
| 604 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 605 |
submit_btn.click(
|
| 606 |
fn=ajustar_e_buscar,
|
| 607 |
inputs=[credito_input, entrada_input, parcela_input, administradoras_multiselect],
|
|
|
|
| 615 |
# Inicia o aplicativo Gradio
|
| 616 |
if __name__ == "__main__":
|
| 617 |
print("🌐 Iniciando servidor Gradio...")
|
|
|
|
| 618 |
demo.launch(
|
| 619 |
server_name="0.0.0.0",
|
| 620 |
server_port=7860,
|
| 621 |
debug=True,
|
| 622 |
+
show_error=True
|
|
|
|
| 623 |
)
|