Features¶
Features configuration¶
When defining the configuration of features according to the specifications in the Configuration page, it’s possible to specify some parameters to be passed to the user defined function as in this example:
...
features:
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
In some particular cases, it may be desirable to call the same custom function several times, passing different combinations of parameters.
In these cases, it’s possible to define the optional configuration keys params_product
and params_zip
.
These parameters will be automatically expanded to build the final dict of parameters to be passed to the custom function,
using respectively itertools.product
and zip
from the Python standard library.
For example, using params_product
:
...
features:
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
params_product:
ratio: [ 0.25, 0.50, 0.75 ]
nested:
- { bin_size: 1, offset: -6 }
- { bin_size: 2, offset: -6 }
they are automatically expanded to 3 * 2 = 6 combinations of parameters:
...
features:
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
ratio: 0.25
nested: { bin_size: 1, offset: -6 }
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
ratio: 0.50
nested: { bin_size: 2, offset: -6 }
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
ratio: 0.75
nested: { bin_size: 1, offset: -6 }
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
ratio: 0.25
nested: { bin_size: 2, offset: -6 }
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
ratio: 0.50
nested: { bin_size: 1, offset: -6 }
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
ratio: 0.75
nested: { bin_size: 2, offset: -6 }
Similarly, using params_zip
:
...
features:
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
params_zip:
param1: [ 10, 20 ]
param2: [ 11, 21 ]
they are automatically expanded to 2 combinations of parameters:
...
features:
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
param1: 10
param2: 11
- type: multi
groupby: [ simulation_id, circuit_id, neuron_class, window ]
function: custom_module.custom_function
params:
custom_param: 123
param1: 20
param2: 21
In more complex cases, params_product
and params_zip
can be combined together.
Features access¶
After the features have been calculated, it’s possible to access the underlying Pandas DataFrames as shown in the usage section.
For example:
ma.spikes.features.<custom_name>.df
However, when params_product
or params_zip
have been defined in the configuration, a suffix is automatically added to the custom name, so they can be accessed as in this example:
ma.spikes.features.<custom_name>_0.df
ma.spikes.features.<custom_name>_1.df
...
or, depending on the number of variable parameters:
ma.spikes.features.<custom_name>_0_0.df
ma.spikes.features.<custom_name>_0_1.df
...
You can check the parameters used to build each feature reading the config
key in the df.attrs
dictionary:
ma.spikes.features.<custom_name>_0_0.df.attrs["config"]
The list of names including the suffixes can be obtained with:
ma.spikes.features.names
A DataFrame obtained as the result of the concatenation of the partial DataFrames can be accessed using just the custom name, without suffixes:
ma.spikes.features.<custom_name>.df
ma.spikes.features.<custom_name>.params
ma.spikes.features.<custom_name>.aliases
In the example above:
df
returns a cached DataFrame of the concatenated partial DataFrames, including additional columns for the varying parameters.params
returns a cached DataFrame of all the parameters.aliases
returns a cached DataFrame of the varying parameters and their aliases (the shortened names, if they are nested in a dict).
To free memory, the cache can be cleared with:
ma.spikes.features.<custom_name>.clear_cache()
See the Jupyter notebook 02 Features basics for an example.