function weightedMovingAverage(values, windowSize, decay) {
return values.map((d, i) => {
const window = values.slice(i - windowSize + 1, i + 1).map((d) => d.y);
const means = window.map((d, j) => d * Math.pow(decay, windowSize - j - 1));
const base = window.map((d, j) => Math.pow(decay, windowSize - j - 1));
const weightedMean = d3.sum(means) / d3.sum(base);
return {
x: d.x,
y: weightedMean
};
});
}