Calculer les indicateurs
Des questions aux indicateurs
Les données sont propres. Place aux questions de Mama Brigitte. Chacune devient un indicateur.
| Question | Indicateur | Calcul |
|---|---|---|
| Combien ai-je gagné ? | chiffre d'affaires | somme de quantité x prix |
| Combien de ventes ? | nombre de ventes | len(ventes) |
| Combien par vente, en moyenne ? | panier moyen | chiffre d'affaires / nombre de ventes |
| Quel produit rapporte le plus ? | CA par produit, puis le plus grand | regroupement |
| Quel mois est le meilleur ? | CA par mois | regroupement |
| Qui vend le plus ? | CA par vendeur | regroupement |
Trois des six questions sont des regroupements. Tu les as vus avec le compteur de mots : un dictionnaire où chaque clé accumule son total. Tu vas écrire une seule fonction de regroupement, qui servira pour les trois.
Dans tous les exercices de ce cours, la fonction lire_ventes du cours 1 est déjà écrite en haut du code, et la liste ventes est prête.
Exercice : Chiffre d'affaires et panier moyen
Écris chiffre_affaires(ventes) qui renvoie le total des ventes, puis panier_moyen(ventes) qui renvoie le panier moyen arrondi à l'entier, en réutilisant chiffre_affaires. Si la liste est vide, panier_moyen renvoie 0 (on ne divise jamais par zéro).
Voir une solution
def lire_ventes(nom_fichier):
"""Lit un fichier CSV de ventes et renvoie une liste de dictionnaires."""
with open(nom_fichier, encoding="utf-8") as f:
lignes = f.read().splitlines()
ventes = []
for ligne in lignes[1:]:
date, produit, quantite, prix, vendeur = ligne.split(",")
ventes.append({
"date": date,
"produit": produit,
"quantite": int(quantite),
"prix": int(prix),
"vendeur": vendeur,
})
return ventes
def chiffre_affaires(ventes):
"""Renvoie la somme de quantite x prix sur toutes les ventes."""
total = 0
for v in ventes:
total += v["quantite"] * v["prix"]
return total
def panier_moyen(ventes):
"""Renvoie le montant moyen d'une vente, arrondi à l'entier."""
if len(ventes) == 0:
return 0
return round(chiffre_affaires(ventes) / len(ventes))
ventes = lire_ventes("ventes.csv")
print(chiffre_affaires(ventes), "FCFA")
print(panier_moyen(ventes), "FCFA par vente")Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Une fonction de regroupement pour tout
Pour le CA par produit, on parcourt les ventes et on accumule dans un dictionnaire, comme le compteur de mots :
totaux = {}
for v in ventes:
totaux[v["produit"]] = totaux.get(v["produit"], 0) + v["quantite"] * v["prix"]
Pour le CA par vendeur, c'est le même code, avec v["vendeur"] à la place de v["produit"]. Au lieu de copier-coller, on met la clé en paramètre :
def ca_par(ventes, cle):
...
totaux[v[cle]] = ...
ca_par(ventes, "produit") regroupe par produit, ca_par(ventes, "vendeur") par vendeur. Une fonction, plusieurs usages.
Exercice : La brique de regroupement : ca_par
Écris ca_par(ventes, cle), qui renvoie un dictionnaire : pour chaque valeur trouvée dans la colonne cle, le chiffre d'affaires correspondant.
Voir une solution
def lire_ventes(nom_fichier):
"""Lit un fichier CSV de ventes et renvoie une liste de dictionnaires."""
with open(nom_fichier, encoding="utf-8") as f:
lignes = f.read().splitlines()
ventes = []
for ligne in lignes[1:]:
date, produit, quantite, prix, vendeur = ligne.split(",")
ventes.append({
"date": date,
"produit": produit,
"quantite": int(quantite),
"prix": int(prix),
"vendeur": vendeur,
})
return ventes
def ca_par(ventes, cle):
"""Renvoie un dictionnaire : pour chaque valeur de la clé, son chiffre d'affaires."""
totaux = {}
for v in ventes:
totaux[v[cle]] = totaux.get(v[cle], 0) + v["quantite"] * v["prix"]
return totaux
ventes = lire_ventes("ventes.csv")
print(ca_par(ventes, "produit"))
print(ca_par(ventes, "vendeur"))Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Regrouper par mois avec une tranche
Il n'y a pas de colonne « mois » dans le fichier. Mais la date "2026-03-14" contient le mois : ce sont ses 7 premiers caractères, "2026-03".
date = "2026-03-14"
print(date[:7]) # 2026-03
Une tranche de texte marche comme une tranche de liste : date[:7] prend les caractères d'index 0 à 6.
Pourquoi garder l'année ("2026-03") et pas seulement "03" ? Parce que l'an prochain, mars 2027 ne doit pas s'additionner à mars 2026.
Exercice : Le meilleur mois
Écris ca_par_mois(ventes) qui renvoie le chiffre d'affaires de chaque mois, avec des clés comme "2026-01".
Voir une solution
def lire_ventes(nom_fichier):
"""Lit un fichier CSV de ventes et renvoie une liste de dictionnaires."""
with open(nom_fichier, encoding="utf-8") as f:
lignes = f.read().splitlines()
ventes = []
for ligne in lignes[1:]:
date, produit, quantite, prix, vendeur = ligne.split(",")
ventes.append({
"date": date,
"produit": produit,
"quantite": int(quantite),
"prix": int(prix),
"vendeur": vendeur,
})
return ventes
def ca_par_mois(ventes):
"""Renvoie le chiffre d'affaires de chaque mois (clé : AAAA-MM)."""
totaux = {}
for v in ventes:
mois = v["date"][:7]
totaux[mois] = totaux.get(mois, 0) + v["quantite"] * v["prix"]
return totaux
ventes = lire_ventes("ventes.csv")
print(ca_par_mois(ventes))Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Trouver le plus grand
On a {"Awa": 39150, "Paul": 64300, "Mireille": 38600}. Qui est le premier ? max(totaux) ne marche pas comme on veut : sur un dictionnaire, max compare les clés, donc les noms par ordre alphabétique, et renverrait "Paul" ici par hasard.
Tu connais key= avec sorted. max l'accepte aussi : key dit sur quoi comparer.
max(totaux, key=totaux.get) # "Paul"
Pour chaque clé, max appelle totaux.get(cle), c'est-à-dire sa valeur, et garde la clé dont la valeur est la plus grande. Ici, on passe la méthode totaux.get sans parenthèses : on donne la fonction elle-même, et c'est max qui l'appellera.
Les pourcentages
« Le sucre fait 40 500 FCFA » parle moins que « le sucre fait 28,5 % du chiffre d'affaires ». Une part en pourcentage, c'est valeur / total * 100.
Exercice : Le meilleur et les parts
Écris deux briques :
meilleur(totaux)renvoie la clé qui a la plus grande valeur dans le dictionnaire ;parts(totaux)renvoie un nouveau dictionnaire avec, pour chaque clé, sa part du total en pourcentage, arrondie à 1 chiffre après la virgule avecround(x, 1).
Voir une solution
def meilleur(totaux):
"""Renvoie la clé qui a la plus grande valeur."""
return max(totaux, key=totaux.get)
def parts(totaux):
"""Renvoie la part de chaque clé dans le total, en %, arrondie à 0,1."""
total = sum(totaux.values())
return {k: round(v / total * 100, 1) for k, v in totaux.items()}
vendeurs = {"Awa": 39150, "Paul": 64300, "Mireille": 38600}
print(meilleur(vendeurs))
print(parts(vendeurs))Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Teste-toi
totaux = {"riz": 34800, "huile": 28500, "sucre": 40500}. Que renvoie max(totaux) (sans key) ?
"sucre", parce que c'est le plus grand chiffre d'affaires40500"sucre", mais parce que c'est le dernier mot par ordre alphabétique (bonne réponse)- Une erreur