Source code for specparam.metrics.metric
"""Metric object."""
import numpy as np
###################################################################################################
###################################################################################################
[docs]class Metric():
"""Define a metric to apply to a power spectrum model.
Parameters
----------
category : str
The category of measure, e.g. 'error' or 'gof'.
measure : str
The specific measure, e.g. 'r_squared'.
description : str
Description of the metric.
func : callable
The function that computes the metric.
kwargs : dictionary
Additional keyword argument to compute the metric.
Each key should be the name of the additional argument.
Each value should be a lambda function that takes 'data' & 'results'
and returns the desired parameter / computed value.
"""
[docs] def __init__(self, category, measure, description, func, kwargs=None):
"""Initialize metric."""
self.category = category
self.measure = measure
self.description = description
self.func = func
self.result = np.nan
self.kwargs = {} if not kwargs else kwargs
def __repr__(self):
"""Set string representation of object."""
return 'Metric: ' + self.label
@property
def label(self):
"""Define label property."""
return self.category + '_' + self.measure
@property
def flabel(self):
"""Define formatted label property."""
if self.category == 'error':
flabel = '{} ({})'.format(self.category.capitalize(), self.measure.upper())
if self.category == 'gof':
flabel = '{} ({})'.format(self.category.upper(), self.measure)
return flabel
[docs] def compute_metric(self, data, results):
"""Compute metric.
Parameters
----------
data : Data
Model data.
results : Results
Model results.
"""
kwargs = {}
for key, lfunc in self.kwargs.items():
kwargs[key] = lfunc(data, results)
self.result = self.func(data.power_spectrum, results.model.modeled_spectrum, **kwargs)
[docs] def reset(self):
"""Reset metric result."""
self.result = np.nan