Spaces:
Sleeping
Sleeping
GMARTINEZMILLA
commited on
Commit
•
78b679a
1
Parent(s):
cf3e94a
feat: generate the filtering by manufacturer not complete
Browse files
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
739 |
|
740 |
-
|
741 |
-
|
742 |
-
|
743 |
-
|
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 |
|