GMARTINEZMILLA commited on
Commit
7ada3ff
·
1 Parent(s): 1ce52f7

feat: Added about section underneath table in col 3

Browse files
Files changed (1) hide show
  1. app.py +107 -96
app.py CHANGED
@@ -11,6 +11,7 @@ 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")
@@ -111,6 +112,11 @@ def get_supplier_name(code):
111
  name = nombres_proveedores[nombres_proveedores['codigo'] == code]['nombre'].values
112
  return name[0] if len(name) > 0 else code
113
 
 
 
 
 
 
114
  def get_supplier_name_encoded(encoded_code):
115
  try:
116
  # Ensure the encoded code is an integer
@@ -719,54 +725,129 @@ 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
@@ -775,84 +856,14 @@ elif page == "🕵️ Análisis de Cliente":
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.")
 
11
  from sklearn.metrics import mean_absolute_error, mean_squared_error
12
  from joblib import dump, load
13
  from utils import recomienda_tf
14
+ import requests
15
 
16
  # Page configuration
17
  st.set_page_config(page_title="DeepInsightz", page_icon=":bar_chart:", layout="wide")
 
112
  name = nombres_proveedores[nombres_proveedores['codigo'] == code]['nombre'].values
113
  return name[0] if len(name) > 0 else code
114
 
115
+ def image_exists(url):
116
+ """Verifica si la imagen existe en la URL proporcionada"""
117
+ response = requests.head(url)
118
+ return response.status_code == 200
119
+
120
  def get_supplier_name_encoded(encoded_code):
121
  try:
122
  # Ensure the encoded code is an integer
 
725
  st.warning(f"No predicted or actual data found for customer {customer_code} for 2024.")
726
 
727
  # Customer Recommendations Page
728
+ elif page == "💡 Recomendación de Artículos":
729
+ # Carga de CSV necesarios cestas y productos
730
+ cestas = pd.read_csv('cestas.csv')
731
+ productos = pd.read_csv('productos.csv')
732
+
733
+ # Estilo principal de la página
734
+ st.markdown(
735
+ "<h1 style='text-align: center;'>Recomendación de Artículos</h1>",
736
+ unsafe_allow_html=True
737
+ )
738
+ 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)
739
+
740
+ st.write("### Selecciona los artículos y asigna las cantidades para la cesta:")
741
+
742
+ # Añadir separador para mejorar la segmentación visual
743
+ st.divider()
744
+
745
+ # Mostrar lista de artículos disponibles (ahora se usa el código asociado a cada descripción)
746
+ available_articles = productos[['ARTICULO', 'DESCRIPCION']].drop_duplicates()
747
+
748
+ # Crear diccionario para asignar las descripciones a los códigos
749
+ article_dict = dict(zip(available_articles['DESCRIPCION'], available_articles['ARTICULO']))
750
+
751
+ # Permitir seleccionar las descripciones, pero trabajar con los códigos
752
+ selected_descriptions = st.multiselect("Selecciona los artículos", available_articles['DESCRIPCION'].unique())
753
+
754
+ quantities = {}
755
+
756
+ if selected_descriptions:
757
+ st.write("### Selecciona los artículos, las unidades, y visualiza la imagen:")
758
+
759
+ for description in selected_descriptions:
760
+ code = article_dict[description] # Usar el código del artículo
761
+ col1, col2, col3 = st.columns([1, 2, 2]) # Ajustar proporciones para que las imágenes y textos se alineen
762
+
763
+ with col1:
764
+ # Mostrar la imagen del artículo
765
+ img_url = f"https://www.saneamiento-martinez.com/imagenes/articulos/{code}_1.JPG"
766
+ st.image(img_url, width=100)
767
+
768
+ with col2:
769
+ # Mostrar la descripción del artículo
770
+ st.write(f"**{description}**")
771
+
772
+ with col3:
773
+ # Caja de número para la cantidad, asociada al código
774
+ quantities[code] = st.number_input(f"Cantidad {code}", min_value=0, step=1, key=code)
775
+
776
+ # Añadir un botón estilizado "Calcular" con icono
777
+ if st.button("🛒 Obtener Recomendaciones"):
778
+ # Crear una lista de artículos basada en los códigos y cantidades
779
+ new_basket = []
780
+ for code in quantities:
781
+ quantity = quantities[code]
782
+ if quantity > 0:
783
+ new_basket.extend([code] * quantity) # Añadir el código tantas veces como 'quantity'
784
+
785
+ if new_basket:
786
+ # Procesar la lista para recomendar utilizando tu función 'recomienda_tf'
787
+ recommendations_df = recomienda_tf(new_basket, cestas, productos)
788
+
789
+ if not recommendations_df.empty:
790
+ st.success("### Según tu cesta, te recomendamos que consideres añadir estos artículos:")
791
+
792
+ # Mostrar los artículos recomendados con imágenes y relevancia
793
+ for idx, row in recommendations_df.iterrows():
794
+ rec_code = row['ARTICULO']
795
+ rec_desc = row['DESCRIPCION']
796
+ rec_relevance = row['RELEVANCIA'] # Usar la relevancia calculada
797
+ rec_img_url = f"https://www.saneamiento-martinez.com/imagenes/articulos/{rec_code}_1.JPG"
798
+
799
+ # Verificar si la imagen existe antes de mostrar el artículo
800
+ if image_exists(rec_img_url):
801
+ rec_col1, rec_col2, rec_col3 = st.columns([1, 3, 1]) # Añadir una columna para la relevancia
802
+ with rec_col1:
803
+ st.image(rec_img_url, width=100)
804
+ with rec_col2:
805
+ st.write(f"**{rec_desc}** (Código: {rec_code})")
806
+ with rec_col3:
807
+ st.write(f"Relevancia: {rec_relevance:.4f}") # Mostrar la relevancia con 4 decimales
808
+ else:
809
+ st.warning("⚠️ No se encontraron recomendaciones para la cesta proporcionada.")
810
+ else:
811
+ st.warning("⚠️ Por favor selecciona al menos un artículo y define su cantidad.")
812
+
813
+
814
+
815
  # elif page == "💡 Recomendación de Artículos":
816
  # # Carga de CSV necesarios cestas y productos
817
  # cestas = pd.read_csv('cestas.csv')
818
  # productos = pd.read_csv('productos.csv')
 
819
  # # Estilo principal de la página
820
  # st.markdown(
821
  # "<h1 style='text-align: center;'>Recomendación de Artículos</h1>",
822
  # unsafe_allow_html=True
823
  # )
824
+ # st.markdown("""
825
+ # <p style='text-align: center; color: #5D6D7E;'>Obtén recomendaciones personalizadas para tus clientes basadas en su cesta de compra.</p>
826
+ # """, unsafe_allow_html=True)
827
  # st.write("### Selecciona los artículos y asigna las cantidades para la cesta:")
 
828
  # # Añadir separador para mejorar la segmentación visual
829
  # st.divider()
 
830
  # # Mostrar lista de artículos disponibles (ahora se usa el código asociado a cada descripción)
831
  # available_articles = productos[['ARTICULO', 'DESCRIPCION']].drop_duplicates()
832
+
833
  # # Crear diccionario para asignar las descripciones a los códigos
834
  # article_dict = dict(zip(available_articles['DESCRIPCION'], available_articles['ARTICULO']))
 
835
  # # Permitir seleccionar las descripciones, pero trabajar con los códigos
836
  # selected_descriptions = st.multiselect("Select Articles", available_articles['DESCRIPCION'].unique())
 
837
  # quantities = {}
838
+
839
  # if selected_descriptions:
840
+ # st.write("### Selecciona los artículos y las unidades:")
 
841
  # for description in selected_descriptions:
842
  # code = article_dict[description] # Usar el código del artículo
843
+ # col1, col2 = st.columns([1, 3]) # Ajustar proporciones para que las cantidades vayan a la izquierda
 
844
  # with col1:
845
+ # # Caja de número para la cantidad, asociada al código
846
+ # quantities[code] = st.number_input(f"Quantity {code}", min_value=0, step=1, key=code)
 
 
847
  # with col2:
848
  # # Mostrar la descripción del artículo
849
+ # st.write(description)
850
+
 
 
 
 
851
  # # Añadir un botón estilizado "Calcular" con icono
852
  # if st.button("🛒 Obtener Recomendaciones"):
853
  # # Crear una lista de artículos basada en los códigos y cantidades
 
856
  # quantity = quantities[code]
857
  # if quantity > 0:
858
  # new_basket.extend([code] * quantity) # Añadir el código tantas veces como 'quantity'
 
859
  # if new_basket:
860
  # # Procesar la lista para recomendar
861
  # recommendations_df = recomienda_tf(new_basket, cestas, productos)
862
+
863
  # if not recommendations_df.empty:
864
+ # st.success("### Según tu cesta, te recomendamos que consideres añadir uno de estos artículos:")
865
+ # st.dataframe(recommendations_df, height=300, width=800) # Ajustar el tamaño del DataFrame
 
 
 
 
 
 
 
 
 
 
 
866
  # else:
867
  # st.warning("⚠️ No recommendations found for the provided basket.")
868
  # else:
869
  # st.warning("⚠️ Please select at least one article and set its quantity.")