55 lines
2.3 KiB
Java
55 lines
2.3 KiB
Java
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var tslib_1 = require("tslib");
|
|
var regression_1 = tslib_1.__importDefault(require("regression"));
|
|
var util_1 = require("@antv/util");
|
|
var get_series_values_1 = tslib_1.__importDefault(require("../util/get-series-values"));
|
|
var bandwidth_1 = require("../util/bandwidth");
|
|
var helper_1 = require("../helper");
|
|
var DEFAULT_OPTIONS = {
|
|
as: ['x', 'y'],
|
|
// fields: [ 'x', 'y' ], // required two fields
|
|
method: 'linear',
|
|
// extent: [], // extent to execute regression function, default: [ min(x), max(x) ]
|
|
// bandwidth: 1, // bandWidth to execute regression function
|
|
order: 2,
|
|
precision: 2,
|
|
};
|
|
var REGRESSION_METHODS = ['linear', 'exponential', 'logarithmic', 'power', 'polynomial'];
|
|
function regression(rows, options) {
|
|
var opts = helper_1.mergeOptions(options, DEFAULT_OPTIONS);
|
|
var fields = opts.fields, method = opts.method;
|
|
if (!Array.isArray(fields) || fields.length !== 2) {
|
|
throw new TypeError('invalid fields: must be an array of 2 strings.');
|
|
}
|
|
var _a = tslib_1.__read(fields, 2), xField = _a[0], yField = _a[1];
|
|
if (REGRESSION_METHODS.indexOf(method) === -1) {
|
|
throw new TypeError("invalid method: " + method + ". Must be one of " + REGRESSION_METHODS.join(', '));
|
|
}
|
|
var points = rows.map(function (row) { return [row[xField], row[yField]]; });
|
|
var regressionResult = regression_1.default[method](points, opts);
|
|
var xValues = rows.map(function (item) { return item[xField]; });
|
|
var extent = opts.extent;
|
|
if ((extent && !Array.isArray(extent)) || extent.length !== 2) {
|
|
extent = helper_1.range(xValues);
|
|
}
|
|
var bandwidth = opts.bandwidth;
|
|
if (!util_1.isNumber(bandwidth) || bandwidth <= 0) {
|
|
bandwidth = bandwidth_1.silverman(xValues);
|
|
}
|
|
var valuesToPredict = get_series_values_1.default(extent, bandwidth);
|
|
var result = [];
|
|
var _b = tslib_1.__read(opts.as, 2), asX = _b[0], asY = _b[1];
|
|
valuesToPredict.forEach(function (value) {
|
|
var row = {};
|
|
var _a = tslib_1.__read(regressionResult.predict(value), 2), x = _a[0], y = _a[1];
|
|
row[asX] = x;
|
|
row[asY] = y;
|
|
if (isFinite(y)) {
|
|
result.push(row);
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
exports.regression = regression;
|