GMARTINEZMILLA commited on
Commit
cf71bb0
·
1 Parent(s): 707ed63

feat:updated app.py file

Browse files
Files changed (1) hide show
  1. app.py +34 -68
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
- def recomienda_tfid(new_basket):
346
-
347
- cestas = pd.read_csv('../data/processed/cestas.csv')
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
- # Crear un nuevo DataFrame para almacenar las recomendaciones
399
- recommendations_data = []
400
-
401
- for product, score in recommendations_with_prob:
402
- # Buscar la descripción en el DataFrame de productos
403
- description = productos.loc[productos['ARTICULO'] == product, 'DESCRIPCION']
404
- if not description.empty:
405
- recommendations_data.append({
406
- 'ARTICULO': product,
407
- 'DESCRIPCION': description.values[0], # Obtener el primer valor encontrado
408
- 'RELEVANCIA': score
409
- })
410
-
411
- recommendations_df = pd.DataFrame(recommendations_data)
412
-
413
- return recommendations_df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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":