Source code for neuroglia.spike

import numpy as np
import pandas as pd
import xarray as xr
from scipy import stats
from sklearn.base import TransformerMixin, BaseEstimator


def get_neuron(neuron_spikes):
    unique_neurons = neuron_spikes['neuron'].unique()
    assert len(unique_neurons)==1
    return unique_neurons[0]

[docs]class Binner(BaseEstimator,TransformerMixin): """Bin a population of spike events into an array of spike counts. This transformer converts a table of spike times into a series of spike counts. Spikes are binned according to the spike_times argument. Parameters ---------- sample_times : array-like The samples times that will be used to bin spikes. Attributes ---------- Examples -------- >>> import numpy as np >>> import pandas as pd >>> from neuroglia.spike import Binner >>> binner = Binner(np.arange(0,1.0,0.001)) >>> spikes = pd.DataFrame({'times':np.random.rand}) >>> X = binner.fit_transform(spikes) See also -------- neuroglia.spike.Smoother neuroglia.nwb.SpikeTablizer 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,sample_times): self.sample_times = sample_times
def fit(self, X, y=None): """ Do nothing an return the estimator unchanged. This method is here to implement the scikit-learn API and work in scikit-learn pipelines. Parameters ---------- X : pandas DataFrame with columns ['time','neuron'] y : (ignored) Returns ------- self """ return self def __make_trace(self,neuron_spikes): neuron = get_neuron(neuron_spikes) trace, _ = np.histogram( neuron_spikes['time'], self.sample_times ) return pd.Series(data=trace,index=self.sample_times[:-1],name=neuron) def transform(self, X): """ Bin each neuron's spikes into a trace of spike counts. Parameters ---------- X : pandas DataFrame with columns ['time','neuron'] spike times that will be binned Returns ------- Xt : pandas DataFrame of spike counts Columns are neuron labels and the index is the left edge of the sample times. """ traces = X.groupby('neuron').apply(self.__make_trace).T return traces
KERNELS = { 'gaussian': stats.norm, 'exponential': stats.expon, 'boxcar': stats.uniform, } DEFAULT_TAU = 0.005
[docs]class Smoother(BaseEstimator,TransformerMixin): """Smooth a population of spike events into an array. This transformer converts a table of spike times into a trace of smoothed spike values. Spikes are binned according to the spike_times argument. Parameters ---------- sample_times : array-like The samples times that will be used to bin spikes. Attributes ---------- Examples -------- >>> import numpy as np >>> import pandas as pd >>> from neuroglia.spike import Smoother >>> smoother = Smoother(np.arange(0,1.0,0.001)) >>> spikes = pd.DataFrame({'times':np.random.rand}) >>> X = binner.fit_transform(spikes) See also -------- neuroglia.spike.Binner neuroglia.nwb.SpikeTablizer 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,sample_times,kernel='gaussian',tau=DEFAULT_TAU): self.sample_times = sample_times self.kernel = kernel self.tau = tau
def fit(self, X, y=None): """ Do nothing an return the estimator unchanged. This method is here to implement the scikit-learn API and work in scikit-learn pipelines. Parameters ---------- X : pandas DataFrame with columns ['time','neuron'] y : (ignored) Returns ------- self """ return self def _make_trace(self,neuron_spikes): neuron = get_neuron(neuron_spikes) kernel_func = lambda spike: KERNELS[self.kernel](loc=spike,scale=self.tau) data = ( neuron_spikes['time'] .map(lambda t: kernel_func(t).pdf(self.sample_times)) # creates kernel function for each spike and applies to the time bins .sum() # and adds them together ) return pd.Series( data=data, index=self.sample_times, name=neuron, ) def transform(self, X): """ Smooth each neuron's spikes into a trace of smoothed spikes. Parameters ---------- X : pandas DataFrame with columns ['time','neuron'] spike times that will be binned Returns ------- Xt : pandas DataFrame of smoothed spikes Columns are neuron labels and the index is the left edge of the sample time. """ traces = X.groupby('neuron').apply(self._make_trace).T if len(traces)==0: traces = pd.DataFrame(index=self.sample_times) return traces