Source code for pliers.extractors.misc

'''
Extractors that operate on Miscellaneous Stims.
'''

from pliers.stimuli.misc import SeriesStim
from pliers.extractors.base import Extractor, ExtractorResult
from pliers.utils import listify, isiterable
import numpy as np
from importlib import import_module
import logging


[docs]class MetricExtractor(Extractor): ''' Extracts summary metrics from SeriesStim using numpy, scipy or custom functions Args: functions (str, functions or list): function, string referring to absolute import path for a function (e.g. 'numpy.mean') or lambda. Function must operate on 1-dimensional numpy arrays and return a scalar. A list of functions or import strings may also be passed. var_names (list): optional list of custom alias names for each metric subset_idx (list): subset of Series index labels to compute metric on. kwargs: named arguments for function call ''' _input_type = SeriesStim _log_attributes = ('functions', 'subset_idx')
[docs] def __init__(self, functions=None, var_names=None, subset_idx=None, **kwargs): functions = listify(functions) if var_names is not None: var_names = listify(var_names) if len(var_names) != len(functions): raise ValueError('Length of var_names must match number of ' 'functions') for idx, f in enumerate(functions): if isinstance(f, str): try: f_mod, f_func = f.rsplit('.', 1) functions[idx] = getattr(import_module(f_mod), f_func) except: try: functions[idx] = eval(f) except: raise ValueError(f"{f} is not a valid function") if var_names is None: var_names = [f.__name__ for f in functions] self.var_names = var_names self.functions = functions self.kwargs = kwargs self.subset_idx = subset_idx super().__init__()
def _extract(self, stim): outputs = [] if self.subset_idx is not None: idx_diff = set(self.subset_idx) - set(stim.data.index) idx_int = set(self.subset_idx) & set(stim.data.index) if idx_diff: logging.warning(f'{idx_diff} not in index.') if not idx_int: raise ValueError('No valid index') series = stim.data[idx_int] else: series = stim.data for f in self.functions: metrics = f(series, **self.kwargs) if isiterable(metrics): metrics = np.array(metrics) outputs.append(metrics) return ExtractorResult([outputs], stim, self, self.var_names)