Source code for neuroglia.epoch
import numpy as np
import pandas as pd
import xarray as xr
from sklearn.base import BaseEstimator,TransformerMixin
from .utils import events_to_xr_dim
[docs]class EpochTraceReducer(BaseEstimator,TransformerMixin):
"""Take event-aligned samples of traces from a population of neurons.
Traces are sampled relative to the event time. There is no enforced
constraint that the times of events or sample_times relative to the events
need to align to trace sample times. Rather, samples are interpolated from
the values in the traces DataFrame.
Parameters
----------
traces : pandas DataFrame with 'time' as the index and neuron IDs in columns
The traces that will be sampled from when the transform method is called
func : function
Function that will be applied to trace samples within epochs
Notes
-----
This estimator is stateless (besides constructor parameters), the
fit method does nothing but is useful when used in a pipeline.
"""
[docs] def __init__(self, traces, func):
self.traces = traces
self.func = func
def fit(self, X, y=None):
"""Do nothing and return the estimator unchanged
This method is here to implement the scikit-learn API and work in
scikit-learn pipelines.
Parameters
----------
X : array-like
Returns
-------
self
"""
return self
def transform(self, X):
"""Reduce traces around each event
Parameters
----------
X : pandas.DataFrame with a columns ['time','duration']
Returns
-------
Xt : xarray.DataArray with columns ['event','neuron']
"""
# define a local function that will extract traces around each event
def extractor(ev):
window = ev['time'], ev['time'] + ev['duration']
mask = (
(self.traces.index >= ev['time'])
& (self.traces.index < (ev['time'] + ev['duration']))
)
return (
self.traces[mask]
.apply(self.func,axis=0)
.to_xarray()
.rename({'index':'neuron'})
)
# do the extraction
tensor = [extractor(ev) for _,ev in X.iterrows()]
concat_dim = events_to_xr_dim(X)
# concatenate the DataArrays into a single DataArray
return xr.concat(tensor,dim=concat_dim)