Source code for neurokit2.eeg.mne_channel_extract

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd


[docs] def mne_channel_extract(raw, what, name=None, add_firstsamples=False): """**Channel extraction from MNE objects** Select one or several channels by name and returns them in a dataframe. Parameters ---------- raw : mne.io.Raw Raw EEG data. what : str or list Can be ``"MEG"``, which will extract all MEG channels, ``"EEG"``, which will extract all EEG channels, or ``"EOG"``, which will extract all EOG channels (that is, if channel names are named with prefixes of their type e.g., 'EEG 001' etc. or 'EOG 061'). Provide exact a single or a list of channel's name(s) if not (e.g., ['124', '125']). name : str or list Useful only when extracting one channel. Can also take a list of names for renaming multiple channels, Otherwise, defaults to ``None``. add_firstsamples : bool Defaults to ``False``. MNE's objects store the value of a delay between the start of the system and the start of the recording (see https://mne.tools/stable/generated/mne.io.Raw.html#mne.io.Raw.first_samp). Taking this into account can be useful when extracting channels from the Raw object to detect events indices that are passed back to MNE again. When ``add_firstsamples`` is set to ``True``, the offset will be explicitly added at the beginning of the signal and filled with NaNs. If ``add_firstsamples`` is a float or an integer, the offset will filled with these values instead. If it is set to ``backfill``, will prepend with the first real value. Returns ---------- DataFrame A DataFrame or Series containing the channel(s). Example ---------- .. ipython:: python import neurokit2 as nk import mne raw = nk.mne_data("raw") raw_channel = nk.mne_channel_extract(raw, what=["EEG 060", "EEG 055"], name=['060', '055']) eeg_channels = nk.mne_channel_extract(raw, "EEG") """ channels_all = raw.copy().info["ch_names"] # Select category of channels if what in ["EEG", "EOG", "MEG"]: what = [x for x in channels_all if what in x] # Select a single specified channel elif isinstance(what, str): what = [what] # Select a few specified channels elif isinstance(what, list): if not all(x in channels_all for x in what): raise ValueError( "NeuroKit error: mne_channel_extract(): List of channels not found. Please " "check channel names in raw.info['ch_names']. " ) channels, __ = raw.copy().pick_channels(what, ordered=False)[:] if len(what) > 1: channels = pd.DataFrame(channels.T, columns=what) if name is not None: channels.columns = name else: channels = pd.Series(channels[0]) channels.what = what[0] if name is not None: channels = channels.rename(name) # Add first_samp if isinstance(add_firstsamples, bool) and add_firstsamples is True: # Fill with na add_firstsamples = np.nan if isinstance(add_firstsamples, str): # Back fill add_firstsamples = channels.iloc[0] if isinstance(channels, pd.DataFrame): add_firstsamples = dict(add_firstsamples) if add_firstsamples is not False: if isinstance(channels, pd.Series): fill = pd.Series(add_firstsamples, index=range(-raw.first_samp, 0)) channels = pd.concat([fill, channels], axis=0) elif isinstance(channels, pd.DataFrame): fill = pd.DataFrame( add_firstsamples, index=range(-raw.first_samp, 0), columns=channels.columns ) channels = pd.concat([fill, channels], axis=0) return channels