NeuroKit2

This document provides a simple guide for analyzing and visualizing Mentalab Explore ExG recordings using NeuroKit2.

1. Mentalab CSV Data Import

def load_exg_data(csv_path, channels=None, fs=None):
    """Load and prepare ExG data from Mentalab Explore CSV file."""
    # Load CSV file
    df = pd.read_csv(csv_path)
    
    # Validate required columns
    if "TimeStamp" not in df.columns:
        raise ValueError("CSV must contain a 'TimeStamp' column in seconds.")
    
    # Calculate relative time
    time = df["TimeStamp"] - df["TimeStamp"].iloc[0]
    
    # Get channels to analyze
    if channels is None:
        chans = [c for c in df.columns if c != "TimeStamp"]
    else:
        chans = [c for c in channels if c in df.columns]
    
    if not chans:
        raise ValueError(f"No channels found. Available: {list(df.columns)}")
    
    print(f"[INFO] Analyzing {len(chans)} channels: {chans}")
    
    return df, time, chans

2. EEG Preprocessing

def filter_eeg_signal(signal, sampling_rate, lowcut=0.5, highcut=35.0, notch_freq=50.0):
    """Apply standard EEG preprocessing using NeuroKit2."""
    # Bandpass filter (0.5-35 Hz) - removes drift and high-freq noise
    signal_bandpass = nk.signal_filter(signal, sampling_rate=sampling_rate,
                                      lowcut=lowcut, highcut=highcut,
                                      method="butterworth", order=4)
    
    # Notch filter (50 Hz) - removes power line interference using NeuroKit2
    signal_filtered = nk.signal_filter(signal_bandpass, sampling_rate=sampling_rate,
                                      lowcut=notch_freq-2, highcut=notch_freq+2,
                                      method="butterworth", order=4)
    
    return signal_filtered

4. EEG Frequency Band Extraction

# Extract frequency bands using NeuroKit2
delta = nk.signal_filter(ch0_signal, sampling_rate=fs, lowcut=0.5, highcut=4, method="butterworth")
theta = nk.signal_filter(ch0_signal, sampling_rate=fs, lowcut=4, highcut=8, method="butterworth")
alpha = nk.signal_filter(ch0_signal, sampling_rate=fs, lowcut=8, highcut=13, method="butterworth")
beta = nk.signal_filter(ch0_signal, sampling_rate=fs, lowcut=13, highcut=30, method="butterworth")
View of the Besa Research Signal view and source estimation

4. Power Spectral Density Analysis

# PSD using NeuroKit2 (Welch method)
psd0 = nk.signal_psd(sig0, sampling_rate=fs, method="welch", show=False)

# Plot PSD
axes[1].semilogy(psd0["Frequency"], psd0["Power"])
View of the Besa Research Signal view and source estimation

Copyright © 2025 Mentalab