98 lines
3.9 KiB
JavaScript
98 lines
3.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var tslib_1 = require("tslib");
|
|
/*
|
|
* kernel density estimation
|
|
*/
|
|
var util_1 = require("@antv/util");
|
|
var get_series_values_1 = tslib_1.__importDefault(require("../util/get-series-values"));
|
|
var kernel_1 = tslib_1.__importDefault(require("../util/kernel"));
|
|
var bandwidth = tslib_1.__importStar(require("../util/bandwidth"));
|
|
var partition_1 = tslib_1.__importDefault(require("../util/partition"));
|
|
var data_set_1 = require("../data-set");
|
|
var option_parser_1 = require("../util/option-parser");
|
|
var simple_statistics_1 = require("simple-statistics");
|
|
var DEFAULT_OPTIONS = {
|
|
minSize: 0.01,
|
|
as: ['key', 'y', 'size'],
|
|
// fields: [ 'y1', 'y2' ], // required, one or more fields
|
|
extent: [],
|
|
method: 'gaussian',
|
|
bandwidth: 'nrd',
|
|
step: 0,
|
|
groupBy: [],
|
|
};
|
|
var KERNEL_METHODS = util_1.keys(kernel_1.default);
|
|
var BANDWIDTH_METHODS = util_1.keys(bandwidth);
|
|
function transform(dv, options) {
|
|
options = util_1.assign({}, DEFAULT_OPTIONS, options);
|
|
var fields = option_parser_1.getFields(options);
|
|
if (!util_1.isArray(fields) || fields.length < 1) {
|
|
throw new TypeError('invalid fields: must be an array of at least 1 strings!');
|
|
}
|
|
var as = options.as;
|
|
if (!util_1.isArray(as) || as.length !== 3) {
|
|
throw new TypeError('invalid as: must be an array of 3 strings!');
|
|
}
|
|
var method = options.method;
|
|
if (util_1.isString(method)) {
|
|
if (KERNEL_METHODS.indexOf(method) === -1) {
|
|
throw new TypeError("invalid method: " + method + ". Must be one of " + KERNEL_METHODS.join(', '));
|
|
}
|
|
method = kernel_1.default[method];
|
|
}
|
|
if (!util_1.isFunction(method)) {
|
|
throw new TypeError('invalid method: kernel method must be a function!');
|
|
}
|
|
var extent = options.extent;
|
|
if (!util_1.isArray(extent) || extent.length === 0) {
|
|
var rangeArr_1 = [];
|
|
util_1.each(fields, function (field) {
|
|
var range = dv.range(field);
|
|
rangeArr_1 = rangeArr_1.concat(range);
|
|
});
|
|
extent = [Math.min.apply(Math, tslib_1.__spread(rangeArr_1)), Math.max.apply(Math, tslib_1.__spread(rangeArr_1))];
|
|
}
|
|
var bw = options.bandwidth;
|
|
if (util_1.isString(bw) && bandwidth[bw]) {
|
|
bw = bandwidth[bw](dv.getColumn(fields[0]));
|
|
}
|
|
else if (util_1.isFunction(bw)) {
|
|
bw = bw(dv.getColumn(fields[0]));
|
|
}
|
|
else if (!util_1.isNumber(bw) || bw <= 0) {
|
|
bw = bandwidth.nrd(dv.getColumn(fields[0]));
|
|
}
|
|
var seriesValues = get_series_values_1.default(extent, options.step ? options.step : bw);
|
|
var result = [];
|
|
var groupBy = options.groupBy;
|
|
var groups = partition_1.default(dv.rows, groupBy);
|
|
util_1.forIn(groups, function (group) {
|
|
var probalityDensityFunctionByField = {};
|
|
util_1.each(fields, function (field) {
|
|
var row = util_1.pick(group[0], groupBy);
|
|
probalityDensityFunctionByField[field] = simple_statistics_1.kernelDensityEstimation(group.map(function (item) { return item[field]; }), method, bw);
|
|
var _a = tslib_1.__read(as, 3), key = _a[0], y = _a[1], size = _a[2];
|
|
row[key] = field;
|
|
row[y] = [];
|
|
row[size] = [];
|
|
util_1.each(seriesValues, function (yValue) {
|
|
var sizeValue = probalityDensityFunctionByField[field](yValue);
|
|
if (sizeValue >= options.minSize) {
|
|
row[y].push(yValue);
|
|
row[size].push(sizeValue);
|
|
}
|
|
});
|
|
result.push(row);
|
|
});
|
|
});
|
|
dv.rows = result;
|
|
}
|
|
data_set_1.DataSet.registerTransform('kernel-density-estimation', transform);
|
|
data_set_1.DataSet.registerTransform('kde', transform);
|
|
data_set_1.DataSet.registerTransform('KDE', transform);
|
|
exports.default = {
|
|
KERNEL_METHODS: KERNEL_METHODS,
|
|
BANDWIDTH_METHODS: BANDWIDTH_METHODS,
|
|
};
|