Moving Average With a Fixed Window

Calculate a simple moving average over a fixed window with a rolling sum, validating window size and numeric values.

TypescriptData Integrity

Code

snippet
export function movingAverage(values: readonly number[], window: number): number[] {
  if (!Array.isArray(values) || values.length === 0) {
    throw new RangeError("values must be a non-empty array");
  }
  if (!Number.isInteger(window) || window < 1 || window > values.length) {
    throw new RangeError("window must be an integer between 1 and values.length");
  }
  if (!values.every(Number.isFinite)) {
    throw new TypeError("values must be finite numbers");
  }
  const result: number[] = [];
  let sum = 0;
  for (let index = 0; index < values.length; index += 1) {
    sum += values[index];
    if (index >= window) sum -= values[index - window];
    if (index >= window - 1) result.push(sum / window);
  }
  return result;
}