UNPKG

moving-averages-js

Version:

The FinTech utility collections of simple, cumulative, and exponential moving averages.

52 lines (39 loc) 887 B
// 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; };