- Construire le jeu de données de test
Commençons par créer un dataframe exemple pour illustrer les différentes techniques d'encodage.
import pandas as pd
import numpy as np
# Génération d'un dataframe de démonstration
donnees = pd.DataFrame({
'Statut': ['H', 'F', 'H', 'H', 'H', 'F', 'H', 'F', 'F', 'F'],
'Module': ['Francais', 'C', 'Maths', 'Python', 'Java', 'PHP', 'Linux', 'SQL', 'Python', 'C++'],
'Resultat': np.random.randint(0, 100, 10)
})
# Exemple de sortie :
# Statut Module Resultat
# 0 H Francais 45
# 1 F C 82
# 2 H Maths 67
# 3 H Python 33
# 4 H Java 78
# 5 F PHP 91
# 6 H Linux 12
# 7 F SQL 56
# 8 F Python 73
# 9 F C++ 28
- Fonction personnalisée avec itération
Utilisons une fonction dédiée pour catégoriser les résultats, appliquée via une boucle.
def categoriser_resultat(val):
if val >= 90:
return 'Excellent'
elif 80 <= val < 90:
return 'Bien'
elif 70 <= val < 80:
return 'Satisfaisant'
elif 60 <= val < 70:
return 'Passable'
else:
return 'Insuffisant'
donnees['Categorie'] = None
for idx in range(len(donnees)):
donnees.iloc[idx, 3] = categoriser_resultat(donnees.iloc[idx, 2])
- Fonction personnalisée avec map
Appliquons la même fonction de manière plus efficace avec la méthode map.
donnees['Categorie_2'] = donnees['Resultat'].map(categoriser_resultat)
- Fonction personnalisée avec apply
Alternative utilisant apply avec une lambda, bien que cette approche puisse être moins performante pour de grands volumes de données.
donnees['Categorie_3'] = donnees['Resultat'].apply(
lambda x: 'Excellent' if x >= 90
else ('Bien' if 80 <= x < 90
else ('Satisfaisant' if 70 <= x < 80
else ('Passable' if 60 <= x < 70
else 'Insuffisant')))
)
- Utilisation de pd.cut pour la segmentation
La fonction cut permet de diviser les données en intervalles prédéfinis.
seuils = [0, 59, 69, 79, 89, 100]
donnees['Categorie_4'] = pd.cut(donnees['Resultat'], seuils, labels=['Insuffisant', 'Passable', 'Satisfaisant', 'Bien', 'Excellent'])
- Binarisation avec scikit-learn
Transformons les scores en valeurs binaires en utilisant un seuil spécifique.
from sklearn.preprocessing import Binarizer
binariseur = Binarizer(threshold=60)
donnees['Resultat_binaire'] = binariseur.fit_transform(np.array(donnees['Resultat']).reshape(-1, 1))
- Encodage par remplacement avec replace
Convertissons des catégories textuelles en valeurs numériques via replace.
donnees['Statut_code'] = donnees['Statut'].replace(['H', 'F'], [0, 1])
- Conversion en dictionnaire avec value_counts
Créons un mapping basé sur la fréquence des valeurs pour encoder les modules.
frequence_modules = donnees['Module'].value_counts().index
carte_modules = {valeur: idx for idx, valeur in enumerate(frequence_modules)}
donnees['Module_code'] = donnees.replace({'Module': carte_modules})['Module']
- Encodage avec set et map
Générons un dictionnaire d'encodage à partir des valeurs uniques.
modules_uniques = set(donnees['Module'])
carte_encodage = {v: i for i, v in enumerate(modules_uniques)}
donnees['Module_code_2'] = donnees['Module'].map(carte_encodage)
- Conversion en type catégorie avec astype
Utilisons le type catégorie de pandas pour encoder automatiquement.
donnees['Module_categorie'] = donnees['Module'].astype('category')
donnees['Module_code_3'] = donnees['Module_categorie'].cat.codes
- Encodage avec LabelEncoder de scikit-learn
Appliquons l'encodeur de labels pour transformer des colonnes spécifiques.
from sklearn.preprocessing import LabelEncoder
encodeur1 = LabelEncoder()
encodeur1.fit(donnees['Statut'])
donnees['Statut_code_2'] = encodeur1.transform(donnees['Statut'])
encodeur2 = LabelEncoder()
donnees['Module_code_4'] = encodeur2.fit_transform(donnees['Module'])
- Encodage ordinal avec OrdinalEncoder
L'encodeur ordinal permet de transformer plusieurs colonnes simultanément.
from sklearn.preprocessing import OrdinalEncoder
encodeur_ordinal = OrdinalEncoder()
encodeur_ordinal.fit(donnees[['Statut', 'Module']])
donnees[['Statut_code_3', 'Module_code_5']] = encodeur_ordinal.transform(donnees[['Statut', 'Module']])
- Encodage séquentiel avec factorize
La méthode factorize attribue des codes basés sur l'ordre d'apparition des valeurs.
# Encodage basé sur l'ordre d'apparition
donnees['Module_code_6'] = pd.factorize(donnees['Module'])[0]
# Application sur plusieurs colonnes avec une lambda
colonnes_catégoriques = donnees.select_dtypes(['object']).columns
donnees[['Statut_code_4', 'Module_code_7']] = donnees[colonnes_catégoriques].apply(lambda x: pd.factorize(x)[0])