ParcoursOuvrir l'appli

Calculer les indicateurs

Projet : analyser des ventes · 55 min

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 :

  1. meilleur(totaux) renvoie la clé qui a la plus grande valeur dans le dictionnaire ;
  2. parts(totaux) renvoie un nouveau dictionnaire avec, pour chaque clé, sa part du total en pourcentage, arrondie à 1 chiffre après la virgule avec round(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) ?
  1. "sucre", parce que c'est le plus grand chiffre d'affaires
  2. 40500
  3. "sucre", mais parce que c'est le dernier mot par ordre alphabétique (bonne réponse)
  4. Une erreur