Source code for energia.utils.math

"""Utilities to perform mathematical operations"""

from math import erf, exp, pi, sqrt

import numpy


[docs] def norm_constant(p, mu, sigma) -> float: """ Calculates the normal constant :param p: level of compliance :type p: float :param mu: mean :type mu: float :param sigma: standard deviation :type sigma: float :return: normal constant :rtype: float """ x = mu + erf(1 / sqrt(2) * p) * sigma * sqrt(2) return 1 / (sigma * sqrt(2 * pi)) * exp(-((x - mu) ** 2) / (2 * sigma**2))
[docs] def find_euclidean_distance(a: list, b: list) -> float: """ finds euclidean distances between two cluster nodes :param a: coordinates of cluster node a :type a: list :param b: coordinates of cluster node b :type b: list :returns: euclidean distance :rtype: float """ distance_ = [(a - b) ** 2 for a, b in zip(a, b)] distance_ = sum(distance_) return distance_
[docs] def generate_connectivity_matrix(scale_len) -> numpy.array: """ Generates a connectivity matrix to maintain chronology [..1,0,1..] :param scale_len: length of the scale :type scale_len: int :returns: connectivity matrix :rtype: numpy.array """ connect_ = numpy.zeros((scale_len, scale_len), dtype=int) for i_ in range(len(connect_)): if i_ == 0: # connect_[i,364] = 1 #uncomment these to generate a cyclic matrix connect_[i_, 1] = 1 elif i_ == scale_len - 1: connect_[i_, scale_len - 2] = 1 # connect_[i,0] = 1 else: connect_[i_, i_ - 1] = 1 connect_[i_, i_ + 1] = 1 return connect_
[docs] def normalize(data: list, how: str = "max") -> list: """ min max normalization of data :param data: time-series data :type data: numpy.array | DataFrame :param how: min-max or max, defaults to "max" :type how: str, optional :return: normalized data :rtype: numpy.array | DataFrame """ if all(isinstance(i, tuple) for i in data): # lower bound lb = [i[0] for i in data] # upper bound ub = [i[1] for i in data] # normalize lower and upper bounds individually lb_norm = normalize(lb, how=how) ub_norm = normalize(ub, how=how) return list(zip(lb_norm, ub_norm)) if how == "min_max": min_ = min(data) max_ = max(data) return [(i - min_) / (max_ - min_) for i in data] if how == "max": return [normalize(i) if isinstance(i, list) else i / max(data) for i in data]