Intermédiaire

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

Moyen

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 :

  1. Configurationst.set_page_config() avec layout wide
  2. Repository — initialisé avec @st.cache_resource
  3. Sidebar — filtres région (st.selectbox) et année (st.slider)
  4. Données — fonctions de chargement décorées avec @st.cache_data(ttl=300)
  5. KPI cards — 4 métriques alignées en colonnes (CA total, nombre de ventes, panier moyen, panier max)
  6. Tableaust.dataframe() interactif avec colonnes renommées
  7. Graphiquest.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 :

bash
# 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

Difficile

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