GMARTINEZMILLA commited on
Commit
573b084
·
1 Parent(s): 768acc0

bugfix: Manufacturers Alerts

Browse files
Files changed (2) hide show
  1. app.py +26 -16
  2. utils.py +10 -11
app.py CHANGED
@@ -10,7 +10,7 @@ from sklearn.feature_extraction.text import TfidfVectorizer
10
  from sklearn.metrics.pairwise import cosine_similarity
11
  from sklearn.metrics import mean_absolute_error, mean_squared_error
12
  from joblib import dump, load
13
- from utils import recomienda_tfid
14
 
15
  # Page configuration
16
  st.set_page_config(page_title="DeepInsightz", page_icon=":bar_chart:", layout="wide")
@@ -682,6 +682,9 @@ elif page == "Customer Analysis":
682
 
683
  # Customer Recommendations Page
684
  elif page == "Articles Recommendations":
 
 
 
685
  # Estilo principal de la página
686
  st.markdown(
687
  "<h1 style='text-align: center; color: #2E86C1;'>Articles Recommendations</h1>",
@@ -693,30 +696,38 @@ elif page == "Articles Recommendations":
693
  st.write("### Select items and assign quantities for the basket:")
694
  # Añadir separador para mejorar la segmentación visual
695
  st.divider()
696
- # Mostrar lista de artículos disponibles
697
- available_articles = productos['DESCRIPCION'].unique()
698
- selected_articles = st.multiselect("Select Articles", available_articles)
699
- # Mostrar cantidades en la misma fila
 
 
 
700
  quantities = {}
701
- if selected_articles:
 
702
  st.write("### Selected Items and Quantities:")
703
- for article in selected_articles:
704
- col1, col2 = st.columns([3, 1]) # Configurar las proporciones de las columnas
 
705
  with col1:
706
- st.write(article) # Mostrar el nombre del artículo
 
707
  with col2:
708
- quantities[article] = st.number_input(f"Qty for {article}", min_value=0, step=1, key=article) # Pedir cantidad
 
 
709
  # Añadir un botón estilizado "Calcular" con icono
710
  if st.button("🛒 Calculate Recommendations"):
711
- # Crear una lista de artículos basada en la selección de códigos y cantidades
712
  new_basket = []
713
- for article in selected_articles:
714
- quantity = quantities[article]
715
  if quantity > 0:
716
- new_basket.extend([article] * quantity) # Añadir el código 'article' tantas veces como 'quantity'
717
  if new_basket:
718
  # Procesar la lista para recomendar
719
- recommendations_df = recomienda_tfid(new_basket)
720
 
721
  if not recommendations_df.empty:
722
  st.success("### Recommendations based on the current basket:")
@@ -725,7 +736,6 @@ elif page == "Articles Recommendations":
725
  st.warning("⚠️ No recommendations found for the provided basket.")
726
  else:
727
  st.warning("⚠️ Please select at least one article and set its quantity.")
728
-
729
  # # Customer Recommendations Page
730
  # elif page == "Articles Recommendations":
731
  # st.title("Articles Recommendations")
 
10
  from sklearn.metrics.pairwise import cosine_similarity
11
  from sklearn.metrics import mean_absolute_error, mean_squared_error
12
  from joblib import dump, load
13
+ from utils import recomienda_tf
14
 
15
  # Page configuration
16
  st.set_page_config(page_title="DeepInsightz", page_icon=":bar_chart:", layout="wide")
 
682
 
683
  # Customer Recommendations Page
684
  elif page == "Articles Recommendations":
685
+ # Carga de CSV necesarios cestas y productos
686
+ cestas = pd.read_csv('cestas.csv')
687
+ productos = pd.read_csv('productos.csv')
688
  # Estilo principal de la página
689
  st.markdown(
690
  "<h1 style='text-align: center; color: #2E86C1;'>Articles Recommendations</h1>",
 
696
  st.write("### Select items and assign quantities for the basket:")
697
  # Añadir separador para mejorar la segmentación visual
698
  st.divider()
699
+ # Mostrar lista de artículos disponibles (ahora se usa el código asociado a cada descripción)
700
+ available_articles = productos[['CODIGO', 'DESCRIPCION']].drop_duplicates()
701
+
702
+ # Crear diccionario para asignar las descripciones a los códigos
703
+ article_dict = dict(zip(available_articles['DESCRIPCION'], available_articles['CODIGO']))
704
+ # Permitir seleccionar las descripciones, pero trabajar con los códigos
705
+ selected_descriptions = st.multiselect("Select Articles", available_articles['DESCRIPCION'].unique())
706
  quantities = {}
707
+
708
+ if selected_descriptions:
709
  st.write("### Selected Items and Quantities:")
710
+ for description in selected_descriptions:
711
+ code = article_dict[description] # Usar el código del artículo
712
+ col1, col2 = st.columns([1, 3]) # Ajustar proporciones para que las cantidades vayan a la izquierda
713
  with col1:
714
+ # Caja de número para la cantidad, asociada al código
715
+ quantities[code] = st.number_input(f"Quantity {code}", min_value=0, step=1, key=code)
716
  with col2:
717
+ # Mostrar la descripción del artículo
718
+ st.write(description)
719
+
720
  # Añadir un botón estilizado "Calcular" con icono
721
  if st.button("🛒 Calculate Recommendations"):
722
+ # Crear una lista de artículos basada en los códigos y cantidades
723
  new_basket = []
724
+ for code in quantities:
725
+ quantity = quantities[code]
726
  if quantity > 0:
727
+ new_basket.extend([code] * quantity) # Añadir el código tantas veces como 'quantity'
728
  if new_basket:
729
  # Procesar la lista para recomendar
730
+ recommendations_df = recomienda_tf(new_basket, cestas, productos)
731
 
732
  if not recommendations_df.empty:
733
  st.success("### Recommendations based on the current basket:")
 
736
  st.warning("⚠️ No recommendations found for the provided basket.")
737
  else:
738
  st.warning("⚠️ Please select at least one article and set its quantity.")
 
739
  # # Customer Recommendations Page
740
  # elif page == "Articles Recommendations":
741
  # st.title("Articles Recommendations")
utils.py CHANGED
@@ -1,4 +1,3 @@
1
-
2
  import pandas as pd
3
  import numpy as np
4
  import warnings
@@ -6,34 +5,34 @@ warnings.filterwarnings('ignore')
6
  from sklearn.feature_extraction.text import TfidfVectorizer
7
  from sklearn.metrics.pairwise import cosine_similarity
8
  from joblib import dump, load
 
9
 
10
 
11
 
12
 
13
- def recomienda_tfid(new_basket):
14
 
15
- cestas = pd.read_csv('cestas.csv')
16
- productos = pd.read_csv('productos.csv')
17
 
18
  # Cargar la matriz TF-IDF y el modelo
19
- tfidf_matrix = load('tfidf_matrix.joblib')
20
  # MAtriz que tienen cada columna los diferentes artículos y las diferentes cestas en las filas
21
  # 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
22
- tfidf = load('tfidf_model.joblib')
23
 
24
- # Convertir la nueva cesta en formato TF-IDF
25
  new_basket_str = ' '.join(new_basket)
26
- new_basket_tfidf = tfidf.transform([new_basket_str])
 
27
 
28
  # Comparar la nueva cesta con las anteriores
29
  # Calculando la distancia coseoidal, distancia entre rectas
30
- similarities = cosine_similarity(new_basket_tfidf, tfidf_matrix)
31
  # La similitud coseno devuelve un valor entre 0 y 1, donde 1 significa
32
  # que las cestas son idénticas en términos de productos y 0 que no comparten ningún producto.
33
 
34
  # Obtener los índices de las cestas más similares
35
  # Muestra los índices de Las 3 cestas más parecidas atendiendo a la distancia calculada anteriormente
36
- similar_indices = similarities.argsort()[0][-4:] # Las 3 más similares
37
 
38
  # Crear un diccionario para contar las recomendaciones
39
  recommendations_count = {}
@@ -78,4 +77,4 @@ def recomienda_tfid(new_basket):
78
 
79
  recommendations_df = pd.DataFrame(recommendations_data)
80
 
81
- return recommendations_df
 
 
1
  import pandas as pd
2
  import numpy as np
3
  import warnings
 
5
  from sklearn.feature_extraction.text import TfidfVectorizer
6
  from sklearn.metrics.pairwise import cosine_similarity
7
  from joblib import dump, load
8
+ from sklearn.preprocessing import normalize
9
 
10
 
11
 
12
 
13
+ def recomienda_tf(new_basket, cestas, productos):
14
 
 
 
15
 
16
  # Cargar la matriz TF-IDF y el modelo
17
+ tf_matrix = load('../models/tf_matrix.joblib')
18
  # MAtriz que tienen cada columna los diferentes artículos y las diferentes cestas en las filas
19
  # 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
20
+ count = load('../models/count_vectorizer.joblib')
21
 
22
+ # Convertir la nueva cesta en formato TF (Term Frequency)
23
  new_basket_str = ' '.join(new_basket)
24
+ new_basket_vector = count.transform([new_basket_str])
25
+ new_basket_tf = normalize(new_basket_vector, norm='l1') # Normalizamos la matriz count de la cesta actual
26
 
27
  # Comparar la nueva cesta con las anteriores
28
  # Calculando la distancia coseoidal, distancia entre rectas
29
+ similarities = cosine_similarity(new_basket_tf, tf_matrix)
30
  # La similitud coseno devuelve un valor entre 0 y 1, donde 1 significa
31
  # que las cestas son idénticas en términos de productos y 0 que no comparten ningún producto.
32
 
33
  # Obtener los índices de las cestas más similares
34
  # Muestra los índices de Las 3 cestas más parecidas atendiendo a la distancia calculada anteriormente
35
+ similar_indices = similarities.argsort()[0][-4:] # Las 4 más similares
36
 
37
  # Crear un diccionario para contar las recomendaciones
38
  recommendations_count = {}
 
77
 
78
  recommendations_df = pd.DataFrame(recommendations_data)
79
 
80
+ return recommendations_df