stock-indicators/lib/utils/math.js
2025-03-31 11:20:04 +02:00

86 lines
1.9 KiB
JavaScript
Executable File

'use strict';
export default {
max(values) {
return Math.max.apply(null, values);
},
min(values) {
return Math.min.apply(null, values);
},
range(values) {
return this.max(values) - this.min(values);
},
midrange(values) {
return this.range(values) / 3;
},
sum(values) {
let num = 0;
let len = values.length;
for (let i = 0; i < len; i++)num += values[i];
return num;
},
mean(values) {
return (this.sum(values) / values.length);
},
meanDeviation(values) {
let mean = this.mean(values);
let distance = [];
values.forEach((val) => distance.push(Math.abs(val - mean)));
return this.mean(distance);
},
average(values) {
return this.mean(values);
},
median(values, doSortItems = true) {
if (doSortItems) values.sort((a, b) => a - b);
let mid = values.length / 2;
return mid % 1 ? values[mid - 0.5] : (values[mid - 1] + values[mid]) / 2;
},
modes(values) {
let modeMap = {};
values.forEach((val) => !modeMap[val] ? modeMap[val] = 1 : modeMap[val]++);
let modes = [];
let maxCount = 0;
for (let key in modeMap) {
if (modeMap[key] < maxCount) continue;
if (modeMap[key] > maxCount) {
modes = [Number(key)];
maxCount = modeMap[key];
}
else if (modeMap[key] == maxCount) {
modes.push(Number(key));
}
}
return modes;
},
variance(values, mode = "sample") {
mode = (mode.toLowerCase() == "sample") ? "sample" : "population";
let av = this.average(values);
let result = [];
values.forEach((num) => {
let diff = num - av;
result.push(Math.pow(diff, 2));
});
return (mode == 'sample') ? this.sum(result) / (result.length - 1) : this.average(result);
},
standardDeviation(values, mode = "sample") {
mode = (mode.toLowerCase() == "sample") ? "sample" : "population";
return Math.sqrt(this.variance(values, mode));
},
}