Source code for data.spikes.rate
from data.abstract import Dataset
import os
import glob
import numpy as np
from tqdm import tqdm
import pandas as pd
from scipy.ndimage import gaussian_filter1d
[docs]
class Rates(Dataset):
_unit_second = 0.3
[docs]
def __init__(self): super().__init__()
def _load(self):
path = os.path.join(os.path.dirname(__file__), "../bin/spikes/raw_spikes.parquet")
return self._preprocess_spikes(pd.read_parquet(path), bin_dur=self._unit_second)
[docs]
def rescale(self, us: float) -> np.ndarray:
bins = (np.floor(self.raw.index.values / us) * us)
return self.raw.groupby(bins).mean()
def _preprocess_spikes(self, spikes_df, bin_dur):
# ends of encoding & baseline
enc_stop, base_stop = spikes_df['base_start'][0], spikes_df['base_stop'][0]
# binning
enc_bin_edges = np.arange(0, enc_stop + bin_dur, bin_dur)
base_bin_edges = np.arange(enc_stop, base_stop + bin_dur, bin_dur)
# init empty arr to store rates
time_by_neur = np.zeros((len(enc_bin_edges)-1, len(spikes_df)))
col_names = []
for idx, neur in spikes_df.iterrows():
col_name = neur['hemi'] + '_' + neur['region'] + '_' + neur['neur_id']
col_names.append(col_name)
# get enc rates per bin
enc_spike_counts, _ = np.histogram(neur['enc_spikes'], bins=enc_bin_edges)
enc_rates = enc_spike_counts / bin_dur
# get base rates per bin
base_spike_counts, _ = np.histogram(neur['base_spikes'], bins=base_bin_edges)
base_rates = base_spike_counts / bin_dur
# z-score encoding by baseline
base_mean, base_sd = np.mean(base_rates), np.std(base_rates)
enc_rate_normed = (enc_rates - base_mean) / base_sd
# smoothing
enc_rate_smoothed = gaussian_filter1d(enc_rate_normed, sigma=1)
# save
time_by_neur[:, idx] = enc_rate_smoothed
time_axis = np.arange(0, len(enc_bin_edges)-1) * bin_dur
return pd.DataFrame(time_by_neur, columns=col_names, index=time_axis)