percentil: refactor

This commit is contained in:
Alexander Zobnin
2017-10-16 15:25:02 +03:00
parent 872f1ac9c8
commit f53eac6f08
12 changed files with 65 additions and 9 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, expMovingAverage, 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, PERCENTIL, metricFunctions, aggregationFunctions;
function limit(order, n, orderByFunc, timeseries) { function limit(order, n, orderByFunc, timeseries) {
var orderByCallback = aggregationFunctions[orderByFunc]; var orderByCallback = aggregationFunctions[orderByFunc];
@@ -68,6 +68,12 @@ System.register(['lodash', './utils', './timeseries'], function (_export, _conte
return groupBy(flattenedPoints, interval, groupByCallback); return groupBy(flattenedPoints, interval, groupByCallback);
} }
function percentil(interval, n, datapoints) {
var flattenedPoints = _.flatten(datapoints, true);
var groupByCallback = _.partial(PERCENTIL, n);
return groupBy(flattenedPoints, interval, groupByCallback);
}
function timeShift(interval, range) { function timeShift(interval, range) {
var shift = utils.parseTimeShiftInterval(interval) / 1000; var shift = utils.parseTimeShiftInterval(interval) / 1000;
return _.map(range, function (time) { return _.map(range, function (time) {
@@ -120,6 +126,7 @@ System.register(['lodash', './utils', './timeseries'], function (_export, _conte
MIN = ts.MIN; MIN = ts.MIN;
MAX = ts.MAX; MAX = ts.MAX;
MEDIAN = ts.MEDIAN; MEDIAN = ts.MEDIAN;
PERCENTIL = ts.PERCENTIL;
metricFunctions = { metricFunctions = {
groupBy: groupByWrapper, groupBy: groupByWrapper,
scale: scale, scale: scale,
@@ -129,6 +136,7 @@ System.register(['lodash', './utils', './timeseries'], function (_export, _conte
exponentialMovingAverage: expMovingAverage, exponentialMovingAverage: expMovingAverage,
aggregateBy: aggregateByWrapper, aggregateBy: aggregateByWrapper,
// Predefined aggs // Predefined aggs
percentil: percentil,
average: _.partial(aggregateWrapper, AVERAGE), average: _.partial(aggregateWrapper, AVERAGE),
min: _.partial(aggregateWrapper, MIN), min: _.partial(aggregateWrapper, MIN),
max: _.partial(aggregateWrapper, MAX), max: _.partial(aggregateWrapper, MAX),

File diff suppressed because one or more lines are too long

View File

@@ -148,6 +148,13 @@ System.register(['lodash', 'jquery'], function (_export, _context) {
defaultParams: ['1m'] defaultParams: ['1m']
}); });
addFuncDef({
name: 'percentil',
category: 'Aggregate',
params: [{ name: 'interval', type: 'string' }, { name: 'percent', type: 'float', options: [25, 50, 75, 90, 95, 99, 99.9] }],
defaultParams: ['1m', 95]
});
addFuncDef({ addFuncDef({
name: 'min', name: 'min',
category: 'Aggregate', category: 'Aggregate',

File diff suppressed because one or more lines are too long

View File

@@ -305,6 +305,11 @@ System.register(['lodash', './utils'], function (_export, _context) {
return ema; return ema;
} }
function PERCENTIL(n, values) {
var sorted = _.sortBy(values);
return sorted[Math.floor(sorted.length * n / 100)];
}
function COUNT(values) { function COUNT(values) {
return values.length; return values.length;
} }
@@ -474,7 +479,8 @@ System.register(['lodash', './utils'], function (_export, _context) {
AVERAGE: AVERAGE, AVERAGE: AVERAGE,
MIN: MIN, MIN: MIN,
MAX: MAX, MAX: MAX,
MEDIAN: MEDIAN MEDIAN: MEDIAN,
PERCENTIL: PERCENTIL
}; };
_export('default', exportedFunctions); _export('default', exportedFunctions);

File diff suppressed because one or more lines are too long

View File

@@ -44,6 +44,7 @@ var AVERAGE = _timeseries2.default.AVERAGE;
var MIN = _timeseries2.default.MIN; var MIN = _timeseries2.default.MIN;
var MAX = _timeseries2.default.MAX; var MAX = _timeseries2.default.MAX;
var MEDIAN = _timeseries2.default.MEDIAN; var MEDIAN = _timeseries2.default.MEDIAN;
var PERCENTIL = _timeseries2.default.PERCENTIL;
function limit(order, n, orderByFunc, timeseries) { function limit(order, n, orderByFunc, timeseries) {
var orderByCallback = aggregationFunctions[orderByFunc]; var orderByCallback = aggregationFunctions[orderByFunc];
@@ -108,6 +109,12 @@ function aggregateWrapper(groupByCallback, interval, datapoints) {
return groupBy(flattenedPoints, interval, groupByCallback); return groupBy(flattenedPoints, interval, groupByCallback);
} }
function percentil(interval, n, datapoints) {
var flattenedPoints = _lodash2.default.flatten(datapoints, true);
var groupByCallback = _lodash2.default.partial(PERCENTIL, n);
return groupBy(flattenedPoints, interval, groupByCallback);
}
function timeShift(interval, range) { function timeShift(interval, range) {
var shift = utils.parseTimeShiftInterval(interval) / 1000; var shift = utils.parseTimeShiftInterval(interval) / 1000;
return _lodash2.default.map(range, function (time) { return _lodash2.default.map(range, function (time) {
@@ -131,6 +138,7 @@ var metricFunctions = {
exponentialMovingAverage: expMovingAverage, exponentialMovingAverage: expMovingAverage,
aggregateBy: aggregateByWrapper, aggregateBy: aggregateByWrapper,
// Predefined aggs // Predefined aggs
percentil: percentil,
average: _lodash2.default.partial(aggregateWrapper, AVERAGE), average: _lodash2.default.partial(aggregateWrapper, AVERAGE),
min: _lodash2.default.partial(aggregateWrapper, MIN), min: _lodash2.default.partial(aggregateWrapper, MIN),
max: _lodash2.default.partial(aggregateWrapper, MAX), max: _lodash2.default.partial(aggregateWrapper, MAX),

View File

@@ -111,6 +111,13 @@ addFuncDef({
defaultParams: ['1m'] defaultParams: ['1m']
}); });
addFuncDef({
name: 'percentil',
category: 'Aggregate',
params: [{ name: 'interval', type: 'string' }, { name: 'percent', type: 'float', options: [25, 50, 75, 90, 95, 99, 99.9] }],
defaultParams: ['1m', 95]
});
addFuncDef({ addFuncDef({
name: 'min', name: 'min',
category: 'Aggregate', category: 'Aggregate',

View File

@@ -330,6 +330,11 @@ function expMovingAverage(datapoints, n) {
return ema; return ema;
} }
function PERCENTIL(n, values) {
var sorted = _lodash2.default.sortBy(values);
return sorted[Math.floor(sorted.length * n / 100)];
}
function COUNT(values) { function COUNT(values) {
return values.length; return values.length;
} }
@@ -490,7 +495,8 @@ var exportedFunctions = {
AVERAGE: AVERAGE, AVERAGE: AVERAGE,
MIN: MIN, MIN: MIN,
MAX: MAX, MAX: MAX,
MEDIAN: MEDIAN MEDIAN: MEDIAN,
PERCENTIL: PERCENTIL
}; };
exports.default = exportedFunctions; exports.default = exportedFunctions;

View File

@@ -18,6 +18,7 @@ let AVERAGE = ts.AVERAGE;
let MIN = ts.MIN; let MIN = ts.MIN;
let MAX = ts.MAX; let MAX = ts.MAX;
let MEDIAN = ts.MEDIAN; let MEDIAN = ts.MEDIAN;
let PERCENTIL = ts.PERCENTIL;
function limit(order, n, orderByFunc, timeseries) { function limit(order, n, orderByFunc, timeseries) {
let orderByCallback = aggregationFunctions[orderByFunc]; let orderByCallback = aggregationFunctions[orderByFunc];
@@ -82,6 +83,12 @@ function aggregateWrapper(groupByCallback, interval, datapoints) {
return groupBy(flattenedPoints, interval, groupByCallback); return groupBy(flattenedPoints, interval, groupByCallback);
} }
function percentil(interval, n, datapoints) {
var flattenedPoints = _.flatten(datapoints, true);
var groupByCallback = _.partial(PERCENTIL, n);
return groupBy(flattenedPoints, interval, groupByCallback);
}
function timeShift(interval, range) { function timeShift(interval, range) {
let shift = utils.parseTimeShiftInterval(interval) / 1000; let shift = utils.parseTimeShiftInterval(interval) / 1000;
return _.map(range, time => { return _.map(range, time => {
@@ -108,6 +115,7 @@ let metricFunctions = {
exponentialMovingAverage: expMovingAverage, exponentialMovingAverage: expMovingAverage,
aggregateBy: aggregateByWrapper, aggregateBy: aggregateByWrapper,
// Predefined aggs // Predefined aggs
percentil: percentil,
average: _.partial(aggregateWrapper, AVERAGE), average: _.partial(aggregateWrapper, AVERAGE),
min: _.partial(aggregateWrapper, MIN), min: _.partial(aggregateWrapper, MIN),
max: _.partial(aggregateWrapper, MAX), max: _.partial(aggregateWrapper, MAX),

View File

@@ -108,9 +108,9 @@ addFuncDef({
category: 'Aggregate', category: 'Aggregate',
params: [ params: [
{ name: 'interval', type: 'string' }, { name: 'interval', type: 'string' },
{ name: 'percent', type: 'string' } { name: 'percent', type: 'float', options: [25, 50, 75, 90, 95, 99, 99.9] }
], ],
defaultParams: ['1m','95'], defaultParams: ['1m', 95],
}); });
addFuncDef({ addFuncDef({

View File

@@ -322,6 +322,11 @@ function expMovingAverage(datapoints, n) {
return ema; return ema;
} }
function PERCENTIL(n, values) {
var sorted = _.sortBy(values);
return sorted[Math.floor(sorted.length * n / 100)];
}
function COUNT(values) { function COUNT(values) {
return values.length; return values.length;
} }
@@ -482,7 +487,8 @@ const exportedFunctions = {
AVERAGE, AVERAGE,
MIN, MIN,
MAX, MAX,
MEDIAN MEDIAN,
PERCENTIL
}; };
export default exportedFunctions; export default exportedFunctions;