Spaces:
Sleeping
Sleeping
Changed position of predicted results values for customer analysis.
Browse files
app.py
CHANGED
@@ -512,30 +512,6 @@ elif page == "🕵️ Análisis de Cliente":
|
|
512 |
# Mostrar la gráfica en Streamlit
|
513 |
st.plotly_chart(fig)
|
514 |
|
515 |
-
# Calculate metrics for 2024 data
|
516 |
-
datos_2024 = datos_combinados[datos_combinados['fecha_mes'].dt.year == 2024]
|
517 |
-
actual = datos_2024['ventas_reales']
|
518 |
-
predicted = datos_2024['ventas_predichas']
|
519 |
-
|
520 |
-
def calculate_mape(y_true, y_pred):
|
521 |
-
mask = y_true != 0
|
522 |
-
return np.mean(np.abs((y_true[mask] - y_pred[mask]) / y_true[mask])) * 100
|
523 |
-
|
524 |
-
mae = mean_absolute_error(actual, predicted)
|
525 |
-
mse = mean_squared_error(actual, predicted)
|
526 |
-
rmse = np.sqrt(mse)
|
527 |
-
mape = calculate_mape(actual, predicted)
|
528 |
-
smape = np.mean(2 * np.abs(actual - predicted) / (np.abs(actual) + np.abs(predicted))) * 100
|
529 |
-
|
530 |
-
# Display metrics
|
531 |
-
st.subheader("Métricas de Predicción (2024)")
|
532 |
-
col1, col2, col3, col4 = st.columns(4)
|
533 |
-
col1.metric("MAE", f"{mae:.2f} €",help="Promedio de la diferencia absoluta entre las predicciones y los valores reales.")
|
534 |
-
col2.metric("MAPE", f"{mape:.2f}%",help="Porcentaje promedio de error en las predicciones.")
|
535 |
-
col3.metric("RMSE", f"{rmse:.2f} €",help="Medida de la desviación estándar de los residuos de predicción.")
|
536 |
-
col4.metric("SMAPE", f"{smape:.2f}%",help="Alternativa al MAPE que maneja mejor los valores cercanos a cero.")
|
537 |
-
|
538 |
-
|
539 |
# Split space into two columns
|
540 |
col1, col2 = st.columns(2)
|
541 |
|
@@ -746,6 +722,28 @@ elif page == "🕵️ Análisis de Cliente":
|
|
746 |
else:
|
747 |
st.warning(f"No predicted or actual data found for customer {customer_code} for 2024.")
|
748 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
749 |
else:
|
750 |
with st.spinner(f"Seleccionando el modelo predictivo..."):
|
751 |
# Load the Corresponding Model
|
@@ -845,30 +843,6 @@ elif page == "🕵️ Análisis de Cliente":
|
|
845 |
else:
|
846 |
st.warning(f"El código de fabricante {codigo_fabricante_seleccionado} no se encuentra en el LabelEncoder.")
|
847 |
|
848 |
-
# else:
|
849 |
-
# with st.spinner(f"Mostrando datos para el fabricante {fabricante_seleccionado}..."):
|
850 |
-
# # Mostrar el cliente y el fabricante seleccionados
|
851 |
-
# st.write(f"**Cliente seleccionado:** {customer_code}")
|
852 |
-
# st.write(f"**Fabricante seleccionado:** {fabricante_seleccionado}")
|
853 |
-
# codigo_fabricante_seleccionado = np.int64(nombres_proveedores[nombres_proveedores['nombre'] == fabricante_seleccionado]['codigo'].values[0])
|
854 |
-
|
855 |
-
|
856 |
-
# st.write(f"**Código fabricante seleccionado:** {codigo_fabricante_seleccionado}")
|
857 |
-
|
858 |
-
# if codigo_fabricante_seleccionado in marca_id_mapping.classes_:
|
859 |
-
# # Si el código está en el LabelEncoder, hacer la transformación
|
860 |
-
# codigo_fabricante_encoded = marca_id_mapping.transform([codigo_fabricante_seleccionado])[0]
|
861 |
-
# st.write(f"**Código fabricante encoded (marca_id_encoded):** {codigo_fabricante_encoded}")
|
862 |
-
# else:
|
863 |
-
# # Si el código no se encuentra en el LabelEncoder, mostrar advertencia y los códigos disponibles
|
864 |
-
# st.warning(f"El código de fabricante {codigo_fabricante_seleccionado} no se encuentra en el LabelEncoder.")
|
865 |
-
# st.write("Lista de códigos de fabricantes disponibles en el LabelEncoder:")
|
866 |
-
|
867 |
-
# # Imprimir los códigos disponibles y su tipo
|
868 |
-
# available_codes = marca_id_mapping.classes_
|
869 |
-
# st.write(f"**Códigos disponibles:** {available_codes}")
|
870 |
-
# st.write(f"**Tipo de los códigos disponibles:** {type(available_codes[0])}")
|
871 |
-
|
872 |
|
873 |
|
874 |
# Customer Recommendations Page
|
|
|
512 |
# Mostrar la gráfica en Streamlit
|
513 |
st.plotly_chart(fig)
|
514 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
515 |
# Split space into two columns
|
516 |
col1, col2 = st.columns(2)
|
517 |
|
|
|
722 |
else:
|
723 |
st.warning(f"No predicted or actual data found for customer {customer_code} for 2024.")
|
724 |
|
725 |
+
# Calculate metrics for 2024 data
|
726 |
+
datos_2024 = datos_combinados[datos_combinados['fecha_mes'].dt.year == 2024]
|
727 |
+
actual = datos_2024['ventas_reales']
|
728 |
+
predicted = datos_2024['ventas_predichas']
|
729 |
+
|
730 |
+
def calculate_mape(y_true, y_pred):
|
731 |
+
mask = y_true != 0
|
732 |
+
return np.mean(np.abs((y_true[mask] - y_pred[mask]) / y_true[mask])) * 100
|
733 |
+
|
734 |
+
mae = mean_absolute_error(actual, predicted)
|
735 |
+
mse = mean_squared_error(actual, predicted)
|
736 |
+
rmse = np.sqrt(mse)
|
737 |
+
mape = calculate_mape(actual, predicted)
|
738 |
+
smape = np.mean(2 * np.abs(actual - predicted) / (np.abs(actual) + np.abs(predicted))) * 100
|
739 |
+
|
740 |
+
# Display metrics
|
741 |
+
st.subheader("Métricas de Predicción (2024)")
|
742 |
+
col1, col2, col3 = st.columns(3)
|
743 |
+
col1.metric("MAE", f"{mae:.2f} €",help="Promedio de la diferencia absoluta entre las predicciones y los valores reales.")
|
744 |
+
col2.metric("MAPE", f"{mape:.2f}%",help="Porcentaje promedio de error en las predicciones.")
|
745 |
+
col3.metric("RMSE", f"{rmse:.2f} €",help="Medida de la desviación estándar de los residuos de predicción.")
|
746 |
+
|
747 |
else:
|
748 |
with st.spinner(f"Seleccionando el modelo predictivo..."):
|
749 |
# Load the Corresponding Model
|
|
|
843 |
else:
|
844 |
st.warning(f"El código de fabricante {codigo_fabricante_seleccionado} no se encuentra en el LabelEncoder.")
|
845 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
846 |
|
847 |
|
848 |
# Customer Recommendations Page
|