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:
Kristina
2025-06-30 11:29:01 -05:00
committed by GitHub
parent 0fccc01ebe
commit 6cc26233fd
4 changed files with 28 additions and 10 deletions
@@ -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 });
}}
+1
View File
@@ -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": {