Source code for pyrem.io
from pyrem.polygram import Polygram
__author__ = 'quentin'
#todo edf, csv
import scipy.io as scio
import pandas as pd
import numpy as np
from pyrem.time_series import Signal, Annotation
import joblib
from pyrem.time_series import BiologicalTimeSeries, Annotation, Signal
[docs]def polygram_from_pkl(filename):
return joblib.load(filename)
[docs]def signal_from_pkl(filename):
return joblib.load(filename)
#
# def signal_from_csv(file_name, sampling_freq):
# data = pd.read_csv(file_name, engine="c", header=None, dtype=np.float32)
# return Signal(data, sampling_freq)
def _annotation_from_spike_txt(filename, doubt_chars):
"""
Hacky parser needed because spike does not export epochs of exactly 5.000 s!!!!!!!
:param filename:
:return:
"""
df = pd.read_csv(filename, skiprows=16, sep="\t", names=["t", "x1", "x2", "x3","x4", "x5","y"], header=None, na_values="nan")
ts = df["y"]
ts.index = pd.to_datetime(df["t"] * 1e9)
annotations = ts.dropna()
annotations = annotations.resample("5s", how="first")
annotations = annotations.fillna(method="ffill")
np_ord = np.vectorize(lambda x : ord(x.upper()))
annot_values = np_ord(np.array(annotations)).flatten()
annot_values = annot_values.astype(np.uint8)
annot_probas = [0 if a in doubt_chars else 1 for a in annot_values]
return Annotation(annot_values, 1/5.0, annot_probas, name="vigilance_state", type="vigilance_state")
[docs]def polygram_from_spike_matlab_file(signal_filename, annotation_filename, fs, annotation_fs, channel_names, channel_types, doubt_chars,resample_signals, metadata={}):
"""
This function loads a matlab file exported by spike to
as a polygraph.
:param signal_filename: the matlab file name
:return: a polygram
"""
an = _annotation_from_spike_txt(annotation_filename, doubt_chars)
type_for_name = dict(zip(channel_names, channel_types))
matl = scio.loadmat(signal_filename, squeeze_me=True, struct_as_record=False)
data_channels = {}
# annotation_channels = {}
for k in matl.keys():
# exclude metadata such as "__global__", "__version__" ...
if not k.startswith("__"):
obj = matl[k]
channel_number = int(k.split("_")[-1][2:])
if "values" in dir(obj):
channel_id = channel_names[channel_number-1]
data_channels[channel_id] = obj.values
elif "text" in dir(obj):
pass
# annotation_channels["Stage_%i" % (channel_number-1)] = obj.text
del matl
crop_at = np.min([i.size for _,i in data_channels.items()])
for k,a in data_channels.items():
data_channels[k] = a[:crop_at]
signals = [Signal(data,fs, name=name, type=type_for_name[name] ) for name,data in data_channels.items()]
del data_channels
if resample_signals:
signals = [ s.resample(resample_signals) for s in signals]
#signals = [s[:an.duration]for s in signals]
signals.append(an)
return Polygram(signals)