Merge dependabot/npm_and_yarn/types/tar-6.1.12 into combined-prs-branch
[e-mobility-charging-stations-simulator.git] / src / utils / StatisticUtils.ts
index cef15f52a07045294f65d17fdccab44b85ae6f58..4125ab06a9598dd7d6dd7812dbb0539ecc20ba69 100644 (file)
@@ -1,48 +1,17 @@
-import { isEmptyArray } from './Utils.js'
+import { mean } from 'rambda'
 
-/**
- * Computes the average of the given data set.
- *
- * @param dataSet - Data set.
- * @returns The average of the given data set.
- * @internal
- */
-export const average = (dataSet: number[]): number => {
-  if (Array.isArray(dataSet) && dataSet.length === 0) {
-    return 0
-  }
-  if (Array.isArray(dataSet) && dataSet.length === 1) {
-    return dataSet[0]
-  }
-  return dataSet.reduce((accumulator, nb) => accumulator + nb, 0) / dataSet.length
-}
+export const min = (...args: number[]): number =>
+  args.reduce((minimum, num) => (minimum < num ? minimum : num), Infinity)
 
-/**
- * Computes the median of the given data set.
- *
- * @param dataSet - Data set.
- * @returns The median of the given data set.
- * @internal
- */
-export const median = (dataSet: number[]): number => {
-  if (isEmptyArray(dataSet)) {
-    return 0
-  }
-  if (Array.isArray(dataSet) && dataSet.length === 1) {
-    return dataSet[0]
-  }
-  const sortedDataSet = dataSet.slice().sort((a, b) => a - b)
-  return (
-    (sortedDataSet[(sortedDataSet.length - 1) >> 1] + sortedDataSet[sortedDataSet.length >> 1]) / 2
-  )
-}
+export const max = (...args: number[]): number =>
+  args.reduce((maximum, num) => (maximum > num ? maximum : num), -Infinity)
 
 // TODO: use order statistics tree https://en.wikipedia.org/wiki/Order_statistic_tree
 export const nthPercentile = (dataSet: number[], percentile: number): number => {
   if (percentile < 0 && percentile > 100) {
     throw new RangeError('Percentile is not between 0 and 100')
   }
-  if (isEmptyArray(dataSet)) {
+  if (Array.isArray(dataSet) && dataSet.length === 0) {
     return 0
   }
   const sortedDataSet = dataSet.slice().sort((a, b) => a - b)
@@ -54,6 +23,7 @@ export const nthPercentile = (dataSet: number[], percentile: number): number =>
   }
   const percentileIndexBase = (percentile / 100) * (sortedDataSet.length - 1)
   const percentileIndexInteger = Math.floor(percentileIndexBase)
+  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
   if (sortedDataSet[percentileIndexInteger + 1] != null) {
     return (
       sortedDataSet[percentileIndexInteger] +
@@ -73,14 +43,8 @@ export const nthPercentile = (dataSet: number[], percentile: number): number =>
  * @see https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation
  * @internal
  */
-export const stdDeviation = (
-  dataSet: number[],
-  dataSetAverage: number = average(dataSet)
-): number => {
-  if (isEmptyArray(dataSet)) {
-    return 0
-  }
-  if (Array.isArray(dataSet) && dataSet.length === 1) {
+export const stdDeviation = (dataSet: number[], dataSetAverage: number = mean(dataSet)): number => {
+  if (Array.isArray(dataSet) && (dataSet.length === 0 || dataSet.length === 1)) {
     return 0
   }
   return Math.sqrt(