functions: simple moving average

This commit is contained in:
Alexander Zobnin
2017-07-03 21:50:42 +03:00
parent dc840845a2
commit 273e6df7e3
12 changed files with 170 additions and 4 deletions

View File

@@ -9,6 +9,7 @@ let sumSeries = ts.sumSeries;
let delta = ts.delta;
let rate = ts.rate;
let scale = (factor, datapoints) => ts.scale_perf(datapoints, factor);
let simpleMovingAverage = (n, datapoints) => ts.simpleMovingAverage(datapoints, n);
let SUM = ts.SUM;
let COUNT = ts.COUNT;
@@ -102,6 +103,7 @@ let metricFunctions = {
scale: scale,
delta: delta,
rate: rate,
simpleMovingAverage: simpleMovingAverage,
aggregateBy: aggregateByWrapper,
average: _.partial(aggregateWrapper, AVERAGE),
min: _.partial(aggregateWrapper, MIN),

View File

@@ -57,6 +57,15 @@ addFuncDef({
defaultParams: [],
});
addFuncDef({
name: 'simpleMovingAverage',
category: 'Transform',
params: [
{ name: 'factor', type: 'int', options: [6, 10, 60, 600] }
],
defaultParams: [10],
});
// Aggregate
addFuncDef({

View File

@@ -226,6 +226,49 @@ function rate(datapoints) {
return newSeries;
}
function simpleMovingAverage(datapoints, n) {
let sma = [];
let w_sum;
let w_avg = null;
let w_count = 0;
// Initial window
for (let j = n; j > 0; j--) {
if (datapoints[n - j][POINT_VALUE] !== null) {
w_avg += datapoints[n - j][POINT_VALUE];
w_count++;
}
}
if (w_count > 0) {
w_avg = w_avg / w_count;
} else {
w_avg = null;
}
sma.push([w_avg, datapoints[n - 1][POINT_TIMESTAMP]]);
for (let i = n; i < datapoints.length; i++) {
// Insert next value
if (datapoints[i][POINT_VALUE] !== null) {
w_sum = w_avg * w_count;
w_avg = (w_sum + datapoints[i][POINT_VALUE]) / (w_count + 1);
w_count++;
}
// Remove left side point
if (datapoints[i - n][POINT_VALUE] !== null) {
w_sum = w_avg * w_count;
if (w_count > 1) {
w_avg = (w_sum - datapoints[i - n][POINT_VALUE]) / (w_count - 1);
w_count--;
} else {
w_avg = null;
w_count = 0;
}
}
sma.push([w_avg, datapoints[i][POINT_TIMESTAMP]]);
}
return sma;
}
function COUNT(values) {
return values.length;
}
@@ -359,6 +402,7 @@ const exportedFunctions = {
scale_perf,
delta,
rate,
simpleMovingAverage,
SUM,
COUNT,
AVERAGE,