Add trace_agg/src/trace_agg/core.py
This commit is contained in:
parent
36ecc95197
commit
b67c835241
1 changed files with 57 additions and 0 deletions
57
trace_agg/src/trace_agg/core.py
Normal file
57
trace_agg/src/trace_agg/core.py
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
import pandas as pd
|
||||
import numpy as np
|
||||
import os
|
||||
from pathlib import Path
|
||||
from statistics import median
|
||||
|
||||
|
||||
def aggregate_em_data(num_trials: int) -> dict:
|
||||
"""Aggregiert EM-Daten aus CSV-Dateien und berechnet Summary-Kennzahlen.
|
||||
|
||||
Args:
|
||||
num_trials (int): Anzahl der zu verarbeitenden Trials/Samples.
|
||||
|
||||
Returns:
|
||||
dict: Dictionary im Schema von summary_statistics mit
|
||||
peak_amplitude, median_bandpower, crosscorr_with_clockevents.
|
||||
"""
|
||||
data_dir = Path('data')
|
||||
csv_files = sorted(data_dir.glob('em_traces_*.csv'))
|
||||
if not csv_files:
|
||||
raise FileNotFoundError("Keine Eingabedateien gefunden unter data/em_traces_*.csv")
|
||||
|
||||
all_data = []
|
||||
for i, csv_path in enumerate(csv_files):
|
||||
if num_trials and i >= num_trials:
|
||||
break
|
||||
df = pd.read_csv(csv_path)
|
||||
# Validierung der erwarteten Spalten
|
||||
for col in ('timestamp', 'amplitude', 'bandpower'):
|
||||
if col not in df.columns:
|
||||
raise ValueError(f"Fehlende Spalte '{col}' in {csv_path.name}")
|
||||
all_data.append(df)
|
||||
|
||||
if not all_data:
|
||||
raise ValueError("Keine gültigen EM-Daten gefunden.")
|
||||
|
||||
combined = pd.concat(all_data, ignore_index=True)
|
||||
|
||||
# Berechnungen
|
||||
peak_amplitude = float(combined['amplitude'].max()) if not combined.empty else 0.0
|
||||
median_bandpower = float(combined['bandpower'].median()) if not combined.empty else 0.0
|
||||
|
||||
# Vereinfachte Crosscorrelation-Metrik (Amplitude vs. Bandpower)
|
||||
if len(combined) > 1:
|
||||
crosscorr_value = float(np.corrcoef(combined['amplitude'], combined['bandpower'])[0, 1])
|
||||
if np.isnan(crosscorr_value):
|
||||
crosscorr_value = 0.0
|
||||
else:
|
||||
crosscorr_value = 0.0
|
||||
|
||||
summary = {
|
||||
"peak_amplitude": peak_amplitude,
|
||||
"median_bandpower": median_bandpower,
|
||||
"crosscorr_with_clockevents": crosscorr_value,
|
||||
}
|
||||
|
||||
return summary
|
||||
Loading…
Reference in a new issue