@visactor/vdataset
Version:
data processing tool
69 lines (63 loc) • 2.85 kB
JavaScript
;
var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
void 0 === k2 && (k2 = k);
var desc = Object.getOwnPropertyDescriptor(m, k);
desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
enumerable: !0,
get: function() {
return m[k];
}
}), Object.defineProperty(o, k2, desc);
} : function(o, m, k, k2) {
void 0 === k2 && (k2 = k), o[k2] = m[k];
}), __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function(o, v) {
Object.defineProperty(o, "default", {
enumerable: !0,
value: v
});
} : function(o, v) {
o.default = v;
}), __importStar = this && this.__importStar || function(mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (null != mod) for (var k in mod) "default" !== k && Object.prototype.hasOwnProperty.call(mod, k) && __createBinding(result, mod, k);
return __setModuleDefault(result, mod), result;
};
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.statistics = void 0;
const simpleStatistics = __importStar(require("simple-statistics")), js_1 = require("../utils/js"), vutils_1 = require("@visactor/vutils"), constants_1 = require("../constants"), DEFAULT_STATISTICS_OPTIONS = {
as: [],
fields: [],
groupBy: null,
operations: [ "count", "max", "min", "average", "sum" ]
}, aggregates = {
count: data => data.length,
distinct: (data, field) => (0, vutils_1.uniqArray)(data.map((row => +row[field]))).length
};
constants_1.STATISTICS_METHODS.forEach((method => {
aggregates[method] = (data, field) => {
let values = data.map((row => +row[field]));
return (0, vutils_1.isArray)(values) && (0, vutils_1.isArray)(values[0]) && (values = (0,
vutils_1.flattenArray)(values)), simpleStatistics[method](values);
};
})), aggregates.average = aggregates.mean;
const statistics = (data, options) => {
const mergeOptions = (0, js_1.mergeDeepImmer)(DEFAULT_STATISTICS_OPTIONS, options), {as: as, fields: fields, groupBy: groupBy, operations: operations} = mergeOptions, groups = {};
data.forEach((d => {
groups[d[groupBy]] = groups[d[groupBy]] || [], groups[d[groupBy]].push(d);
}));
const results = [];
for (const key in groups) {
const result = {
group: key
}, group = groups[key];
operations.forEach(((operation, i) => {
var _a, _b;
const outputName = null !== (_a = as[i]) && void 0 !== _a ? _a : operation, field = null !== (_b = fields[i]) && void 0 !== _b ? _b : fields[0];
result[outputName] = aggregates[operation](group, field);
})), results.push(result);
}
return results;
};
exports.statistics = statistics;