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
csvoupandasselon 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
- charger csv
- normaliser colonnes (strip, types)
- traiter valeurs manquantes (supprimer ou imputer)
- agréger par produit et par mois
- 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"etnewline=""pour csv
pièges courants
- colonnes typées en
str(penser à convertir) - dates invalides →
errors="coerce"puisdropna - séparateur
;au lieu de,(utilisersep=";"avec pandas)
exercices
- ajouter une agrégation par catégorie si la colonne existe.
- produire un graphique simple des ventes mensuelles (matplotlib).
- créer un script
analyse.pyavecargparse(--input,--outdir).