X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Futils%2FStatisticUtils.ts;h=4125ab06a9598dd7d6dd7812dbb0539ecc20ba69;hb=16c46962f43a692c996b1c89a94dc572fea52d63;hp=deb1624b803f451adc9822ea32cc383e00a3e313;hpb=5199f9fdf202eb534948f165a0994e1993675aa8;p=e-mobility-charging-stations-simulator.git diff --git a/src/utils/StatisticUtils.ts b/src/utils/StatisticUtils.ts index deb1624b..4125ab06 100644 --- a/src/utils/StatisticUtils.ts +++ b/src/utils/StatisticUtils.ts @@ -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) @@ -74,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(