Source code for tssearch.distances.compute_distance

import numpy as np
import pandas as pd
from tssearch.search.segmentation import time_series_segmentation


[docs]def time_series_distance(dict_distances, x, y, tx=None, ty=None): """ Parameters ---------- dict_distances: dict Dictionary of distances parameters. x: nd-array Time series x (query). y: nd-array Time series y. tx: nd-array Time stamp time series x. ty: nd-array Time stamp time series y. Returns ------- distances: pandas DataFrame Distances values. """ exec("from tssearch import *") distance_results = [] distance_names = [] multivariate = True if len(np.shape(x)) > 1 else False for d_type in dict_distances: for dist in dict_distances[d_type]: # Only returns used functions if "use" not in dict_distances[d_type][dist] or dict_distances[d_type][dist]["use"] == "yes": # remove unidimensional distances if multivariate and dict_distances[d_type][dist]["multivariate"] == "no": continue func_total = dict_distances[d_type][dist]["function"] # Check for parameters parameters_total = {} if dict_distances[d_type][dist]["parameters"] != "": parameters_total = dict_distances[d_type][dist]["parameters"] if "time" in parameters_total: parameters_total_copy = parameters_total.copy() del parameters_total_copy["time"] eval_result = locals()[func_total](x, y, tx, ty, **parameters_total_copy) else: eval_result = locals()[func_total](x, y, **parameters_total) distance_results += [eval_result] distance_names += [dist] distances = pd.DataFrame(data=np.array(distance_results), index=np.array(distance_names), columns=["Distance"]) return distances
[docs]def time_series_distance_windows(dict_distances, x, y, tx=None, ty=None, segmentation=None): """ Parameters ---------- dict_distances: dict Dictionary of distances parameters. x: nd-array Time series x (query). y: nd-array Time series y (windows). tx: nd-array Time stamp time series x. ty: nd-array Time stamp time series y (windows). segmentation: dict Dictionary of distances parameters. Returns ------- dist_windows: pandas DataFrame Distances values per window. """ if segmentation is not None: results = time_series_segmentation(segmentation, x, y, tx, ty) func_name = list(segmentation[list(dict_distances.keys())[0]].keys())[0] ts_w = None if ty is None else [] windows = [] for i in range(len(results[func_name]) - 1): if ty is not None: ts_w += [ty[results[func_name][i] : results[func_name][i + 1]]] windows += [y[results[func_name][i] : results[func_name][i + 1]]] else: windows = y ts_w = ty multivariate = True if len(np.shape(x)) > 1 else False exec("from tssearch import *") dist_windows = pd.DataFrame() for d_type in dict_distances: for dist in dict_distances[d_type]: # Only returns used functions if "use" not in dict_distances[d_type][dist] or dict_distances[d_type][dist]["use"] == "yes": if multivariate and dict_distances[d_type][dist]["multivariate"] == "no": continue func_total = dict_distances[d_type][dist]["function"] # Check for parameters parameters_total = {} if dict_distances[d_type][dist]["parameters"] != "": parameters_total = dict_distances[d_type][dist]["parameters"] distance_results = [] if "time" in parameters_total: parameters_total_copy = parameters_total.copy() del parameters_total_copy["time"] for ty_window, window in zip(ts_w, windows): eval_result = locals()[func_total](x, window, tx, ty_window, **parameters_total_copy) distance_results += [eval_result] else: for window in windows: eval_result = locals()[func_total](x, window, **parameters_total) distance_results += [eval_result] dist_windows[dist] = distance_results return dist_windows