Spaces:
Sleeping
Sleeping
GMARTINEZMILLA
commited on
Commit
·
cf71bb0
1
Parent(s):
707ed63
feat:updated app.py file
Browse files
app.py
CHANGED
@@ -8,6 +8,7 @@ from sklearn.feature_extraction.text import TfidfVectorizer
|
|
8 |
from sklearn.metrics.pairwise import cosine_similarity
|
9 |
from sklearn.metrics import mean_absolute_error, mean_squared_error
|
10 |
from joblib import dump, load
|
|
|
11 |
|
12 |
|
13 |
# Page configuration
|
@@ -342,75 +343,40 @@ elif page == "Customer Analysis":
|
|
342 |
st.warning("Please select a customer.")
|
343 |
|
344 |
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
productos = pd.read_csv('../data/processed/productos.csv')
|
349 |
-
|
350 |
-
# Cargar la matriz TF-IDF y el modelo
|
351 |
-
tfidf_matrix = load('../models/tfidf_matrix.joblib')
|
352 |
-
# MAtriz que tienen cada columna los diferentes artículos y las diferentes cestas en las filas
|
353 |
-
# Los valores son la importancia de cada artículo en la cesta según las veces que aparece en la misma y el total de artículos
|
354 |
-
tfidf = load('../models/tfidf_model.joblib')
|
355 |
-
|
356 |
-
# Convertir la nueva cesta en formato TF-IDF
|
357 |
-
new_basket_str = ' '.join(new_basket)
|
358 |
-
new_basket_tfidf = tfidf.transform([new_basket_str])
|
359 |
-
|
360 |
-
# Comparar la nueva cesta con las anteriores
|
361 |
-
# Calculando la distancia coseoidal, distancia entre rectas
|
362 |
-
similarities = cosine_similarity(new_basket_tfidf, tfidf_matrix)
|
363 |
-
# La similitud coseno devuelve un valor entre 0 y 1, donde 1 significa
|
364 |
-
# que las cestas son idénticas en términos de productos y 0 que no comparten ningún producto.
|
365 |
-
|
366 |
-
# Obtener los índices de las cestas más similares
|
367 |
-
# Muestra los índices de Las 3 cestas más parecidas atendiendo a la distancia calculada anteriormente
|
368 |
-
similar_indices = similarities.argsort()[0][-4:] # Las 3 más similares
|
369 |
-
|
370 |
-
# Crear un diccionario para contar las recomendaciones
|
371 |
-
recommendations_count = {}
|
372 |
-
total_similarity = 0
|
373 |
-
|
374 |
-
# Recomendar productos de cestas similares
|
375 |
-
for idx in similar_indices:
|
376 |
-
sim_score = similarities[0][idx]
|
377 |
-
# sim_score es el valor de similitud de la cesta actual con la cesta similar.
|
378 |
-
total_similarity += sim_score # Suma de las similitudes entre 0 y el nº de cestas similares
|
379 |
-
products = cestas.iloc[idx]['Cestas'].split()
|
380 |
-
|
381 |
-
for product in products:
|
382 |
-
if product.strip() not in new_basket: # Evitar recomendar lo que ya está en la cesta
|
383 |
-
recommendations_count[product.strip()] = recommendations_count.get(product.strip(), 0) + sim_score
|
384 |
-
# se utiliza para incrementar el conteo del producto en recommendations_count.
|
385 |
-
# almacena el conteo de la relevancia de cada producto basado en cuántas veces aparece en las cestas similares, ponderado por la similitud de cada cesta.
|
386 |
-
# sumandole sim_score se incrementa el score cuando la cesta es mas similar
|
387 |
-
|
388 |
-
# Calcular la probabilidad relativa de cada producto recomendado
|
389 |
-
recommendations_with_prob = []
|
390 |
-
if total_similarity > 0: # Verificar que total_similarity no sea cero
|
391 |
-
recommendations_with_prob = [(product, score / total_similarity) for product, score in recommendations_count.items()]
|
392 |
-
# Se guarda cada producto junto su score calculada
|
393 |
-
else:
|
394 |
-
print("No se encontraron similitudes suficientes para calcular probabilidades.")
|
395 |
-
|
396 |
-
recommendations_with_prob.sort(key=lambda x: x[1], reverse=True) # Ordenar por puntuación
|
397 |
|
398 |
-
|
399 |
-
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
414 |
|
415 |
# # Customer Recommendations Page
|
416 |
# elif page == "Articles Recommendations":
|
|
|
8 |
from sklearn.metrics.pairwise import cosine_similarity
|
9 |
from sklearn.metrics import mean_absolute_error, mean_squared_error
|
10 |
from joblib import dump, load
|
11 |
+
from utils import recomienda_tfid
|
12 |
|
13 |
|
14 |
# Page configuration
|
|
|
343 |
st.warning("Please select a customer.")
|
344 |
|
345 |
|
346 |
+
# Customer Recommendations Page
|
347 |
+
elif page == "Articles Recommendations":
|
348 |
+
st.title("Articles Recommendations")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
349 |
|
350 |
+
st.markdown("""
|
351 |
+
Get tailored recommendations for your customers based on their basket.
|
352 |
+
""")
|
353 |
+
|
354 |
+
st.write("Select items and assign quantities for the basket:")
|
355 |
+
|
356 |
+
# Mostrar lista de artículos disponibles
|
357 |
+
available_articles = productos['ARTICULO'].unique()
|
358 |
+
selected_articles = st.multiselect("Select Articles", available_articles)
|
359 |
+
|
360 |
+
# Crear inputs para ingresar las cantidades de cada artículo seleccionado
|
361 |
+
quantities = {}
|
362 |
+
for article in selected_articles:
|
363 |
+
quantities[article] = st.number_input(f"Quantity for {article}", min_value=0, step=1)
|
364 |
+
|
365 |
+
if st.button("Calcular"): # Añadimos el botón "Calcular"
|
366 |
+
# Crear una lista de artículos basada en la selección
|
367 |
+
new_basket = [f"{article} x{quantities[article]}" for article in selected_articles if quantities[article] > 0]
|
368 |
+
|
369 |
+
if new_basket:
|
370 |
+
# Procesar la lista para recomendar
|
371 |
+
recommendations_df = recomienda_tfid(new_basket)
|
372 |
+
|
373 |
+
if not recommendations_df.empty:
|
374 |
+
st.write("### Recommendations based on the current basket:")
|
375 |
+
st.dataframe(recommendations_df)
|
376 |
+
else:
|
377 |
+
st.warning("No recommendations found for the provided basket.")
|
378 |
+
else:
|
379 |
+
st.warning("Please select at least one article and set its quantity.")
|
380 |
|
381 |
# # Customer Recommendations Page
|
382 |
# elif page == "Articles Recommendations":
|