Spaces:
Sleeping
Sleeping
Create preprocess.py
Browse files- utils/preprocess.py +75 -0
utils/preprocess.py
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import numpy as np
|
| 4 |
+
|
| 5 |
+
def standardize(data):
|
| 6 |
+
mean = np.mean(data, axis=0)
|
| 7 |
+
std = np.std(data, axis=0)
|
| 8 |
+
std[std == 0] = 1 # éviter division par 0
|
| 9 |
+
return (data - mean) / std
|
| 10 |
+
|
| 11 |
+
def min_max_normalize(data):
|
| 12 |
+
"""Normalisation Min-Max [0, 1] avec NumPy"""
|
| 13 |
+
min_vals = np.min(data, axis=0)
|
| 14 |
+
max_vals = np.max(data, axis=0)
|
| 15 |
+
range_vals = max_vals - min_vals
|
| 16 |
+
range_vals[range_vals == 0] = 1.0 # Éviter la division par zéro
|
| 17 |
+
return (data - min_vals) / range_vals
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def load_and_preprocess_dataset(base_path='data/Dataset/room1/', normalization_type='standard'):
|
| 22 |
+
data_path = os.path.join(base_path, 'data.csv')
|
| 23 |
+
label_path = os.path.join(base_path, 'label.csv')
|
| 24 |
+
|
| 25 |
+
if not os.path.exists(data_path) or not os.path.exists(label_path):
|
| 26 |
+
print(f"[ERREUR] Fichiers manquants : {data_path} ou {label_path}")
|
| 27 |
+
return pd.DataFrame()
|
| 28 |
+
|
| 29 |
+
# Charger les fichiers
|
| 30 |
+
# Ici, on spécifie que les valeurs dans la colonne sont séparées par des virgules
|
| 31 |
+
data = pd.read_csv(data_path, header=None, delimiter=',')
|
| 32 |
+
label = pd.read_csv(label_path, header=None)
|
| 33 |
+
|
| 34 |
+
print(f"data.csv chargé avec {data.shape[0]} lignes et {data.shape[1]} colonnes.")
|
| 35 |
+
print(f"label.csv chargé avec {label.shape[0]} lignes et {label.shape[1]} colonnes.")
|
| 36 |
+
|
| 37 |
+
# Remplacer les valeurs manquantes dans data par la moyenne de chaque colonne
|
| 38 |
+
data.fillna(data.mean(), inplace=True)
|
| 39 |
+
|
| 40 |
+
# Remplir les valeurs manquantes dans label par la méthode de forward fill
|
| 41 |
+
label.fillna(method='ffill', inplace=True)
|
| 42 |
+
|
| 43 |
+
# Égaliser le nombre de lignes entre data et label
|
| 44 |
+
min_len = min(len(data), len(label))
|
| 45 |
+
data = data.iloc[:min_len]
|
| 46 |
+
label = label.iloc[:min_len]
|
| 47 |
+
|
| 48 |
+
# Normalisation
|
| 49 |
+
if normalization_type == 'standard':
|
| 50 |
+
data_scaled = standardize(data.values)
|
| 51 |
+
elif normalization_type == 'minmax':
|
| 52 |
+
data_scaled = min_max_normalize(data.values)
|
| 53 |
+
else:
|
| 54 |
+
raise ValueError("normalization_type must be 'standard' or 'minmax'")
|
| 55 |
+
|
| 56 |
+
# Fusion des données et des labels
|
| 57 |
+
all_samples = []
|
| 58 |
+
for i in range(min_len):
|
| 59 |
+
sample = data_scaled[i]
|
| 60 |
+
activity = label.iloc[i, 1] if label.shape[1] > 1 else label.iloc[i, 0]
|
| 61 |
+
all_samples.append(np.append(sample, activity))
|
| 62 |
+
|
| 63 |
+
# Construction du DataFrame final
|
| 64 |
+
final_df = pd.DataFrame(all_samples)
|
| 65 |
+
|
| 66 |
+
# Vérification du contenu
|
| 67 |
+
if final_df.empty:
|
| 68 |
+
print("[ERREUR] Le DataFrame final est vide. Aucune donnée n'a été chargée.")
|
| 69 |
+
return pd.DataFrame()
|
| 70 |
+
|
| 71 |
+
# Attribuer les noms de colonnes
|
| 72 |
+
final_df.columns = [f'feature_{i}' for i in range(final_df.shape[1] - 1)] + ['label']
|
| 73 |
+
|
| 74 |
+
print(f"[INFO] Données finales : {final_df.shape[0]} lignes, {final_df.shape[1]} colonnes.")
|
| 75 |
+
return final_df
|