X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Futils%2FStatisticUtils.ts;h=ecd47a17f9af0b2d49601542ec3c8af78997d9dd;hb=473045b1407bdddde5728f3ef3c1e6b078e18e30;hp=a2d906eb06c5e06af6b44ac9b8fb607b13a7b69c;hpb=9bf0ef23c51160abc6866ad8d07eea85e308edb8;p=e-mobility-charging-stations-simulator.git diff --git a/src/utils/StatisticUtils.ts b/src/utils/StatisticUtils.ts index a2d906eb..ecd47a17 100644 --- a/src/utils/StatisticUtils.ts +++ b/src/utils/StatisticUtils.ts @@ -1,5 +1,29 @@ import { isEmptyArray, isNullOrUndefined } from './Utils'; +/** + * 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; +}; + +/** + * 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; @@ -40,16 +64,13 @@ export const nthPercentile = (dataSet: number[], percentile: number): number => return sortedDataSet[percentileIndexInteger]; }; -export const stdDeviation = (dataSet: number[]): number => { - let totalDataSet = 0; - for (const data of dataSet) { - totalDataSet += data; - } - const dataSetMean = totalDataSet / dataSet.length; - let totalGeometricDeviation = 0; - for (const data of dataSet) { - const deviation = data - dataSetMean; - totalGeometricDeviation += deviation * deviation; - } - return Math.sqrt(totalGeometricDeviation / dataSet.length); +export const stdDeviation = ( + dataSet: number[], + dataSetAverage: number = average(dataSet), +): number => { + const geometricDeviation = dataSet.reduce((accumulator, nb) => { + const deviation = nb - dataSetAverage; + return accumulator + deviation * deviation; + }, 0); + return Math.sqrt(geometricDeviation / dataSet.length); };