@@ -17,6 +17,33 @@ def scale_signal(signal :list, lower: float = 0, upper: float = 99) -> list:
1717 return [(upper - lower ) * (x - min (signal )) / (max (signal ) - min (signal )) + lower for x in signal ]
1818
1919
20+ def scale_signal_with_anomalies (
21+ signal :list ,
22+ lower : float = 0 ,
23+ upper : float = 99 ,
24+ lower_quantile : float = 0.0005 ,
25+ upper_quantile : float = 0.9995 ) -> list :
26+ """ Scale an signal (list of float or int) between given lower and upper value
27+
28+ Args:
29+ signal (list): list with float or int signal values to scale
30+ lower (float): lower scale value
31+ upper (float): upper scale value
32+ lower_quantile (float): lower quantile value to filter [0,1]
33+ upper_quantile (float): upper quantile value to filter [0,1]
34+
35+ Returns:
36+ list: list with scaled signal
37+ """
38+ a1 = np .quantile (signal , lower_quantile )
39+ a2 = np .quantile (signal , upper_quantile )
40+ anomaly_free = np .array ([x for x in signal if a1 < x < a2 ])
41+ anomaly_free_min = min (anomaly_free )
42+ anomaly_free_max = max (anomaly_free )
43+ scaled = [(upper - lower ) * (x - anomaly_free_min ) / (anomaly_free_max - anomaly_free_min ) + lower for x in signal ]
44+ return [min ((anomaly_free_max , max ((anomaly_free_min , x )) )) for x in scaled ]
45+
46+
2047def moving_average (x :list , w : int ) -> list :
2148 """ Calculate moving average for given signal x with window size w
2249
0 commit comments