Retour au cours

projet : analyse d'un csv réel et résumé

dans ce mini-projet, vous allez explorer un csv réel, le nettoyer, calculer des statistiques et générer un rapport texte et csv.

objectifs

  • charger un csv (module csv ou pandas selon préférence)
  • nettoyer les colonnes (types, valeurs manquantes, trimming)
  • produire des statistiques (moyennes, counts, top n)
  • sauvegarder un rapport (txt + csv agrégé)

explication détaillée

données attendues

un fichier sales.csv avec au minimum :

  • date (YYYY-MM-DD)
  • product (str)
  • qty (int), price (float)

vous allez calculer : ventes totales, top produits, ventes par mois.

plan

  1. charger csv
  2. normaliser colonnes (strip, types)
  3. traiter valeurs manquantes (supprimer ou imputer)
  4. agréger par produit et par mois
  5. exporter résultats et un rapport texte

exemples exécutables

# version pandas
import pandas as pd

df = pd.read_csv("sales.csv", encoding="utf-8")
df["date"] = pd.to_datetime(df["date"], errors="coerce")
df = df.dropna(subset=["date", "product", "qty", "price"])
df["product"] = df["product"].str.strip().str.title()
df["qty"] = pd.to_numeric(df["qty"], errors="coerce").fillna(0).astype(int)
df["price"] = pd.to_numeric(df["price"], errors="coerce")
df["amount"] = df["qty"] * df["price"]

total_amount = df["amount"].sum()
top_products = (df.groupby("product")["amount"].sum()
                  .sort_values(ascending=False).head(5))
by_month = (df.set_index("date")
              .groupby(pd.Grouper(freq="M"))["amount"].sum())

top_products.to_csv("top_products.csv", encoding="utf-8")
by_month.to_csv("sales_by_month.csv", encoding="utf-8")

with open("report.txt", "w", encoding="utf-8") as f:
    f.write(f"ventes totales: {total_amount:.2f}\n")
    f.write("\nTop produits:\n")
    f.write(top_products.to_string())
    f.write("\n\nVentes par mois:\n")
    f.write(by_month.to_string())
# version standard library csv (agrégation simple)
import csv
from collections import defaultdict
from datetime import datetime

amount_by_product = defaultdict(float)
amount_by_month = defaultdict(float)

with open("sales.csv", newline="", encoding="utf-8") as f:
    r = csv.DictReader(f)
    for row in r:
        try:
            date = datetime.strptime(row["date"].strip(), "%Y-%m-%d").date()
            product = row["product"].strip().title()
            qty = int(float(row["qty"]))
            price = float(row["price"])
        except (KeyError, ValueError):
            continue
        amount = qty * price
        amount_by_product[product] += amount
        month_key = date.replace(day=1).isoformat()
        amount_by_month[month_key] += amount

# exporter
with open("top_products.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    w.writerow(["product", "amount"])
    for k, v in sorted(amount_by_product.items(), key=lambda kv: kv[1], reverse=True)[:5]:
        w.writerow([k, f"{v:.2f}"])

bonnes pratiques

  • valider les colonnes requises avant traitement
  • gérer les erreurs de parsing calmement (ignorer/consigner)
  • toujours définir encoding="utf-8" et newline="" pour csv

pièges courants

  • colonnes typées en str (penser à convertir)
  • dates invalides → errors="coerce" puis dropna
  • séparateur ; au lieu de , (utiliser sep=";" avec pandas)

exercices

  1. ajouter une agrégation par catégorie si la colonne existe.
  2. produire un graphique simple des ventes mensuelles (matplotlib).
  3. créer un script analyse.py avec argparse (--input, --outdir).