File size: 4,014 Bytes
c5a97b3
 
 
2598bbd
3992853
c5a97b3
2598bbd
7a6bd46
 
 
 
2598bbd
 
 
 
 
 
 
 
 
7a6bd46
3992853
 
 
 
 
 
 
 
2598bbd
 
 
 
 
c5a97b3
f308877
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78ac961
7a6bd46
2598bbd
c5a97b3
f308877
78ac961
 
 
 
 
f308877
 
 
c5a97b3
3bd1e98
f308877
 
8b5cf55
 
 
3bd1e98
205d4a0
 
 
 
 
 
3bd1e98
78ac961
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import gradio as gr
import requests
import pandas as pd
from difflib import get_close_matches
import re  # Importa o módulo de expressões regulares

def fetch_data_to_dataframe(query, limit=50, source="mercadolibre"):
    if source == "mercadolibre":
        BASE_URL = "https://api.mercadolibre.com/sites/MLB/search"
        params = {'q': query, 'limit': limit}
        response = requests.get(BASE_URL, params=params)
        if response.status_code == 200:
            data = response.json()
            if 'results' in data:
                items = data['results']
                df = pd.DataFrame(items)
                df = df[['title', 'price', 'currency_id', 'condition', 'permalink']]
                df.columns = ['Title', 'Price', 'Currency', 'Condition', 'Link']
                return df
    return pd.DataFrame()

def refinar_resultados(df):
    # Filtra itens que não contêm "kit" no título e não indicam múltiplas unidades
    df_refinado = df[~df['Title'].str.contains("kit", case=False)]
    # Expressão regular para identificar números seguidos por palavras relacionadas a quantidade
    padrao_unidades = r'\b(\d+)\s*(unidade|unidades|pacote|pacotes|caixa|caixas)\b'
    df_refinado = df_refinado[~df_refinado['Title'].str.contains(padrao_unidades, case=False, regex=True)]
    return df_refinado

def filtrar_itens_similares(df, termo_pesquisa, limite=5):
    titulos = df['Title'].tolist()
    titulos_similares = get_close_matches(termo_pesquisa, titulos, n=limite, cutoff=0.1)
    df_filtrado = df[df['Title'].isin(titulos_similares)]
    return df_filtrado

def calcular_fator_avaliacao(EC, VU, PU, VR):
    pontuacoes = {'Excelente': 10, 'Bom': 8, 'Regular': 5, 'Péssimo': 2}
    ec_pontuacao = pontuacoes[EC]
    
    PVU = 10 - ((PU - 1) * (10 / VU))
    PVU = min(PVU, 10)
    
    PUB = 10 - (((VU - PU) - 1) * (10 / VU))
    PUB = min(PUB, 10)
    
    fator_avaliacao = (4 * ec_pontuacao + 6 * PVU - 3 * PUB) / 100
    return fator_avaliacao

def integrated_app(query, EC, VU, PU, VR):
    VU = float(VU)
    PU = float(PU)
    VR = float(VR)
    
    df = fetch_data_to_dataframe(query, 50, "mercadolibre")
    if df.empty:
        return "Nenhum dado encontrado. Tente uma consulta diferente.", pd.DataFrame()

    df = refinar_resultados(df)
    df_similares = filtrar_itens_similares(df, query)
    if df_similares.empty:
        return "Nenhum item similar encontrado.", pd.DataFrame()
    else:
        median_price = df_similares['Price'].median()
        fator_avaliacao = calcular_fator_avaliacao(EC, VU, PU, VR)
        valor_avaliacao = max(median_price * fator_avaliacao, VR)
        return f"Fator de Avaliação: {fator_avaliacao*100:.2f}%, Valor de Avaliação: {valor_avaliacao}", df_similares

iface = gr.Interface(fn=integrated_app,
                     inputs=[gr.Textbox(label="Digite sua consulta"),
                             gr.Radio(label="Estado de Conservação do Bem", choices=['Excelente', 'Bom', 'Regular', 'Péssimo']),
                             gr.Number(label="Vida Útil do Bem (VU)", value=9),
                             gr.Number(label="Período em que o bem foi utilizado (PU)", value=1),
                             gr.Number(label="Valor Residual (VR)", value=20)],
                     outputs=[gr.Textbox(label="Preço Mediano"), gr.Dataframe(label="Resultados da Pesquisa")],
                     theme=gr.themes.Monochrome(),
                    title = "<span style='color: gray; font-size: 48px;'>aval</span><span style='color: gray; font-size: 48px;'>ia</span><span style='color: gray; font-size: 48px;'>.BEN</span>",
                    description=f"""
                    <p style="text-align: left;"><b><span style='color: gray; font-size: 40px;'>aval</span><span style='color: gray; font-size: 40px;'>ia</span><span style='color: gray; font-size: 40px;'>.se</b></p>
                    <p style="text-align: left;"></span>Aplicativo para avaliação de bens móveis</p>
                    """)

iface.launch()