moving-averages-js
Version:
The FinTech utility collections of simple, cumulative, and exponential moving averages.
52 lines (39 loc) • 887 B
text/typescript
// Weighted moving average
import { isNumber } from "./common";
export default (data: number[], size: number): number[] => {
const length = data.length;
if (size <= 1) {
return data.slice();
}
if (size > length) {
return Array(length);
}
const ret = [];
const denominator = (size * (size + 1)) / 2;
const prepare = size - 1;
let sum = 0;
let numerator = 0;
let datum = 0;
let i = 0;
let real = -1;
for (; i < prepare; i++) {
datum = data[i];
if (isNumber(datum)) {
sum += datum;
numerator += (i + 1) * datum;
}
}
for (; i < length; i++, real++) {
datum = data[i];
if (isNumber(datum)) {
sum += datum;
numerator += size * datum;
}
if (real >= 0 && isNumber(data[real])) {
sum -= data[real];
}
ret[i] = numerator / denominator;
numerator -= sum;
}
return ret;
};