Spaces:
Sleeping
Sleeping
GMARTINEZMILLA
commited on
Commit
•
1ce52f7
1
Parent(s):
d2e20ef
feat: Added about section underneath table in col 3
Browse files
app.py
CHANGED
@@ -719,124 +719,54 @@ elif page == "🕵️ Análisis de Cliente":
|
|
719 |
st.warning(f"No predicted or actual data found for customer {customer_code} for 2024.")
|
720 |
|
721 |
# Customer Recommendations Page
|
722 |
-
elif page == "💡 Recomendación de Artículos":
|
723 |
-
# Carga de CSV necesarios cestas y productos
|
724 |
-
cestas = pd.read_csv('cestas.csv')
|
725 |
-
productos = pd.read_csv('productos.csv')
|
726 |
-
|
727 |
-
# Estilo principal de la página
|
728 |
-
st.markdown(
|
729 |
-
"<h1 style='text-align: center;'>Recomendación de Artículos</h1>",
|
730 |
-
unsafe_allow_html=True
|
731 |
-
)
|
732 |
-
st.markdown("""<p style='text-align: center; color: #5D6D7E;'>Obtén recomendaciones personalizadas para tus clientes basadas en su cesta de compra.</p>""", unsafe_allow_html=True)
|
733 |
-
|
734 |
-
st.write("### Selecciona los artículos y asigna las cantidades para la cesta:")
|
735 |
-
|
736 |
-
# Añadir separador para mejorar la segmentación visual
|
737 |
-
st.divider()
|
738 |
-
|
739 |
-
# Mostrar lista de artículos disponibles (ahora se usa el código asociado a cada descripción)
|
740 |
-
available_articles = productos[['ARTICULO', 'DESCRIPCION']].drop_duplicates()
|
741 |
-
|
742 |
-
# Crear diccionario para asignar las descripciones a los códigos
|
743 |
-
article_dict = dict(zip(available_articles['DESCRIPCION'], available_articles['ARTICULO']))
|
744 |
-
|
745 |
-
# Permitir seleccionar las descripciones, pero trabajar con los códigos
|
746 |
-
selected_descriptions = st.multiselect("Select Articles", available_articles['DESCRIPCION'].unique())
|
747 |
-
|
748 |
-
quantities = {}
|
749 |
-
|
750 |
-
if selected_descriptions:
|
751 |
-
st.write("### Selecciona los artículos, las unidades, y visualiza la imagen:")
|
752 |
-
|
753 |
-
for description in selected_descriptions:
|
754 |
-
code = article_dict[description] # Usar el código del artículo
|
755 |
-
col1, col2, col3 = st.columns([1, 2, 2]) # Ajustar proporciones para que las imágenes y textos se alineen
|
756 |
-
|
757 |
-
with col1:
|
758 |
-
# Mostrar la imagen del artículo
|
759 |
-
img_url = f"https://www.saneamiento-martinez.com/imagenes/articulos/{code}_1.JPG"
|
760 |
-
st.image(img_url, width=100)
|
761 |
-
|
762 |
-
with col2:
|
763 |
-
# Mostrar la descripción del artículo
|
764 |
-
st.write(f"**{description}**")
|
765 |
-
|
766 |
-
with col3:
|
767 |
-
# Caja de número para la cantidad, asociada al código
|
768 |
-
quantities[code] = st.number_input(f"Cantidad {code}", min_value=0, step=1, key=code)
|
769 |
-
|
770 |
-
# Añadir un botón estilizado "Calcular" con icono
|
771 |
-
if st.button("🛒 Obtener Recomendaciones"):
|
772 |
-
# Crear una lista de artículos basada en los códigos y cantidades
|
773 |
-
new_basket = []
|
774 |
-
for code in quantities:
|
775 |
-
quantity = quantities[code]
|
776 |
-
if quantity > 0:
|
777 |
-
new_basket.extend([code] * quantity) # Añadir el código tantas veces como 'quantity'
|
778 |
-
|
779 |
-
if new_basket:
|
780 |
-
# Procesar la lista para recomendar
|
781 |
-
recommendations_df = recomienda_tf(new_basket, cestas, productos)
|
782 |
-
|
783 |
-
if not recommendations_df.empty:
|
784 |
-
st.success("### Según tu cesta, te recomendamos que consideres añadir estos artículos:")
|
785 |
-
|
786 |
-
# Mostrar los artículos recomendados con imágenes
|
787 |
-
for idx, row in recommendations_df.iterrows():
|
788 |
-
rec_code = row['ARTICULO']
|
789 |
-
rec_desc = row['DESCRIPCION']
|
790 |
-
rec_img_url = f"https://www.saneamiento-martinez.com/imagenes/articulos/{rec_code}_1.JPG"
|
791 |
-
|
792 |
-
rec_col1, rec_col2 = st.columns([1, 3])
|
793 |
-
with rec_col1:
|
794 |
-
st.image(rec_img_url, width=100)
|
795 |
-
with rec_col2:
|
796 |
-
st.write(f"**{rec_desc}** (Código: {rec_code})")
|
797 |
-
else:
|
798 |
-
st.warning("⚠️ No recommendations found for the provided basket.")
|
799 |
-
else:
|
800 |
-
st.warning("⚠️ Please select at least one article and set its quantity.")
|
801 |
-
|
802 |
-
|
803 |
-
|
804 |
# elif page == "💡 Recomendación de Artículos":
|
805 |
# # Carga de CSV necesarios cestas y productos
|
806 |
# cestas = pd.read_csv('cestas.csv')
|
807 |
# productos = pd.read_csv('productos.csv')
|
|
|
808 |
# # Estilo principal de la página
|
809 |
# st.markdown(
|
810 |
# "<h1 style='text-align: center;'>Recomendación de Artículos</h1>",
|
811 |
# unsafe_allow_html=True
|
812 |
# )
|
813 |
-
# st.markdown("""
|
814 |
-
|
815 |
-
# """, unsafe_allow_html=True)
|
816 |
# st.write("### Selecciona los artículos y asigna las cantidades para la cesta:")
|
|
|
817 |
# # Añadir separador para mejorar la segmentación visual
|
818 |
# st.divider()
|
|
|
819 |
# # Mostrar lista de artículos disponibles (ahora se usa el código asociado a cada descripción)
|
820 |
# available_articles = productos[['ARTICULO', 'DESCRIPCION']].drop_duplicates()
|
821 |
-
|
822 |
# # Crear diccionario para asignar las descripciones a los códigos
|
823 |
# article_dict = dict(zip(available_articles['DESCRIPCION'], available_articles['ARTICULO']))
|
|
|
824 |
# # Permitir seleccionar las descripciones, pero trabajar con los códigos
|
825 |
# selected_descriptions = st.multiselect("Select Articles", available_articles['DESCRIPCION'].unique())
|
826 |
-
# quantities = {}
|
827 |
|
|
|
|
|
828 |
# if selected_descriptions:
|
829 |
-
# st.write("### Selecciona los artículos y
|
|
|
830 |
# for description in selected_descriptions:
|
831 |
# code = article_dict[description] # Usar el código del artículo
|
832 |
-
# col1, col2 = st.columns([1,
|
|
|
833 |
# with col1:
|
834 |
-
# #
|
835 |
-
#
|
|
|
|
|
836 |
# with col2:
|
837 |
# # Mostrar la descripción del artículo
|
838 |
-
# st.write(description)
|
839 |
-
|
|
|
|
|
|
|
|
|
840 |
# # Añadir un botón estilizado "Calcular" con icono
|
841 |
# if st.button("🛒 Obtener Recomendaciones"):
|
842 |
# # Crear una lista de artículos basada en los códigos y cantidades
|
@@ -845,14 +775,84 @@ elif page == "💡 Recomendación de Artículos":
|
|
845 |
# quantity = quantities[code]
|
846 |
# if quantity > 0:
|
847 |
# new_basket.extend([code] * quantity) # Añadir el código tantas veces como 'quantity'
|
|
|
848 |
# if new_basket:
|
849 |
# # Procesar la lista para recomendar
|
850 |
# recommendations_df = recomienda_tf(new_basket, cestas, productos)
|
851 |
-
|
852 |
# if not recommendations_df.empty:
|
853 |
-
# st.success("### Según tu cesta, te recomendamos que consideres añadir
|
854 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
855 |
# else:
|
856 |
# st.warning("⚠️ No recommendations found for the provided basket.")
|
857 |
# else:
|
858 |
# st.warning("⚠️ Please select at least one article and set its quantity.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
719 |
st.warning(f"No predicted or actual data found for customer {customer_code} for 2024.")
|
720 |
|
721 |
# Customer Recommendations Page
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
722 |
# elif page == "💡 Recomendación de Artículos":
|
723 |
# # Carga de CSV necesarios cestas y productos
|
724 |
# cestas = pd.read_csv('cestas.csv')
|
725 |
# productos = pd.read_csv('productos.csv')
|
726 |
+
|
727 |
# # Estilo principal de la página
|
728 |
# st.markdown(
|
729 |
# "<h1 style='text-align: center;'>Recomendación de Artículos</h1>",
|
730 |
# unsafe_allow_html=True
|
731 |
# )
|
732 |
+
# st.markdown("""<p style='text-align: center; color: #5D6D7E;'>Obtén recomendaciones personalizadas para tus clientes basadas en su cesta de compra.</p>""", unsafe_allow_html=True)
|
733 |
+
|
|
|
734 |
# st.write("### Selecciona los artículos y asigna las cantidades para la cesta:")
|
735 |
+
|
736 |
# # Añadir separador para mejorar la segmentación visual
|
737 |
# st.divider()
|
738 |
+
|
739 |
# # Mostrar lista de artículos disponibles (ahora se usa el código asociado a cada descripción)
|
740 |
# available_articles = productos[['ARTICULO', 'DESCRIPCION']].drop_duplicates()
|
741 |
+
|
742 |
# # Crear diccionario para asignar las descripciones a los códigos
|
743 |
# article_dict = dict(zip(available_articles['DESCRIPCION'], available_articles['ARTICULO']))
|
744 |
+
|
745 |
# # Permitir seleccionar las descripciones, pero trabajar con los códigos
|
746 |
# selected_descriptions = st.multiselect("Select Articles", available_articles['DESCRIPCION'].unique())
|
|
|
747 |
|
748 |
+
# quantities = {}
|
749 |
+
|
750 |
# if selected_descriptions:
|
751 |
+
# st.write("### Selecciona los artículos, las unidades, y visualiza la imagen:")
|
752 |
+
|
753 |
# for description in selected_descriptions:
|
754 |
# code = article_dict[description] # Usar el código del artículo
|
755 |
+
# col1, col2, col3 = st.columns([1, 2, 2]) # Ajustar proporciones para que las imágenes y textos se alineen
|
756 |
+
|
757 |
# with col1:
|
758 |
+
# # Mostrar la imagen del artículo
|
759 |
+
# img_url = f"https://www.saneamiento-martinez.com/imagenes/articulos/{code}_1.JPG"
|
760 |
+
# st.image(img_url, width=100)
|
761 |
+
|
762 |
# with col2:
|
763 |
# # Mostrar la descripción del artículo
|
764 |
+
# st.write(f"**{description}**")
|
765 |
+
|
766 |
+
# with col3:
|
767 |
+
# # Caja de número para la cantidad, asociada al código
|
768 |
+
# quantities[code] = st.number_input(f"Cantidad {code}", min_value=0, step=1, key=code)
|
769 |
+
|
770 |
# # Añadir un botón estilizado "Calcular" con icono
|
771 |
# if st.button("🛒 Obtener Recomendaciones"):
|
772 |
# # Crear una lista de artículos basada en los códigos y cantidades
|
|
|
775 |
# quantity = quantities[code]
|
776 |
# if quantity > 0:
|
777 |
# new_basket.extend([code] * quantity) # Añadir el código tantas veces como 'quantity'
|
778 |
+
|
779 |
# if new_basket:
|
780 |
# # Procesar la lista para recomendar
|
781 |
# recommendations_df = recomienda_tf(new_basket, cestas, productos)
|
782 |
+
|
783 |
# if not recommendations_df.empty:
|
784 |
+
# st.success("### Según tu cesta, te recomendamos que consideres añadir estos artículos:")
|
785 |
+
|
786 |
+
# # Mostrar los artículos recomendados con imágenes
|
787 |
+
# for idx, row in recommendations_df.iterrows():
|
788 |
+
# rec_code = row['ARTICULO']
|
789 |
+
# rec_desc = row['DESCRIPCION']
|
790 |
+
# rec_img_url = f"https://www.saneamiento-martinez.com/imagenes/articulos/{rec_code}_1.JPG"
|
791 |
+
|
792 |
+
# rec_col1, rec_col2 = st.columns([1, 3])
|
793 |
+
# with rec_col1:
|
794 |
+
# st.image(rec_img_url, width=100)
|
795 |
+
# with rec_col2:
|
796 |
+
# st.write(f"**{rec_desc}** (Código: {rec_code})")
|
797 |
# else:
|
798 |
# st.warning("⚠️ No recommendations found for the provided basket.")
|
799 |
# else:
|
800 |
# st.warning("⚠️ Please select at least one article and set its quantity.")
|
801 |
+
|
802 |
+
|
803 |
+
|
804 |
+
elif page == "💡 Recomendación de Artículos":
|
805 |
+
# Carga de CSV necesarios cestas y productos
|
806 |
+
cestas = pd.read_csv('cestas.csv')
|
807 |
+
productos = pd.read_csv('productos.csv')
|
808 |
+
# Estilo principal de la página
|
809 |
+
st.markdown(
|
810 |
+
"<h1 style='text-align: center;'>Recomendación de Artículos</h1>",
|
811 |
+
unsafe_allow_html=True
|
812 |
+
)
|
813 |
+
st.markdown("""
|
814 |
+
<p style='text-align: center; color: #5D6D7E;'>Obtén recomendaciones personalizadas para tus clientes basadas en su cesta de compra.</p>
|
815 |
+
""", unsafe_allow_html=True)
|
816 |
+
st.write("### Selecciona los artículos y asigna las cantidades para la cesta:")
|
817 |
+
# Añadir separador para mejorar la segmentación visual
|
818 |
+
st.divider()
|
819 |
+
# Mostrar lista de artículos disponibles (ahora se usa el código asociado a cada descripción)
|
820 |
+
available_articles = productos[['ARTICULO', 'DESCRIPCION']].drop_duplicates()
|
821 |
+
|
822 |
+
# Crear diccionario para asignar las descripciones a los códigos
|
823 |
+
article_dict = dict(zip(available_articles['DESCRIPCION'], available_articles['ARTICULO']))
|
824 |
+
# Permitir seleccionar las descripciones, pero trabajar con los códigos
|
825 |
+
selected_descriptions = st.multiselect("Select Articles", available_articles['DESCRIPCION'].unique())
|
826 |
+
quantities = {}
|
827 |
+
|
828 |
+
if selected_descriptions:
|
829 |
+
st.write("### Selecciona los artículos y las unidades:")
|
830 |
+
for description in selected_descriptions:
|
831 |
+
code = article_dict[description] # Usar el código del artículo
|
832 |
+
col1, col2 = st.columns([1, 3]) # Ajustar proporciones para que las cantidades vayan a la izquierda
|
833 |
+
with col1:
|
834 |
+
# Caja de número para la cantidad, asociada al código
|
835 |
+
quantities[code] = st.number_input(f"Quantity {code}", min_value=0, step=1, key=code)
|
836 |
+
with col2:
|
837 |
+
# Mostrar la descripción del artículo
|
838 |
+
st.write(description)
|
839 |
+
|
840 |
+
# Añadir un botón estilizado "Calcular" con icono
|
841 |
+
if st.button("🛒 Obtener Recomendaciones"):
|
842 |
+
# Crear una lista de artículos basada en los códigos y cantidades
|
843 |
+
new_basket = []
|
844 |
+
for code in quantities:
|
845 |
+
quantity = quantities[code]
|
846 |
+
if quantity > 0:
|
847 |
+
new_basket.extend([code] * quantity) # Añadir el código tantas veces como 'quantity'
|
848 |
+
if new_basket:
|
849 |
+
# Procesar la lista para recomendar
|
850 |
+
recommendations_df = recomienda_tf(new_basket, cestas, productos)
|
851 |
+
|
852 |
+
if not recommendations_df.empty:
|
853 |
+
st.success("### Según tu cesta, te recomendamos que consideres añadir uno de estos artículos:")
|
854 |
+
st.dataframe(recommendations_df, height=300, width=800) # Ajustar el tamaño del DataFrame
|
855 |
+
else:
|
856 |
+
st.warning("⚠️ No recommendations found for the provided basket.")
|
857 |
+
else:
|
858 |
+
st.warning("⚠️ Please select at least one article and set its quantity.")
|