Exercices — Séance 2
Deux parties : reproduire le dashboard de référence, puis l'étendre.
Contexte commun
Vous réutilisez le dataset de ventes et le VentesRepository de la séance 1. Votre base SQLite contient les tables ventes, produits et clients. Le repository expose les méthodes get_ventes(), get_stats(), get_par_region() et get_regions().
Structure de projet
Le fichier app.py Streamlit est à la racine, le code Flask dans un sous-dossier api/ :
projet/
├── app.py # Streamlit (à créer)
├── api/
│ ├── repository.py # VentesRepository (séance 1)
│ └── ...
└── db/
└── ventes.db
Exercice : Partie A — Reproduire le dashboard
Construisez le dashboard décrit dans la section "Premier dashboard complet". Suivez la structure en 7 blocs mais écrivez chaque bloc vous-même sans copier-coller.
Le dashboard doit contenir :
- Configuration —
st.set_page_config()avec layout wide - Repository — initialisé avec
@st.cache_resource - Sidebar — filtres région (
st.selectbox) et année (st.slider) - Données — fonctions de chargement décorées avec
@st.cache_data(ttl=300) - KPI cards — 4 métriques alignées en colonnes (CA total, nombre de ventes, panier moyen, panier max)
- Tableau —
st.dataframe()interactif avec colonnes renommées - Graphique —
st.bar_chart()du CA par région
Critères de validation :
- L'application se lance sans erreur avec
streamlit run app.py - Les filtres de la sidebar modifient les données affichées
- Les 4 KPI cards affichent des valeurs cohérentes avec les filtres sélectionnés
- Le tableau est interactif (tri par colonne fonctionnel)
- Le graphique bar chart s'affiche correctement
- Le graphique affiche un message informatif quand le dataset est vide
Commandes de test :
# Lancer l'application
streamlit run app.py
# Vérifier dans le navigateur :
# 1. Changer la région → les KPIs et le tableau se mettent à jour
# 2. Déplacer le slider année → les données changent
# 3. Cliquer sur un en-tête de colonne → le tableau se trie
Exercice : Partie B — Étendre le dashboard
Ajoutez deux des fonctionnalités suivantes au dashboard de la partie A.
Option 1 — Filtre par catégorie
Ajoutez un st.multiselect() dans la sidebar permettant de filtrer par catégorie de produit. Adaptez les appels au repository en conséquence.
Indice : st.multiselect retourne une liste. Si la liste est vide, affichez toutes les catégories.
Option 2 — Page secondaire « Statistiques »
Créez pages/1_Statistiques.py avec une page dédiée aux statistiques globales :
- Métriques étendues (CA, nombre de ventes, panier moyen, min, max, écart-type)
- Tableau complet
get_par_region()avec toutes les colonnes - Même sidebar de filtres que la page principale
Indice : chaque fichier de page est un script autonome — il peut importer le repository et définir ses propres widgets.
Option 3 — Section debug repliable
Ajoutez un st.expander("Debug — paramètres de requête") en bas du dashboard qui affiche :
- Les filtres actifs (région, année)
- Le nombre de lignes retournées par chaque appel au repository
- Le temps d'exécution des requêtes (utilisez
time.time())
Indice : st.expander() crée une section repliable par défaut.
Option 4 — Métrique calculée côté pandas
Ajoutez un st.metric() supplémentaire dont la valeur est calculée directement sur le DataFrame plutôt que retournée par le repository. Par exemple :
- Nombre de régions distinctes dans les résultats filtrés (
df["region"].nunique()) - Écart-type des montants (
df["montant"].std()) - Pourcentage de ventes au-dessus du panier moyen
Indice : les opérations pandas s'appliquent sur le DataFrame après conversion, avant l'affichage.
À retenir
Progression
- Partie A : assembler les blocs d'un dashboard Streamlit -- configuration, cache, filtres, affichage
- Partie B : étendre le dashboard -- filtres avancés, multi-pages, debug, calculs pandas