UNPKG

kibana-123

Version:

Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic

68 lines (59 loc) 2.26 kB
var alter = require('../lib/alter.js'); var _ = require('lodash'); var Chainable = require('../lib/classes/chainable'); module.exports = new Chainable('movingaverage', { args: [ { name: 'inputSeries', types: ['seriesList'] }, { name: 'window', types: ['number'], help: 'Number of points to average over' }, { name: 'position', types: ['string', 'null'], help: 'Position of the averaged points relative to the result time. Options are left, right, and center (default).' } ], aliases: ['mvavg'], help: 'Calculate the moving average over a given window. Nice for smoothing noisey series', fn: function movingaverageFn(args) { return alter(args, function (eachSeries, _window, _position) { _position = _position || 'center'; var validPositions = ['left', 'right', 'center']; if (!_.contains(validPositions, _position)) throw new Error('Valid positions are: ' + validPositions.join(', ')); var pairs = eachSeries.data; var pairsLen = pairs.length; eachSeries.label = eachSeries.label + ' mvavg=' + _window; function toPoint(point, pairSlice) { var average = _.chain(pairSlice) .map(1).reduce(function (memo, num) { return (memo + num); }).value() / _window; return [point[0], average]; } if (_position === 'center') { var windowLeft = Math.floor(_window / 2); var windowRight = _window - windowLeft; eachSeries.data = _.map(pairs, function (point, i) { if (i < windowLeft || i >= pairsLen - windowRight) return [point[0], null]; return toPoint(point, pairs.slice(i - windowLeft, i + windowRight)); }); } else if (_position === 'left') { eachSeries.data = _.map(pairs, function (point, i) { if (i < _window) return [point[0], null]; return toPoint(point, pairs.slice(i - _window, i)); }); } else if (_position === 'right') { eachSeries.data = _.map(pairs, function (point, i) { if (i >= pairsLen - _window) return [point[0], null]; return toPoint(point, pairs.slice(i , i + _window)); }); } return eachSeries; }); } });