Spaces:
Sleeping
Sleeping
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 = max((4 * ec_pontuacao + 6 * PVU - 3 * PUB) / 100, (VR/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: | |
mean_price = df_similares['Price'].mean() | |
fator_avaliacao = calcular_fator_avaliacao(EC, VU, PU, VR) | |
valor_avaliacao = max(mean_price * fator_avaliacao, ((VR/100)* mean_price)) | |
return f"Valor Médio do Bem: R$ {mean_price:.2f}, Fator de Avaliação: {fator_avaliacao*100:.2f}%, Valor de Avaliação: R$ {valor_avaliacao:.2f}", 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", value=10), | |
gr.Number(label="Período em que o bem foi utilizado", value=1), | |
gr.Number(label="Valor Residual", value=20)], | |
outputs=[gr.Textbox(label="Cálculo"), 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() | |