@visactor/vmind
Version:
<div align="center"> <a href="https://github.com/VisActor#gh-light-mode-only" target="_blank"> <img alt="VisActor Logo" width="200" src="https://github.com/VisActor/.github/blob/main/profile/logo_500_200_light.svg"/> </a> <a href="https://githu
87 lines (83 loc) • 4.91 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.AbnormalTrend = void 0;
const vutils_1 = require("@visactor/vutils"), statistics_1 = require("../statistics"), type_1 = require("../../type"), types_1 = require("../../../../types"), overallTrending_1 = require("../overallTrending"), common_1 = require("../.../../../../../utils/common"), utils_1 = require("../../utils"), abnormalTrendAlgo = (context, options) => {
const result = [], {threshold: threshold = .2} = options || {}, {insights: insights, seriesDataMap: seriesDataMap, cell: cell, spec: spec} = context, {y: celly, color: color} = cell, yField = (0,
vutils_1.isArray)(celly) ? celly.flat() : [ celly ];
if (!((0, vutils_1.isArray)(color) ? color[0] : color)) return [];
const seriesTrendInfo = [];
Object.keys(seriesDataMap).forEach((series => {
yField.forEach((measureId => {
if ((0, utils_1.isStackSeries)(spec, measureId) || (0, utils_1.isPercenSeries)(spec, measureId)) return;
const seriesDataset = seriesDataMap[series].map((d => Number(d.dataItem[measureId]))).filter((v => (0,
common_1.isValidData)(v) && !isNaN(v))), {trend: trend, pValue: pValue, zScore: zScore} = (0,
statistics_1.originalMKTest)(seriesDataset, .05, !1);
if (trend !== statistics_1.TrendType.NO_TREND) {
const startValue = seriesDataset[0], endValue = seriesDataset[seriesDataset.length - 1];
seriesTrendInfo.push({
trend: trend,
pValue: pValue,
zScore: zScore,
measureId: measureId,
series: series,
info: {
startValue: startValue,
endValue: endValue,
change: endValue / startValue - 1
}
});
}
}));
}));
let overallTrendInsights = insights.filter((v => v.type === type_1.InsightType.OverallTrend));
return 0 === overallTrendInsights.length && (overallTrendInsights = (0, overallTrending_1.overallTrendingAlgo)(context, {})),
yField.forEach((measureId => {
const measureOverallTrend = insights.find((i => i.type === type_1.InsightType.OverallTrend && (null == i ? void 0 : i.fieldId) === measureId));
if (measureOverallTrend) {
const seriesInsights = seriesTrendInfo.filter((t => t.measureId === measureId && t.trend !== measureOverallTrend.value)).map((seriesTrend => ({
type: type_1.InsightType.AbnormalTrend,
data: [],
fieldId: measureId,
value: seriesTrend.trend,
significant: 1 - seriesTrend.pValue,
seriesName: seriesTrend.series,
info: seriesTrend.info
})));
result.push(...seriesInsights);
} else {
const increaseTrends = seriesTrendInfo.filter((t => t.trend === statistics_1.TrendType.INCREASING && t.measureId === measureId)), decreasedTrends = seriesTrendInfo.filter((t => t.trend === statistics_1.TrendType.DECREASING && t.measureId === measureId));
if (increaseTrends.length > 0 && decreasedTrends.length > 0) if (increaseTrends.length > decreasedTrends.length && (decreasedTrends.length / (increaseTrends.length + decreasedTrends.length) <= threshold || 1 === decreasedTrends.length)) {
const decreaseInsights = decreasedTrends.map((dt => ({
type: type_1.InsightType.AbnormalTrend,
data: [],
fieldId: measureId,
value: dt.trend,
significant: 1 - dt.pValue,
seriesName: dt.series,
info: dt.info
})));
result.push(...decreaseInsights);
} else if (increaseTrends.length < decreasedTrends.length && (increaseTrends.length / (increaseTrends.length + decreasedTrends.length) <= threshold || 1 === increaseTrends.length)) {
const increaseInsights = increaseTrends.map((it => ({
type: type_1.InsightType.AbnormalTrend,
fieldId: measureId,
value: it.trend,
significant: 1 - it.pValue,
seriesName: it.series,
info: it.info
})));
result.push(...increaseInsights);
}
}
})), result;
};
exports.AbnormalTrend = {
name: "abnormalTrend",
chartType: [ types_1.ChartType.DualAxisChart, types_1.ChartType.LineChart, types_1.ChartType.BarChart, types_1.ChartType.AreaChart ],
insightType: type_1.InsightType.AbnormalTrend,
algorithmFunction: abnormalTrendAlgo,
supportPercent: !1,
supportStack: !1
};
//# sourceMappingURL=index.js.map