-import { Utils } from './Utils';
+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 (Utils.isEmptyArray(dataSet)) {
+ if (isEmptyArray(dataSet)) {
return 0;
}
if (Array.isArray(dataSet) === true && dataSet.length === 1) {
if (percentile < 0 && percentile > 100) {
throw new RangeError('Percentile is not between 0 and 100');
}
- if (Utils.isEmptyArray(dataSet)) {
+ if (isEmptyArray(dataSet)) {
return 0;
}
const sortedDataSet = dataSet.slice().sort((a, b) => a - b);
}
const percentileIndexBase = (percentile / 100) * (sortedDataSet.length - 1);
const percentileIndexInteger = Math.floor(percentileIndexBase);
- if (!Utils.isNullOrUndefined(sortedDataSet[percentileIndexInteger + 1])) {
+ if (!isNullOrUndefined(sortedDataSet[percentileIndexInteger + 1])) {
return (
sortedDataSet[percentileIndexInteger] +
(percentileIndexBase - percentileIndexInteger) *
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): number => {
+ dataSetAverage = dataSetAverage ?? average(dataSet);
+ const geometricDeviation = dataSet.reduce((accumulator, nb) => {
+ const deviation = nb - dataSetAverage!;
+ return accumulator + deviation * deviation;
+ }, 0);
+ return Math.sqrt(geometricDeviation / dataSet.length);
};