je veux une page en streamlit, qui affiche un forecast brut (raw) (table avec Data, produit, location, quantité) une colonne pour override c'est une colonne input, une colonne calculé du Forecast ajusté, et une colonne input commentaire. pour l'exemple de données à mettre, inspire toi de Chopard, joaillerie
To upload files, please first save the app
import streamlit as st
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
st.title("Chopard - Prévisions des Ventes")
# Création des données d'exemple
def create_sample_data():
products = [
"Happy Diamonds Collier",
"Ice Cube Bracelet",
"L'Heure du Diamant Montre",
"Happy Hearts Bague",
"Alpine Eagle Montre",
"Imperiale Boucles d'oreilles"
]
locations = [
"Paris Vendôme",
"Genève",
"Dubai Mall",
"Hong Kong Central",
"New York 5th Avenue"
]
# Création de dates pour les 3 prochains mois
current_date = datetime.now()
dates = []
for i in range(90):
dates.append(current_date + timedelta(days=i))
# Création du DataFrame
data = []
for date in dates[:30]: # Limitons à 30 jours pour l'exemple
for product in products[:3]: # Limitons à 3 produits pour l'exemple
for location in locations[:3]: # Limitons à 3 locations pour l'exemple
# Génération d'une quantité aléatoire entre 1 et 10
quantity = np.random.randint(1, 11)
data.append({
"Date": date.strftime("%Y-%m-%d"),
"Produit": product,
"Location": location,
"Forecast_Raw": quantity
})
return pd.DataFrame(data)
# Création ou chargement des données
if 'forecast_data' not in st.session_state:
st.session_state.forecast_data = create_sample_data()
st.session_state.forecast_data['Override'] = 0
st.session_state.forecast_data['Commentaire'] = ''
# Affichage et édition des données
st.write("### Table des Prévisions")
# Convertir le DataFrame en une liste de dictionnaires pour faciliter l'édition
edited_df = st.data_editor(
st.session_state.forecast_data,
column_config={
"Date": st.column_config.DateColumn("Date"),
"Produit": st.column_config.Column("Produit", disabled=True),
"Location": st.column_config.Column("Location", disabled=True),
"Forecast_Raw": st.column_config.NumberColumn("Forecast Raw", disabled=True),
"Override": st.column_config.NumberColumn("Override", min_value=0),
"Commentaire": st.column_config.TextColumn("Commentaire")
},
hide_index=True
)
# Calcul du forecast ajusté
edited_df['Forecast_Ajusté'] = edited_df.apply(
lambda row: row['Override'] if row['Override'] > 0 else row['Forecast_Raw'],
axis=1
)
# Affichage des statistiques
st.write("### Résumé des Prévisions")
total_raw = edited_df['Forecast_Raw'].sum()
total_adjusted = edited_df['Forecast_Ajusté'].sum()
diff_percentage = ((total_adjusted - total_raw) / total_raw * 100) if total_raw != 0 else 0
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Total Forecast Raw", f"{total_raw:,.0f}")
with col2:
st.metric("Total Forecast Ajusté", f"{total_adjusted:,.0f}")
with col3:
st.metric("Différence", f"{diff_percentage:.1f}%")
# Filtres
st.sidebar.write("### Filtres")
selected_location = st.sidebar.multiselect(
"Location",
options=edited_df['Location'].unique()
)
selected_product = st.sidebar.multiselect(
"Produit",
options=edited_df['Produit'].unique()
)
# Application des filtres si sélectionnés
filtered_df = edited_df.copy()
if selected_location:
filtered_df = filtered_df[filtered_df['Location'].isin(selected_location)]
if selected_product:
filtered_df = filtered_df[filtered_df['Produit'].isin(selected_product)]
# Affichage des données filtrées
if selected_location or selected_product:
st.write("### Données Filtrées")
st.write(filtered_df)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?