Analyseur de Données.
SAE 1.05 / Python & Pandas / Data Processing1. Contexte du Projet
Ce projet, réalisé dans le cadre de la SAE 1.05 (Traitement de données), avait pour but d'automatiser l'analyse d'emplois du temps universitaires.
La problématique :
Les fichiers d'emplois du temps (souvent au format ICS ou CSV brut) sont difficilement lisibles par l'humain pour effectuer des statistiques globales (nombre d'heures par matière, par enseignant ou par groupe).
L'objectif technique :
Développer un outil en Python capable de parser ces fichiers, de nettoyer les données "sales" et de générer une synthèse structurée permettant de filtrer les cours par groupes (TDA, TDB, etc.).
2. Travail Fourni
Étapes de réalisation :
- Extraction (Parsing) : Lecture des fichiers sources et transformation en DataFrames Pandas.
- Nettoyage (Cleaning) : Suppression des doublons, gestion des valeurs manquantes et formatage des dates/heures.
- Filtrage Intelligent : Mise en place de fonctions permettant d'extraire uniquement les cours d'un groupe spécifique ou d'une ressource précise.
- Statistiques : Calcul automatique du volume horaire total par module (SAE, Ressources, etc.).
Chargement & Nettoyage PARTIE A
Initialisation du DataFrame et formatage des colonnes temporelles. (Cliquer pour dérouler)
import pandas as pd
def charger_donnees(chemin_fichier):
# Chargement du fichier CSV exporté de l'emploi du temps
df = pd.read_csv(chemin_fichier, sep=';', encoding='utf-8')
# Conversion des colonnes en objets Datetime pour les calculs
df['Debut'] = pd.to_datetime(df['Debut'])
df['Fin'] = pd.to_datetime(df['Fin'])
# Calcul de la durée de chaque cours
df['Duree'] = df['Fin'] - df['Debut']
return df.dropna(subset=['Module'])
datetime est cruciale pour permettre à Python de comprendre qu'il s'agit d'heures et non de simples chaînes de caractères.
Filtrage par Groupe PARTIE B
Extraction des données spécifiques à un groupe d'étudiants. (Cliquer pour dérouler)
def filtrer_par_groupe(df, nom_groupe):
""" Retourne uniquement les lignes contenant le groupe spécifié. """
mask = df['Groupes'].str.contains(nom_groupe, na=False)
df_filtre = df[mask]
# Calcul du total d'heures pour ce groupe
total_heures = df_filtre['Duree'].sum()
print(f"Total pour {nom_groupe} : {total_heures}")
return df_filtre
str.contains permet de capturer un groupe même s'il est listé avec d'autres (ex: "TDA, TDB").
3. Difficultés Rencontrées
1. Hétérogénéité des données :
Les fichiers sources contenaient souvent des incohérences (noms de modules écrits différemment, formats de dates changeants). J'ai dû implémenter des expressions régulières (Regex) pour normaliser les données avant l'analyse.
2. Gestion des fuseaux horaires :
Le format ICS utilise parfois le temps universel (UTC). Il a fallu ajuster les décalages horaires pour que les rapports correspondent aux heures réelles de cours en France.
3. Performance de calcul :
Avec des fichiers contenant des milliers de lignes, l'utilisation de boucles `for` classiques était trop lente. L'apprentissage de la vectorisation avec Pandas a permis de rendre le script quasi instantané.
4. Résultats
Le produit final :
L'analyseur est capable de produire en quelques secondes un bilan complet de l'emploi du temps d'un semestre. Il génère des fichiers Excel récapitulatifs classés par type de cours (CM, TD, TP) et par enseignant.
Compétences acquises :
Ce projet a été ma première réelle immersion dans la Data Analysis. J'ai appris à manipuler des structures de données massives et à comprendre l'importance du "Data Cleaning" dans tout projet informatique.