Classe de nettoyage et de prétraitement d'un dataset de vins.
Lit un fichier CSV, nettoie les valeurs manquantes, encode les
appellations et exporte le résultat.
Source code in src/cleaning.py
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144 | class Cleaning:
"""
Classe de nettoyage et de prétraitement d'un dataset de vins.
Lit un fichier CSV, nettoie les valeurs manquantes, encode les
appellations et exporte le résultat.
"""
def __init__(self, filename) -> None:
"""
Initialise la classe en lisant le fichier CSV et en convertissant
les colonnes de scores en valeurs numériques.
Args:
filename (str): Chemin vers le fichier CSV à lire.
"""
self._vins: DataFrame = read_csv(filename)
# créer la liste de tout les scores
self.SCORE_COLS: list[str] = [
c for c in self._vins.columns if c not in ["Appellation", "Prix"]
]
# transforme tout les colonnes score en numérique
for col in self.SCORE_COLS:
self._vins[col] = to_numeric(self._vins[col], errors="coerce")
def getVins(self) -> DataFrame:
"""
Retourne une copie du DataFrame nettoyé.
Returns:
DataFrame: Une copie indépendante des données des vins après
nettoyage et prétraitement.
"""
return self._vins.copy(deep=True)
def __str__(self) -> str:
"""
Affiche un résumé du DataFrame
- la taille
- types des colonnes
- valeurs manquantes
- statistiques numériques
"""
return (
f"Shape : {self._vins.shape[0]} lignes x {self._vins.shape[1]} colonnes\n\n"
f"Types des colonnes :\n{self._vins.dtypes}\n\n"
f"Valeurs manquantes :\n{self._vins.isna().sum()}\n\n"
f"Statistiques numériques :\n{self._vins.describe().round(2)}\n\n"
)
def drop_empty_appellation(self) -> "Cleaning":
"""
Supprime les lignes dont l'appellation est manquante.
Returns:
Cleaning: Instance courante pour chaînage des méthodes.
"""
self._vins = self._vins.dropna(subset=["Appellation"])
return self
def _mean_score(self, col: str) -> DataFrame:
"""
Calcule la moyenne d'une colonne de score par appellation.
Étapes :
- Convertit les valeurs en numériques (les erreurs deviennent NaN)
- Regroupe les données par appellation
- Calcule la moyenne des scores pour chaque appellation
- Remplace les valeurs manquantes par 0
Args:
col (str): Nom de la colonne de score.
Returns:
DataFrame: DataFrame contenant les moyennes par appellation.
"""
means = self._vins.groupby("Appellation", as_index=False)[col].mean()
means = means.rename(columns={col: f"mean_{col}"})
return cast(DataFrame, means.fillna(0))
def _mean_robert(self) -> DataFrame:
return self._mean_score("Robert")
def _mean_robinson(self) -> DataFrame:
return self._mean_score("Robinson")
def _mean_suckling(self) -> DataFrame:
return self._mean_score("Suckling")
def fill_missing_scores(self) -> "Cleaning":
"""
Remplace les valeurs manquantes des colonnes de scores par la
moyenne des vins appartenant à la même appellation.
Returns:
Cleaning: Instance courante pour chaînage des méthodes.
"""
for element in self.SCORE_COLS:
means = self._mean_score(element)
self._vins = self._vins.merge(means, on="Appellation", how="left")
mean_col = f"mean_{element}"
self._vins[element] = self._vins[element].fillna(self._vins[mean_col])
self._vins = self._vins.drop(columns=["mean_" + element])
return self
def encode_appellation(self, column: str = "Appellation") -> "Cleaning":
"""
Encode la colonne d'appellation en variables indicatrices (one-hot encoding).
Args:
column (str): Nom de la colonne à encoder (par défaut "Appellation").
Returns:
Cleaning: Instance courante pour chaînage des méthodes.
"""
appellations = self._vins[column].astype(str).str.strip()
appellation_dummies = get_dummies(appellations, prefix="App")
self._vins = self._vins.drop(columns=[column])
self._vins = self._vins.join(appellation_dummies)
return self
def drop_empty_price(self) -> "Cleaning":
"""
Supprime les lignes dont le prix est manquant.
Returns:
Cleaning: Instance courante pour chaînage des méthodes.
"""
self._vins = self._vins.dropna(subset=["Prix"])
return self
|
__init__(filename)
Initialise la classe en lisant le fichier CSV et en convertissant
les colonnes de scores en valeurs numériques.
Parameters:
| Name |
Type |
Description |
Default |
filename
|
str
|
Chemin vers le fichier CSV à lire.
|
required
|
Source code in src/cleaning.py
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 | def __init__(self, filename) -> None:
"""
Initialise la classe en lisant le fichier CSV et en convertissant
les colonnes de scores en valeurs numériques.
Args:
filename (str): Chemin vers le fichier CSV à lire.
"""
self._vins: DataFrame = read_csv(filename)
# créer la liste de tout les scores
self.SCORE_COLS: list[str] = [
c for c in self._vins.columns if c not in ["Appellation", "Prix"]
]
# transforme tout les colonnes score en numérique
for col in self.SCORE_COLS:
self._vins[col] = to_numeric(self._vins[col], errors="coerce")
|
getVins()
Retourne une copie du DataFrame nettoyé.
Returns:
| Name | Type |
Description |
DataFrame |
DataFrame
|
Une copie indépendante des données des vins après
|
|
DataFrame
|
nettoyage et prétraitement.
|
Source code in src/cleaning.py
38
39
40
41
42
43
44
45
46 | def getVins(self) -> DataFrame:
"""
Retourne une copie du DataFrame nettoyé.
Returns:
DataFrame: Une copie indépendante des données des vins après
nettoyage et prétraitement.
"""
return self._vins.copy(deep=True)
|
drop_empty_appellation()
Supprime les lignes dont l'appellation est manquante.
Returns:
| Name | Type |
Description |
Cleaning |
Cleaning
|
Instance courante pour chaînage des méthodes.
|
Source code in src/cleaning.py
63
64
65
66
67
68
69
70
71 | def drop_empty_appellation(self) -> "Cleaning":
"""
Supprime les lignes dont l'appellation est manquante.
Returns:
Cleaning: Instance courante pour chaînage des méthodes.
"""
self._vins = self._vins.dropna(subset=["Appellation"])
return self
|
fill_missing_scores()
Remplace les valeurs manquantes des colonnes de scores par la
moyenne des vins appartenant à la même appellation.
Returns:
| Name | Type |
Description |
Cleaning |
Cleaning
|
Instance courante pour chaînage des méthodes.
|
Source code in src/cleaning.py
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 | def fill_missing_scores(self) -> "Cleaning":
"""
Remplace les valeurs manquantes des colonnes de scores par la
moyenne des vins appartenant à la même appellation.
Returns:
Cleaning: Instance courante pour chaînage des méthodes.
"""
for element in self.SCORE_COLS:
means = self._mean_score(element)
self._vins = self._vins.merge(means, on="Appellation", how="left")
mean_col = f"mean_{element}"
self._vins[element] = self._vins[element].fillna(self._vins[mean_col])
self._vins = self._vins.drop(columns=["mean_" + element])
return self
|
encode_appellation(column='Appellation')
Encode la colonne d'appellation en variables indicatrices (one-hot encoding).
Parameters:
| Name |
Type |
Description |
Default |
column
|
str
|
Nom de la colonne à encoder (par défaut "Appellation").
|
'Appellation'
|
Returns:
| Name | Type |
Description |
Cleaning |
Cleaning
|
Instance courante pour chaînage des méthodes.
|
Source code in src/cleaning.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 | def encode_appellation(self, column: str = "Appellation") -> "Cleaning":
"""
Encode la colonne d'appellation en variables indicatrices (one-hot encoding).
Args:
column (str): Nom de la colonne à encoder (par défaut "Appellation").
Returns:
Cleaning: Instance courante pour chaînage des méthodes.
"""
appellations = self._vins[column].astype(str).str.strip()
appellation_dummies = get_dummies(appellations, prefix="App")
self._vins = self._vins.drop(columns=[column])
self._vins = self._vins.join(appellation_dummies)
return self
|