Transformations: Add better unique frame naming for regression analysis (#107057)
* Add better unique naming for regressions
* dont capitalize model type if polynomial
* 🙈
This commit is contained in:
@@ -42,7 +42,7 @@ describe('Regression transformation', () => {
|
||||
length: 6,
|
||||
}),
|
||||
toEquableDataFrame({
|
||||
name: 'linear regression',
|
||||
name: 'Linear regression',
|
||||
fields: [
|
||||
{ name: 'time', type: FieldType.time, values: [0, 1, 2, 3, 4, 5], config: {} },
|
||||
{ name: 'value predicted', type: FieldType.number, values: [0, 1, 2, 3, 4, 5], config: {} },
|
||||
@@ -83,7 +83,7 @@ describe('Regression transformation', () => {
|
||||
length: 6,
|
||||
}),
|
||||
toEquableDataFrame({
|
||||
name: 'linear regression',
|
||||
name: 'Linear regression',
|
||||
fields: [
|
||||
{ name: 'time', type: FieldType.time, values: [0, 1, 2, 3, 4, 5], config: {} },
|
||||
{ name: 'value predicted', type: FieldType.number, values: [1, 1, 1, 1, 1, 1], config: {} },
|
||||
@@ -122,6 +122,7 @@ describe('Regression transformation', () => {
|
||||
expect(result[1].fields[1].values[3]).toBeCloseTo(1.86, 1);
|
||||
expect(result[1].fields[1].values[4]).toBeCloseTo(1.2, 1);
|
||||
expect(result[1].fields[1].values[5]).toBeCloseTo(-0.1, 1);
|
||||
expect(result[1].name).toBe('Quadratic polynomial regression');
|
||||
});
|
||||
|
||||
it('should have the last x point be equal to the last x point of the data', () => {
|
||||
@@ -151,6 +152,7 @@ describe('Regression transformation', () => {
|
||||
expect(result[1].fields[0].values[4]).toBeCloseTo(1.76, 1);
|
||||
expect(result[1].fields[0].values[8]).toBeCloseTo(3.55, 1);
|
||||
expect(result[1].fields[0].values[9]).toBe(4);
|
||||
expect(result[1].name).toBe('Quadratic polynomial regression');
|
||||
});
|
||||
|
||||
it('should filter NaNs', () => {
|
||||
@@ -179,6 +181,7 @@ describe('Regression transformation', () => {
|
||||
expect(result[1].fields[1].values[2]).toBe(2);
|
||||
expect(result[1].fields[1].values[3]).toBe(3);
|
||||
expect(result[1].fields[1].values[4]).toBe(4);
|
||||
expect(result[1].name).toBe('Linear regression');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
fieldMatchers,
|
||||
getFieldDisplayName,
|
||||
} from '@grafana/data';
|
||||
import { t } from '@grafana/i18n';
|
||||
|
||||
export enum ModelType {
|
||||
linear = 'linear',
|
||||
@@ -27,6 +28,13 @@ export interface RegressionTransformerOptions {
|
||||
|
||||
export const DEFAULTS = { predictionCount: 100, modelType: ModelType.linear, degree: 2 };
|
||||
|
||||
export const DEGREES = [
|
||||
{ label: () => t('transformers.regression-transformer-editor.label.quadratic', 'Quadratic'), value: 2 },
|
||||
{ label: () => t('transformers.regression-transformer-editor.label.cubic', 'Cubic'), value: 3 },
|
||||
{ label: () => t('transformers.regression-transformer-editor.label.quartic', 'Quartic'), value: 4 },
|
||||
{ label: () => t('transformers.regression-transformer-editor.label.quintic', 'Quintic'), value: 5 },
|
||||
];
|
||||
|
||||
export const RegressionTransformer: SynchronousDataTransformerInfo<RegressionTransformerOptions> = {
|
||||
id: DataTransformerID.regression,
|
||||
name: 'Regression analysis',
|
||||
@@ -105,8 +113,14 @@ export const RegressionTransformer: SynchronousDataTransformerInfo<RegressionTra
|
||||
return frames;
|
||||
}
|
||||
|
||||
let frameName = `${t('transformers.regression-transformer-editor.model-type-options.label.linear', 'Linear')} ${t('transformers.regression-transformer-editor.regression', 'regression')}`;
|
||||
if (modelType === ModelType.polynomial) {
|
||||
const degreeData = DEGREES.find((deg) => deg.value === degree);
|
||||
frameName = `${degreeData?.label()} ${t('transformers.regression-transformer-editor.model-type-options.label.polynomial', 'Polynomial').toLocaleLowerCase()} ${t('transformers.regression-transformer-editor.regression', 'regression')}`;
|
||||
}
|
||||
|
||||
const newFrame: DataFrame = {
|
||||
name: `${modelType} regression`,
|
||||
name: `${frameName}`,
|
||||
length: predictionPoints.length,
|
||||
fields: [
|
||||
{ name: xField.name, type: xField.type, values: predictionPoints, config: {} },
|
||||
|
||||
@@ -16,7 +16,7 @@ import { NumberInput } from 'app/core/components/OptionsUI/NumberInput';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
import { DEFAULTS, ModelType, RegressionTransformer, RegressionTransformerOptions } from './regression';
|
||||
import { DEFAULTS, DEGREES, ModelType, RegressionTransformer, RegressionTransformerOptions } from './regression';
|
||||
|
||||
const fieldNamePickerSettings = {
|
||||
editor: FieldNamePicker,
|
||||
@@ -141,12 +141,12 @@ export const RegressionTransformerEditor = ({
|
||||
>
|
||||
<Select<number>
|
||||
value={options.degree ?? DEFAULTS.degree}
|
||||
options={[
|
||||
{ label: t('transformers.regression-transformer-editor.label.quadratic', 'Quadratic'), value: 2 },
|
||||
{ label: t('transformers.regression-transformer-editor.label.cubic', 'Cubic'), value: 3 },
|
||||
{ label: t('transformers.regression-transformer-editor.label.quartic', 'Quartic'), value: 4 },
|
||||
{ label: t('transformers.regression-transformer-editor.label.quintic', 'Quintic'), value: 5 },
|
||||
]}
|
||||
options={DEGREES.map((deg) => {
|
||||
return {
|
||||
label: deg.label(),
|
||||
value: deg.value,
|
||||
};
|
||||
})}
|
||||
onChange={(v) => {
|
||||
onChange({ ...options, degree: v.value });
|
||||
}}
|
||||
|
||||
@@ -12079,6 +12079,7 @@
|
||||
"polynomial": "Polynomial"
|
||||
}
|
||||
},
|
||||
"regression": "regression",
|
||||
"tooltip-number-of-xy-points-to-predict": "Number of X,Y points to predict"
|
||||
},
|
||||
"rename-by-regex-transformer-editor": {
|
||||
|
||||
Reference in New Issue
Block a user