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")

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"])
