En data, savoir « coder en Python » ne veut rien dire : ce qui compte, c'est nettoyer et fiabiliser de la donnée réelle. Ce test le mesure directement. On fournit un CSV volontairement cassé, et on regarde comment le candidat le diagnostique et le corrige — pas seulement s'il « fait tourner » un script.
Le meilleur signal n'est pas la vitesse, mais l'ordre des gestes : un bon profil regarde les données avant d'agir. Celui qui lance dropna() ou fillna() à l'aveugle se disqualifie tout seul.
« Voici un fichier clients.csv sale. Nettoie-le pour qu'il soit exploitable, et explique tes choix. »
Décrivez au candidat les défauts volontairement introduits dans le fichier (sans lui donner la solution). Il doit les repérer et les traiter proprement.
Avant de corriger, un bon candidat inspecte.
L'ordre des opérations révèle le niveau. On attend d'abord un diagnostic (regarder les données, compter les problèmes), puis un nettoyage justifié, colonne par colonne.
Une solution propre et commentée — accepter les variantes équivalentes.
Voici une correction de référence. L'objectif n'est pas une syntaxe identique, mais la présence des bons réflexes : diagnostic, décisions justifiées, conversions de types.
import pandas as pd
df = pd.read_csv("clients.csv")
# 1) Diagnostic avant toute action
print(df.info())
print(df.isna().sum())
print(df.duplicated().sum())
# 2) Doublons : on garde la premiere occurrence
df = df.drop_duplicates()
# 3) Noms : espaces + casse coherente
df["nom"] = df["nom"].str.strip().str.title()
# 4) Montant : texte -> nombre (retirer symboles et espaces)
df["montant"] = (df["montant"].astype(str)
.str.replace("€", "", regex=False)
.str.replace(" ", "", regex=False)
.str.replace(",", ".", regex=False)
.astype(float))
# 5) Dates : parser en gerant les formats mixtes
df["date_inscription"] = pd.to_datetime(
df["date_inscription"], dayfirst=True, errors="coerce")
# 6) Valeurs manquantes : decision explicite, pas de fillna aveugle
# (ex : on supprime les lignes sans identifiant, on signale le reste)
df = df.dropna(subset=["id"])Signal d'alerte : le red flag numéro un : un candidat qui lance df.dropna() ou df.fillna(0) sur tout le DataFrame sans avoir regardé les données. Le bon réflexe est de décider colonne par colonne.
Notez la démarche autant que le résultat final.
Répartissez les points sur ce que le test veut vraiment mesurer : le diagnostic, la justesse des décisions et la fiabilité du résultat.
| Niveau | Maîtrise attendue | Signal GO | NO-GO |
|---|---|---|---|
| Junior | Nettoie les cas évidents | Repère NA et doublons | Lance dropna/fillna à l'aveugle |
| Confirmé | Traite dates et montant | Décide au cas par cas, convertit les types | Oublie de convertir les types |
| Senior | Diagnostique avant d'agir | Justifie chaque décision, gère les cas limites | Nettoie sans expliquer pourquoi |
| Lead | Rend le tout reproductible | Documente et pense à la réutilisation | Résultat juste mais non reproductible |
Data Builder mène l'entretien technique et vous livre un rapport clair et détaillé sous 24h. Premier entretien offert.