signal / utils /preprocess.py
mayss14's picture
Create preprocess.py
6e4e24e verified
raw
history blame
2.78 kB
import os
import pandas as pd
import numpy as np
def standardize(data):
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)
std[std == 0] = 1 # éviter division par 0
return (data - mean) / std
def min_max_normalize(data):
"""Normalisation Min-Max [0, 1] avec NumPy"""
min_vals = np.min(data, axis=0)
max_vals = np.max(data, axis=0)
range_vals = max_vals - min_vals
range_vals[range_vals == 0] = 1.0 # Éviter la division par zéro
return (data - min_vals) / range_vals
def load_and_preprocess_dataset(base_path='data/Dataset/room1/', normalization_type='standard'):
data_path = os.path.join(base_path, 'data.csv')
label_path = os.path.join(base_path, 'label.csv')
if not os.path.exists(data_path) or not os.path.exists(label_path):
print(f"[ERREUR] Fichiers manquants : {data_path} ou {label_path}")
return pd.DataFrame()
# Charger les fichiers
# Ici, on spécifie que les valeurs dans la colonne sont séparées par des virgules
data = pd.read_csv(data_path, header=None, delimiter=',')
label = pd.read_csv(label_path, header=None)
print(f"data.csv chargé avec {data.shape[0]} lignes et {data.shape[1]} colonnes.")
print(f"label.csv chargé avec {label.shape[0]} lignes et {label.shape[1]} colonnes.")
# Remplacer les valeurs manquantes dans data par la moyenne de chaque colonne
data.fillna(data.mean(), inplace=True)
# Remplir les valeurs manquantes dans label par la méthode de forward fill
label.fillna(method='ffill', inplace=True)
# Égaliser le nombre de lignes entre data et label
min_len = min(len(data), len(label))
data = data.iloc[:min_len]
label = label.iloc[:min_len]
# Normalisation
if normalization_type == 'standard':
data_scaled = standardize(data.values)
elif normalization_type == 'minmax':
data_scaled = min_max_normalize(data.values)
else:
raise ValueError("normalization_type must be 'standard' or 'minmax'")
# Fusion des données et des labels
all_samples = []
for i in range(min_len):
sample = data_scaled[i]
activity = label.iloc[i, 1] if label.shape[1] > 1 else label.iloc[i, 0]
all_samples.append(np.append(sample, activity))
# Construction du DataFrame final
final_df = pd.DataFrame(all_samples)
# Vérification du contenu
if final_df.empty:
print("[ERREUR] Le DataFrame final est vide. Aucune donnée n'a été chargée.")
return pd.DataFrame()
# Attribuer les noms de colonnes
final_df.columns = [f'feature_{i}' for i in range(final_df.shape[1] - 1)] + ['label']
print(f"[INFO] Données finales : {final_df.shape[0]} lignes, {final_df.shape[1]} colonnes.")
return final_df