NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/data-set/lib/basic-transform/kde.js
2023-09-14 14:47:11 +08:00

85 lines
3.6 KiB
Java

"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 bw = tslib_1.__importStar(require("../util/bandwidth"));
var partition_1 = require("../util/partition");
var simple_statistics_1 = require("simple-statistics");
var helper_1 = require("../helper");
var DEFAULT_OPTIONS = {
minSize: 0.01,
as: ['key', 'y', 'size'],
// fields: [ 'y1', 'y2' ], // required, one or more fields
// extent: [], // extent to execute regression function, default: [ [ min(x), max(x) ], [ min(y), max(y) ] ]
method: 'gaussian',
bandwidth: 'nrd',
};
var KERNEL_METHODS = util_1.keys(kernel_1.default);
function kde(rows, options) {
var opts = helper_1.mergeOptions(options, DEFAULT_OPTIONS);
var fields = options.fields, groupBy = options.groupBy, bandwidth = options.bandwidth, method = options.method;
if (!fields || !Array.isArray(fields) || fields.length < 1) {
throw new TypeError('invalid fields: must be an array of at least 1 strings!');
}
if (!opts.as || !Array.isArray(opts.as) || opts.as.length !== 3) {
throw new TypeError('invalid as: must be an array of 3 strings!');
}
var methodFunc;
if (typeof method === 'string') {
if (KERNEL_METHODS.indexOf(method) === -1) {
throw new TypeError("invalid method: " + method + ". Must be one of " + KERNEL_METHODS.join(', '));
}
methodFunc = kernel_1.default[method];
}
if (util_1.isFunction(method)) {
methodFunc = method;
}
var extent = opts.extent;
if (!extent || !Array.isArray(extent) || extent.length === 0) {
var rangeArr_1 = [];
fields.forEach(function (field) {
rangeArr_1.push.apply(rangeArr_1, tslib_1.__spread(helper_1.range(rows.map(function (item) { return item[field]; }))));
});
extent = helper_1.range(rangeArr_1);
}
var step = 0;
if (typeof bandwidth === 'string' && bw[bandwidth]) {
step = bw[bandwidth](rows.map(function (item) { return item[fields[0]]; }));
}
else if (util_1.isFunction(bandwidth)) {
step = bandwidth(rows.map(function (item) { return item[fields[0]]; }));
}
else if (!util_1.isNumber(bandwidth) || bandwidth <= 0) {
step = bw.nrd(rows.map(function (item) { return item[fields[0]]; }));
}
var seriesValues = get_series_values_1.default(extent, step);
var result = [];
var groups = partition_1.partition(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]; }), methodFunc, step);
var _a = tslib_1.__read(opts.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 >= opts.minSize) {
row[y].push(yValue);
row[size].push(sizeValue);
}
});
result.push(row);
});
});
return result;
}
exports.kde = kde;