a2d906eb06c5e06af6b44ac9b8fb607b13a7b69c
1 import { isEmptyArray
, isNullOrUndefined
} from
'./Utils';
3 export const median
= (dataSet
: number[]): number => {
4 if (isEmptyArray(dataSet
)) {
7 if (Array.isArray(dataSet
) === true && dataSet
.length
=== 1) {
10 const sortedDataSet
= dataSet
.slice().sort((a
, b
) => a
- b
);
12 (sortedDataSet
[(sortedDataSet
.length
- 1) >> 1] + sortedDataSet
[sortedDataSet
.length
>> 1]) / 2
16 // TODO: use order statistics tree https://en.wikipedia.org/wiki/Order_statistic_tree
17 export const nthPercentile
= (dataSet
: number[], percentile
: number): number => {
18 if (percentile
< 0 && percentile
> 100) {
19 throw new RangeError('Percentile is not between 0 and 100');
21 if (isEmptyArray(dataSet
)) {
24 const sortedDataSet
= dataSet
.slice().sort((a
, b
) => a
- b
);
25 if (percentile
=== 0 || sortedDataSet
.length
=== 1) {
26 return sortedDataSet
[0];
28 if (percentile
=== 100) {
29 return sortedDataSet
[sortedDataSet
.length
- 1];
31 const percentileIndexBase
= (percentile
/ 100) * (sortedDataSet
.length
- 1);
32 const percentileIndexInteger
= Math.floor(percentileIndexBase
);
33 if (!isNullOrUndefined(sortedDataSet
[percentileIndexInteger
+ 1])) {
35 sortedDataSet
[percentileIndexInteger
] +
36 (percentileIndexBase
- percentileIndexInteger
) *
37 (sortedDataSet
[percentileIndexInteger
+ 1] - sortedDataSet
[percentileIndexInteger
])
40 return sortedDataSet
[percentileIndexInteger
];
43 export const stdDeviation
= (dataSet
: number[]): number => {
45 for (const data
of dataSet
) {
48 const dataSetMean
= totalDataSet
/ dataSet
.length
;
49 let totalGeometricDeviation
= 0;
50 for (const data
of dataSet
) {
51 const deviation
= data
- dataSetMean
;
52 totalGeometricDeviation
+= deviation
* deviation
;
54 return Math.sqrt(totalGeometricDeviation
/ dataSet
.length
);