Manipulation fondamentale avec pandas
La bibliothèque pandas constitue l'épine dorsale de l'écosystème de traitement de données en Python. Elle offre des structures de données optimisées, notamment les DataFrames, pour orchestrer des flux de travail analytiques complexes.
Acquisition et export des jeux de données
L'intégration des données depuis diverses sources est la première étape critique. Voici une implémentation utilisant des formats compressés et des paramètres d'optimisation de types.
import pandas as pd
# Importation d'un fichier compressé avec définition explicite des types
donnees_brutes = pd.read_csv('transactions_2023.csv.gz',
compression='gzip',
dtype={'id_client': 'int32', 'montant': 'float32'})
# Export sélectif au format Parquet pour de meilleures performances de lecture
donnees_brutes.to_parquet('transactions_nettoyees.parquet', engine='pyarrow')
Audit et exploration des structures
Avant toute transformation, il est impératif d'auditer la structure interne du DataFrame pour identifier les anomalies potentielles.
# Extraction d'un échantillon aléatoire
print(donnees_brutes.sample(n=10, random_state=42))
# Évaluation de l'empreinte mémoire et des types
print(donnees_brutes.dtypes)
print(donnees_brutes.memory_usage(deep=True))
# Analyse statistique des variables catégorielles
print(donnees_brutes.describe(include=['object', 'category']))
Sélection avancée et filtrage contextule
L'utilisation de l'indexeur .loc et de la méthode .query() rend le code plus lisible et performant pour l'évaluation de conditions multpiles.
# Filtrage dynamique avec query
segment_cible = donnees_brutes.query("montant > 150.0 and statut == 'actif'")
# Sélection matricielle avec loc
sous_ensemble = donnees_brutes.loc[donnees_brutes['region'] == 'Europe', ['id_client', 'date_achat']]
Stratégies de nettoyage et d'imputation
Le traitement des valeurs manquantes et aberrantes nécessite une approche statistique rigoureuse pour préserver l'intégrité du modèle.
# Identification des anomalies via l'écart interquartile (IQR)
q1 = donnees_brutes['montant'].quantile(0.25)
q3 = donnees_brutes['montant'].quantile(0.75)
iqr = q3 - q1
donnees_sans_outliers = donnees_brutes[
(donnees_brutes['montant'] >= q1 - 1.5 * iqr) &
(donnees_brutes['montant'] <= q3 + 1.5 * iqr)
]
# Imputation par interpolation linéaire
donnees_sans_outliers['montant'] = donnees_sans_outliers['montant'].interpolate(method='linear')
# Suppression des doublons basée sur un sous-ensemble de colonnes
donnees_uniques = donnees_sans_outliers.drop_duplicates(subset=['id_client', 'date_achat'], keep='last')
# Conversion temporelle avec gestion des erreurs
donnees_uniques['date_achat'] = pd.to_datetime(donnees_uniques['date_achat'], errors='coerce')
Agrégation et pivots
La synthèse des données multidimensionnelles s'effectue efficacement via des tables croisées dynamiques.
# Table croisée dynamique avec multiples fonctions d'agrégation
synthese_regionale = pd.pivot_table(
donnees_uniques,
values='montant',
index='region',
columns='statut',
aggfunc=['median', 'count']
)
Calculs numériques vectorisés avec numpy
Pour des opérations mathématiques intensives, numpy surpasse les boucles natives Python grâce à ses algorithmes vectorisés en C.
import numpy as np
# Génération d'une séquence linéaire
vecteur_temps = np.linspace(0, 10, 100)
# Application de fonctions trigonométriques et exponentielles
signal = np.sin(vecteur_temps) * np.exp(-0.1 * vecteur_temps)
# Analyse statistique multidimensionnelle
matrice_aleatoire = np.random.normal(loc=50, scale=15, size=(100, 5))
moyenne_par_colonne = np.mean(matrice_aleatoire, axis=0)
percentile_95 = np.percentile(matrice_aleatoire, 95, axis=0)
Représentation graphique avec seaborn et matplotlib
La visualisation permet de déceler des motifs complexes et des distributions au sein des jeux de données.
import matplotlib.pyplot as plt
import seaborn as sns
# Configuration du thème
sns.set_theme(style="whitegrid")
# Création d'une figure avec sous-graphiques
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# Graphique en violon pour la distribution conditionnelle
sns.violinplot(x='region', y='montant', data=donnees_uniques, ax=axes[0], palette="muted")
axes[0].set_title('Distribution des transactions par région')
# Carte de chaleur des corrélations
matrice_numerique = donnees_uniques.select_dtypes(include=[np.number])
sns.heatmap(matrice_numerique.corr(), annot=True, cmap='coolwarm', ax=axes[1])
axes[1].set_title('Matrice de corrélation des variables numériques')
plt.tight_layout()
plt.show()