Skip to content

Cleaning

Sommaire


Classe 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.

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