github.com/network-quality/goresponsiveness@v0.0.0-20240129151524-343954285090/series/statistics.go (about) 1 /* 2 * This file is part of Go Responsiveness. 3 * 4 * Go Responsiveness is free software: you can redistribute it and/or modify it under 5 * the terms of the GNU General Public License as published by the Free Software Foundation, 6 * either version 2 of the License, or (at your option) any later version. 7 * Go Responsiveness is distributed in the hope that it will be useful, but WITHOUT ANY 8 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 9 * PARTICULAR PURPOSE. See the GNU General Public License for more details. 10 * 11 * You should have received a copy of the GNU General Public License along 12 * with Go Responsiveness. If not, see <https://www.gnu.org/licenses/>. 13 */ 14 15 package series 16 17 import ( 18 "github.com/network-quality/goresponsiveness/utilities" 19 ) 20 21 func SeriesStandardDeviation[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket]) (bool, float64) { 22 complete := s.Complete() 23 24 inputValues := s.GetValues() 25 26 actualValues := utilities.Filter(inputValues, func(d utilities.Optional[Data]) bool { 27 return utilities.IsSome[Data](d) 28 }) 29 values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) }) 30 31 return complete, utilities.CalculateStandardDeviation[Data](values) 32 } 33 34 func Percentile[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket], p uint) (bool, Data) { 35 complete := s.Complete() 36 37 inputValues := s.GetValues() 38 39 actualValues := utilities.Filter(inputValues, func(d utilities.Optional[Data]) bool { 40 return utilities.IsSome[Data](d) 41 }) 42 values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) }) 43 44 return complete, utilities.CalculatePercentile(values, p) 45 } 46 47 func AllSequentialIncreasesLessThan[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket], limit float64, 48 ) (bool, bool, float64) { 49 complete := s.Complete() 50 51 inputValues := s.GetValues() 52 53 actualValues := utilities.Filter(utilities.Reverse(inputValues), func(d utilities.Optional[Data]) bool { 54 return utilities.IsSome[Data](d) 55 }) 56 values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) }) 57 58 result, actualLimit := utilities.AllSequentialIncreasesLessThan(values, limit) 59 return complete, result, actualLimit 60 } 61 62 func CalculateAverage[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket]) (bool, float64) { 63 complete := s.Complete() 64 65 inputValues := s.GetValues() 66 67 actualValues := utilities.Filter(inputValues, func(d utilities.Optional[Data]) bool { 68 return utilities.IsSome[Data](d) 69 }) 70 values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) }) 71 72 return complete, utilities.CalculateAverage(values) 73 } 74 75 func TrimmedMean[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket], trim int) (bool, float64, []Data) { 76 complete := s.Complete() 77 78 inputValues := s.GetValues() 79 80 actualValues := utilities.Filter(inputValues, func(d utilities.Optional[Data]) bool { 81 return utilities.IsSome[Data](d) 82 }) 83 values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) }) 84 85 trimmedMean, trimmedElements := utilities.TrimmedMean(values, trim) 86 return complete, trimmedMean, trimmedElements 87 }