signal / utils /preprocess.py
Sorakey's picture
Update utils/preprocess.py
1ebcc20 verified
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
import os
def generate_mock_csi_data(samples=1000, subcarriers=30, antennas=3):
"""
Génère des données CSI factices pour tester le pipeline
Args:
samples: Nombre d'échantillons temporels
subcarriers: Nombre de sous-porteuses
antennas: Nombre d'antennes
Returns:
DataFrame avec des données CSI simulées
"""
# Génération de données aléatoires complexes (phase et amplitude)
csi_data = np.random.randn(samples, subcarriers, antennas) + 1j * np.random.randn(samples, subcarriers, antennas)
# Création des noms de colonnes
columns = []
for ant in range(1, antennas + 1):
for sub in range(1, subcarriers + 1):
columns.append(f"antenna_{ant}_subcarrier_{sub}_real")
columns.append(f"antenna_{ant}_subcarrier_{sub}_imag")
# Conversion en format réel (concaténer partie réelle et imaginaire)
real_data = np.concatenate([np.real(csi_data), np.imag(csi_data)], axis=2)
real_data = real_data.reshape(samples, -1)
# Création du DataFrame
df = pd.DataFrame(real_data, columns=columns)
# Ajout d'une colonne d'activité simulée
activities = ['walking', 'standing', 'sitting', 'falling']
df['activity'] = np.random.choice(activities, size=samples)
# Ajout d'un timestamp simulé
df['timestamp'] = pd.date_range(start='2023-01-01', periods=samples, freq='100ms')
return df
def normalize_data(df, normalization_type='standard'):
"""
Normalise les données CSI (sauf les colonnes d'activité et timestamp)
Args:
df: DataFrame pandas avec les données CSI
normalization_type: 'standard' (StandardScaler) ou 'minmax' (MinMaxScaler)
Returns:
DataFrame normalisé
"""
# Colonnes à ne pas normaliser
non_feature_cols = ['activity', 'timestamp']
feature_cols = [col for col in df.columns if col not in non_feature_cols]
if normalization_type == 'standard':
scaler = StandardScaler()
elif normalization_type == 'minmax':
scaler = MinMaxScaler()
else:
raise ValueError(f"Type de normalisation inconnu: {normalization_type}")
# Application de la normalisation
df[feature_cols] = scaler.fit_transform(df[feature_cols])
return df
def load_and_preprocess_dataset(base_path='mock_data', normalization_type='standard'):
"""
Fonction principale qui charge (ou génère) et prétraite les données
Args:
base_path: Chemin vers les données (ignoré pour les données factices)
normalization_type: Type de normalisation
Returns:
DataFrame prétraité
"""
# Ici on génère des données factices au lieu de charger depuis un fichier
print(f"Génération de données factices (base_path '{base_path}' ignoré)")
df = generate_mock_csi_data(samples=500) # Réduit à 500 échantillons pour les tests
# Normalisation
df = normalize_data(df, normalization_type)
return df
# Test du module
if __name__ == "__main__":
print("Génération d'un exemple de données...")
test_df = load_and_preprocess_dataset()
print("Données générées :")
print(test_df.head())
print("\nStatistiques descriptives :")
print(test_df.describe())