functions: exponential moving average

This commit is contained in:
Alexander Zobnin
2017-07-03 23:01:18 +03:00
parent 273e6df7e3
commit f3ee574619
12 changed files with 89 additions and 4 deletions

View File

@@ -3,7 +3,7 @@
System.register(['lodash', './utils', './timeseries'], function (_export, _context) { System.register(['lodash', './utils', './timeseries'], function (_export, _context) {
"use strict"; "use strict";
var _, utils, ts, downsampleSeries, groupBy, groupBy_exported, sumSeries, delta, rate, scale, simpleMovingAverage, SUM, COUNT, AVERAGE, MIN, MAX, MEDIAN, metricFunctions, aggregationFunctions; var _, utils, ts, downsampleSeries, groupBy, groupBy_exported, sumSeries, delta, rate, scale, simpleMovingAverage, expMovingAverage, SUM, COUNT, AVERAGE, MIN, MAX, MEDIAN, metricFunctions, aggregationFunctions;
function limit(order, n, orderByFunc, timeseries) { function limit(order, n, orderByFunc, timeseries) {
var orderByCallback = aggregationFunctions[orderByFunc]; var orderByCallback = aggregationFunctions[orderByFunc];
@@ -110,6 +110,10 @@ System.register(['lodash', './utils', './timeseries'], function (_export, _conte
return ts.simpleMovingAverage(datapoints, n); return ts.simpleMovingAverage(datapoints, n);
}; };
expMovingAverage = function expMovingAverage(a, datapoints) {
return ts.expMovingAverage(datapoints, a);
};
SUM = ts.SUM; SUM = ts.SUM;
COUNT = ts.COUNT; COUNT = ts.COUNT;
AVERAGE = ts.AVERAGE; AVERAGE = ts.AVERAGE;
@@ -122,6 +126,7 @@ System.register(['lodash', './utils', './timeseries'], function (_export, _conte
delta: delta, delta: delta,
rate: rate, rate: rate,
simpleMovingAverage: simpleMovingAverage, simpleMovingAverage: simpleMovingAverage,
expMovingAverage: expMovingAverage,
aggregateBy: aggregateByWrapper, aggregateBy: aggregateByWrapper,
average: _.partial(aggregateWrapper, AVERAGE), average: _.partial(aggregateWrapper, AVERAGE),
min: _.partial(aggregateWrapper, MIN), min: _.partial(aggregateWrapper, MIN),

File diff suppressed because one or more lines are too long

View File

@@ -117,6 +117,13 @@ System.register(['lodash', 'jquery'], function (_export, _context) {
defaultParams: [10] defaultParams: [10]
}); });
addFuncDef({
name: 'expMovingAverage',
category: 'Transform',
params: [{ name: 'smoothing', type: 'float', options: [0.001, 0.01, 0.05, 0.1, 0.2, 0.3, 0.5, 0.7, 0.9] }],
defaultParams: [0.2]
});
// Aggregate // Aggregate
addFuncDef({ addFuncDef({

File diff suppressed because one or more lines are too long

View File

@@ -252,6 +252,22 @@ System.register(['lodash', './utils'], function (_export, _context) {
return sma; return sma;
} }
function expMovingAverage(datapoints, a) {
var ema = [datapoints[0]];
var ema_prev = datapoints[0][POINT_VALUE];
var ema_cur = void 0;
for (var i = 1; i < datapoints.length; i++) {
if (datapoints[i][POINT_VALUE] !== null) {
ema_cur = a * datapoints[i][POINT_VALUE] + (1 - a) * ema_prev;
ema_prev = ema_cur;
ema.push([ema_cur, datapoints[i][POINT_TIMESTAMP]]);
} else {
ema.push([null, datapoints[i][POINT_TIMESTAMP]]);
}
}
return ema;
}
function COUNT(values) { function COUNT(values) {
return values.length; return values.length;
} }
@@ -395,6 +411,7 @@ System.register(['lodash', './utils'], function (_export, _context) {
delta: delta, delta: delta,
rate: rate, rate: rate,
simpleMovingAverage: simpleMovingAverage, simpleMovingAverage: simpleMovingAverage,
expMovingAverage: expMovingAverage,
SUM: SUM, SUM: SUM,
COUNT: COUNT, COUNT: COUNT,
AVERAGE: AVERAGE, AVERAGE: AVERAGE,

File diff suppressed because one or more lines are too long

View File

@@ -34,6 +34,9 @@ var scale = function scale(factor, datapoints) {
var simpleMovingAverage = function simpleMovingAverage(n, datapoints) { var simpleMovingAverage = function simpleMovingAverage(n, datapoints) {
return _timeseries2.default.simpleMovingAverage(datapoints, n); return _timeseries2.default.simpleMovingAverage(datapoints, n);
}; };
var expMovingAverage = function expMovingAverage(a, datapoints) {
return _timeseries2.default.expMovingAverage(datapoints, a);
};
var SUM = _timeseries2.default.SUM; var SUM = _timeseries2.default.SUM;
var COUNT = _timeseries2.default.COUNT; var COUNT = _timeseries2.default.COUNT;
@@ -125,6 +128,7 @@ var metricFunctions = {
delta: delta, delta: delta,
rate: rate, rate: rate,
simpleMovingAverage: simpleMovingAverage, simpleMovingAverage: simpleMovingAverage,
expMovingAverage: expMovingAverage,
aggregateBy: aggregateByWrapper, aggregateBy: aggregateByWrapper,
average: _lodash2.default.partial(aggregateWrapper, AVERAGE), average: _lodash2.default.partial(aggregateWrapper, AVERAGE),
min: _lodash2.default.partial(aggregateWrapper, MIN), min: _lodash2.default.partial(aggregateWrapper, MIN),

View File

@@ -80,6 +80,13 @@ addFuncDef({
defaultParams: [10] defaultParams: [10]
}); });
addFuncDef({
name: 'expMovingAverage',
category: 'Transform',
params: [{ name: 'smoothing', type: 'float', options: [0.001, 0.01, 0.05, 0.1, 0.2, 0.3, 0.5, 0.7, 0.9] }],
defaultParams: [0.2]
});
// Aggregate // Aggregate
addFuncDef({ addFuncDef({

View File

@@ -277,6 +277,22 @@ function simpleMovingAverage(datapoints, n) {
return sma; return sma;
} }
function expMovingAverage(datapoints, a) {
var ema = [datapoints[0]];
var ema_prev = datapoints[0][POINT_VALUE];
var ema_cur = void 0;
for (var i = 1; i < datapoints.length; i++) {
if (datapoints[i][POINT_VALUE] !== null) {
ema_cur = a * datapoints[i][POINT_VALUE] + (1 - a) * ema_prev;
ema_prev = ema_cur;
ema.push([ema_cur, datapoints[i][POINT_TIMESTAMP]]);
} else {
ema.push([null, datapoints[i][POINT_TIMESTAMP]]);
}
}
return ema;
}
function COUNT(values) { function COUNT(values) {
return values.length; return values.length;
} }
@@ -411,6 +427,7 @@ var exportedFunctions = {
delta: delta, delta: delta,
rate: rate, rate: rate,
simpleMovingAverage: simpleMovingAverage, simpleMovingAverage: simpleMovingAverage,
expMovingAverage: expMovingAverage,
SUM: SUM, SUM: SUM,
COUNT: COUNT, COUNT: COUNT,
AVERAGE: AVERAGE, AVERAGE: AVERAGE,

View File

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

View File

@@ -66,6 +66,15 @@ addFuncDef({
defaultParams: [10], defaultParams: [10],
}); });
addFuncDef({
name: 'expMovingAverage',
category: 'Transform',
params: [
{ name: 'smoothing', type: 'float', options: [0.001, 0.01, 0.05, 0.1, 0.2, 0.3, 0.5, 0.7, 0.9] }
],
defaultParams: [0.2],
});
// Aggregate // Aggregate
addFuncDef({ addFuncDef({

View File

@@ -269,6 +269,22 @@ function simpleMovingAverage(datapoints, n) {
return sma; return sma;
} }
function expMovingAverage(datapoints, a) {
let ema = [datapoints[0]];
let ema_prev = datapoints[0][POINT_VALUE];
let ema_cur;
for (let i = 1; i < datapoints.length; i++) {
if (datapoints[i][POINT_VALUE] !== null) {
ema_cur = a * datapoints[i][POINT_VALUE] + (1 - a) * ema_prev;
ema_prev = ema_cur;
ema.push([ema_cur, datapoints[i][POINT_TIMESTAMP]]);
} else {
ema.push([null, datapoints[i][POINT_TIMESTAMP]]);
}
}
return ema;
}
function COUNT(values) { function COUNT(values) {
return values.length; return values.length;
} }
@@ -403,6 +419,7 @@ const exportedFunctions = {
delta, delta,
rate, rate,
simpleMovingAverage, simpleMovingAverage,
expMovingAverage,
SUM, SUM,
COUNT, COUNT,
AVERAGE, AVERAGE,