Source code for tsfel.utils.calculate_complexity

import json
import time

import numpy as np
from scipy.optimize import curve_fit

from tsfel.feature_extraction.calc_features import calc_window_features
from tsfel.feature_extraction.features_settings import load_json


# curves
[docs] def n_squared(x, no): """The model function.""" return no * x**2
[docs] def n_nlog(x, no): """The model function.""" return no * x * np.log(x)
[docs] def n_linear(x, no): """The model function.""" return no * x
[docs] def n_log(x, no): """The model function.""" return no * np.log(x)
[docs] def n_constant(x, no): """The model function.""" return np.zeros(len(x)) + no
[docs] def find_best_curve(t, signal): """Finds the best curve. Parameters ---------- t : nd-array Log space signal : nd-array Mean execution time array Returns ------- str Best fit curve name """ all_chisq = [] list_curves = [n_squared, n_nlog, n_linear, n_log, n_constant] all_curves = [] # Model parameters stdev = 2 sig = np.zeros(len(signal)) + stdev # Fit the curve for curve in list_curves: start = 1 popt, pcov = curve_fit( curve, t, signal, sigma=sig, p0=start, absolute_sigma=True, ) # Compute chi square nexp = curve(t, *popt) r = signal - nexp chisq = np.sum((r / stdev) ** 2) all_chisq.append(chisq) all_curves.append(nexp) idx_best = np.argmin(all_chisq) curve_name = str(list_curves[idx_best]) idx1 = curve_name.find("n_") idx2 = curve_name.find("at") curve_name = curve_name[idx1 + 2 : idx2 - 1] return curve_name
[docs] def compute_complexity(feature, domain, json_path, **kwargs): r"""Computes the feature complexity. Parameters ---------- feature : string Feature name domain : string Feature domain json_path: json Features json file \**kwargs: See below: * *features_path* (``string``) -- Directory of script with personal features Returns ------- int Feature complexity Writes complexity in json file """ dictionary = load_json(json_path) features_path = kwargs.get("features_path", None) # The inputs from this function should be replaced by a dictionary one_feat_dict = {domain: {feature: dictionary[domain][feature]}} t = np.logspace(3.0, 5.0, 6) signal, s = [], [] f = 0.05 x = np.arange(0, t[-1] + 1, 1) fs = 100 wave = np.sin(2 * np.pi * f * x / fs) for ti in t: for _ in range(20): start = time.time() calc_window_features( one_feat_dict, wave[: int(ti)], fs, features_path=features_path, ) end = time.time() s += [end - start] signal += [np.mean(s)] curve_name = find_best_curve(t, signal) dictionary[domain][feature]["complexity"] = curve_name with open(json_path, "w") as write_file: json.dump(dictionary, write_file, indent=4, sort_keys=True) if curve_name == "constant" or curve_name == "log": return 1 elif curve_name == "linear": return 2 elif curve_name == "nlog" or curve_name == "squared": return 3 else: return 0