GMARTINEZMILLA commited on
Commit
78b679a
1 Parent(s): cf3e94a

feat: generate the filtering by manufacturer not complete

Browse files
Files changed (1) hide show
  1. app.py +99 -9
app.py CHANGED
@@ -723,24 +723,114 @@ elif page == "🕵️ Análisis de Cliente":
723
  # Mostrar el cliente y el fabricante seleccionados
724
  st.write(f"**Cliente seleccionado:** {customer_code}")
725
  st.write(f"**Fabricante seleccionado:** {fabricante_seleccionado}")
 
 
726
  codigo_fabricante_seleccionado = np.int64(nombres_proveedores[nombres_proveedores['nombre'] == fabricante_seleccionado]['codigo'].values[0])
727
-
728
-
729
  st.write(f"**Código fabricante seleccionado:** {codigo_fabricante_seleccionado}")
730
 
 
731
  if codigo_fabricante_seleccionado in marca_id_mapping.classes_:
732
- # Si el código está en el LabelEncoder, hacer la transformación
733
  codigo_fabricante_encoded = marca_id_mapping.transform([codigo_fabricante_seleccionado])[0]
734
  st.write(f"**Código fabricante encoded (marca_id_encoded):** {codigo_fabricante_encoded}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
735
  else:
736
- # Si el código no se encuentra en el LabelEncoder, mostrar advertencia y los códigos disponibles
737
  st.warning(f"El código de fabricante {codigo_fabricante_seleccionado} no se encuentra en el LabelEncoder.")
738
- st.write("Lista de códigos de fabricantes disponibles en el LabelEncoder:")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
739
 
740
- # Imprimir los códigos disponibles y su tipo
741
- available_codes = marca_id_mapping.classes_
742
- st.write(f"**Códigos disponibles:** {available_codes}")
743
- st.write(f"**Tipo de los códigos disponibles:** {type(available_codes[0])}")
744
 
745
 
746
 
 
723
  # Mostrar el cliente y el fabricante seleccionados
724
  st.write(f"**Cliente seleccionado:** {customer_code}")
725
  st.write(f"**Fabricante seleccionado:** {fabricante_seleccionado}")
726
+
727
+ # Obtener el código del fabricante seleccionado
728
  codigo_fabricante_seleccionado = np.int64(nombres_proveedores[nombres_proveedores['nombre'] == fabricante_seleccionado]['codigo'].values[0])
 
 
729
  st.write(f"**Código fabricante seleccionado:** {codigo_fabricante_seleccionado}")
730
 
731
+ # Verificar si el código está presente en el LabelEncoder y obtener su encoded
732
  if codigo_fabricante_seleccionado in marca_id_mapping.classes_:
 
733
  codigo_fabricante_encoded = marca_id_mapping.transform([codigo_fabricante_seleccionado])[0]
734
  st.write(f"**Código fabricante encoded (marca_id_encoded):** {codigo_fabricante_encoded}")
735
+
736
+ # Filtrar datos solo para este fabricante
737
+ with st.spinner("Preparando los datos..."):
738
+ predict_data = pd.read_csv(f'predicts/predict_cluster_{cluster}.csv')
739
+ predict_data['cliente_id'] = predict_data['cliente_id'].astype(str)
740
+ customer_code_str = str(customer_code)
741
+ customer_data = predict_data[(predict_data['cliente_id'] == customer_code_str) &
742
+ (predict_data['marca_id_encoded'] == codigo_fabricante_encoded)]
743
+
744
+ with st.spinner("Generando predicciones de venta..."):
745
+ if not customer_data.empty:
746
+ # Preparar las características
747
+ lag_features = [f'precio_total_lag_{lag}' for lag in range(1, 25)]
748
+ features = lag_features + ['mes', 'marca_id_encoded', 'año', 'cluster_id']
749
+ X_predict = customer_data[features]
750
+
751
+ # Convertir las características categóricas a su dtype correspondiente
752
+ categorical_features = ['mes', 'marca_id_encoded', 'cluster_id']
753
+ for feature in categorical_features:
754
+ X_predict[feature] = X_predict[feature].astype('category')
755
+
756
+ # Realizar la predicción
757
+ y_pred = gbm.predict(X_predict, num_iteration=gbm.best_iteration)
758
+ results = customer_data[['cliente_id', 'marca_id_encoded', 'fecha_mes']].copy()
759
+ results['ventas_predichas'] = y_pred
760
+
761
+ # Cargar datos reales para 2024
762
+ actual_sales = df_agg_2024[(df_agg_2024['cliente_id'] == customer_code_str) &
763
+ (df_agg_2024['marca_id_encoded'] == codigo_fabricante_encoded)]
764
+
765
+ if not actual_sales.empty:
766
+ results = results.merge(actual_sales[['cliente_id', 'marca_id_encoded', 'fecha_mes', 'precio_total']],
767
+ on=['cliente_id', 'marca_id_encoded', 'fecha_mes'], how='left')
768
+ results.rename(columns={'precio_total': 'ventas_reales'}, inplace=True)
769
+ else:
770
+ results['ventas_reales'] = 0
771
+
772
+ results['ventas_reales'].fillna(0, inplace=True)
773
+
774
+ # Generar gráfica y métricas
775
+ fecha_inicio_2023 = pd.to_datetime("2023-01-01")
776
+ fecha_fin_2023 = pd.to_datetime("2023-12-31")
777
+ datos_cliente_total = results.groupby('fecha_mes').agg({'ventas_reales': 'sum', 'ventas_predichas': 'sum'}).reset_index()
778
+
779
+ # Crear la gráfica
780
+ fig = go.Figure()
781
+ fig.add_trace(go.Scatter(x=datos_cliente_total['fecha_mes'], y=datos_cliente_total['ventas_predichas'],
782
+ mode='lines+markers', name='Ventas Predichas', line=dict(color='orange')))
783
+ fig.add_trace(go.Scatter(x=datos_cliente_total['fecha_mes'], y=datos_cliente_total['ventas_reales'],
784
+ mode='lines+markers', name='Ventas Reales', line=dict(color='green')))
785
+ fig.update_layout(title=f"Ventas Predichas y Reales para Cliente {customer_code} y Fabricante {fabricante_seleccionado}",
786
+ xaxis_title="Fecha", yaxis_title="Ventas (€)", height=600)
787
+ st.plotly_chart(fig)
788
+
789
+ # Cálculo de métricas
790
+ datos_2024 = datos_cliente_total[datos_cliente_total['fecha_mes'].dt.year == 2024]
791
+ actual = datos_2024['ventas_reales']
792
+ predicted = datos_2024['ventas_predichas']
793
+ mae = mean_absolute_error(actual, predicted)
794
+ mse = mean_squared_error(actual, predicted)
795
+ rmse = np.sqrt(mse)
796
+ mape = np.mean(np.abs((actual - predicted) / actual)) * 100 if not actual.empty else 0
797
+ smape = np.mean(2 * np.abs(actual - predicted) / (np.abs(actual) + np.abs(predicted))) * 100 if not actual.empty else 0
798
+
799
+ # Mostrar métricas
800
+ st.subheader("Métricas de Predicción (2024)")
801
+ col1, col2, col3, col4 = st.columns(4)
802
+ col1.metric("MAE", f"{mae:.2f} €")
803
+ col2.metric("MAPE", f"{mape:.2f}%")
804
+ col3.metric("RMSE", f"{rmse:.2f} €")
805
+ col4.metric("SMAPE", f"{smape:.2f}%")
806
+ else:
807
+ st.warning(f"No se encontraron datos para el cliente {customer_code} y el fabricante {fabricante_seleccionado}.")
808
  else:
 
809
  st.warning(f"El código de fabricante {codigo_fabricante_seleccionado} no se encuentra en el LabelEncoder.")
810
+
811
+ # else:
812
+ # with st.spinner(f"Mostrando datos para el fabricante {fabricante_seleccionado}..."):
813
+ # # Mostrar el cliente y el fabricante seleccionados
814
+ # st.write(f"**Cliente seleccionado:** {customer_code}")
815
+ # st.write(f"**Fabricante seleccionado:** {fabricante_seleccionado}")
816
+ # codigo_fabricante_seleccionado = np.int64(nombres_proveedores[nombres_proveedores['nombre'] == fabricante_seleccionado]['codigo'].values[0])
817
+
818
+
819
+ # st.write(f"**Código fabricante seleccionado:** {codigo_fabricante_seleccionado}")
820
+
821
+ # if codigo_fabricante_seleccionado in marca_id_mapping.classes_:
822
+ # # Si el código está en el LabelEncoder, hacer la transformación
823
+ # codigo_fabricante_encoded = marca_id_mapping.transform([codigo_fabricante_seleccionado])[0]
824
+ # st.write(f"**Código fabricante encoded (marca_id_encoded):** {codigo_fabricante_encoded}")
825
+ # else:
826
+ # # Si el código no se encuentra en el LabelEncoder, mostrar advertencia y los códigos disponibles
827
+ # st.warning(f"El código de fabricante {codigo_fabricante_seleccionado} no se encuentra en el LabelEncoder.")
828
+ # st.write("Lista de códigos de fabricantes disponibles en el LabelEncoder:")
829
 
830
+ # # Imprimir los códigos disponibles y su tipo
831
+ # available_codes = marca_id_mapping.classes_
832
+ # st.write(f"**Códigos disponibles:** {available_codes}")
833
+ # st.write(f"**Tipo de los códigos disponibles:** {type(available_codes[0])}")
834
 
835
 
836