Mise en situation : l'export qu'on vous transmet est réel, donc sale — libellés de région saisis à la main, montants parfois vides ou notés « N/A ». On attend un rapport qui tient debout malgré cela, et qui dit combien de lignes il a dû écarter.
Écrivez sales_summary(csv_text), qui charge un CSV Region,Montant et retourne :
{
"par_region": {<région normalisée>: <total arrondi à 2 décimales>},
"total": <total général arrondi à 2 décimales>,
"region_top": <région au total le plus élevé, ou None>,
"lignes_ignorees": <nombre de lignes écartées faute de montant exploitable>,
}
Règles de traitement :
- Normalisez les libellés avant de grouper :
"nord ","Nord"et"NORD"désignent la même région (.str.strip().str.title()) ; - Convertissez les montants avec
pd.to_numeric(..., errors="coerce"): une valeur non numérique devientNaNau lieu de faire échouer la lecture ; - Écartez les lignes sans montant exploitable et comptez-les — un rapport qui ignore des lignes en silence est un rapport faux ;
- un fichier sans aucune ligne exploitable doit renvoyer des totaux à 0 et
region_topàNone, sans lever d'erreur.