File size: 2,778 Bytes
6e4e24e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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