Spaces:
Sleeping
Sleeping
GMARTINEZMILLA
commited on
Commit
·
573b084
1
Parent(s):
768acc0
bugfix: Manufacturers Alerts
Browse files
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
|
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'].
|
698 |
-
|
699 |
-
#
|
|
|
|
|
|
|
700 |
quantities = {}
|
701 |
-
|
|
|
702 |
st.write("### Selected Items and Quantities:")
|
703 |
-
for
|
704 |
-
|
|
|
705 |
with col1:
|
706 |
-
|
|
|
707 |
with col2:
|
708 |
-
|
|
|
|
|
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
|
712 |
new_basket = []
|
713 |
-
for
|
714 |
-
quantity = quantities[
|
715 |
if quantity > 0:
|
716 |
-
new_basket.extend([
|
717 |
if new_basket:
|
718 |
# Procesar la lista para recomendar
|
719 |
-
recommendations_df =
|
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
|
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 |
-
|
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 |
-
|
23 |
|
24 |
-
# Convertir la nueva cesta en formato TF
|
25 |
new_basket_str = ' '.join(new_basket)
|
26 |
-
|
|
|
27 |
|
28 |
# Comparar la nueva cesta con las anteriores
|
29 |
# Calculando la distancia coseoidal, distancia entre rectas
|
30 |
-
similarities = cosine_similarity(
|
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
|
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
|