From 6cc26233fdc02ce9ea48695f3e2863908687be21 Mon Sep 17 00:00:00 2001 From: Kristina Date: Mon, 30 Jun 2025 11:29:01 -0500 Subject: [PATCH] Transformations: Add better unique frame naming for regression analysis (#107057) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add better unique naming for regressions * dont capitalize model type if polynomial * 🙈 --- .../transformers/regression/regression.test.ts | 7 +++++-- .../transformers/regression/regression.ts | 16 +++++++++++++++- .../transformers/regression/regressionEditor.tsx | 14 +++++++------- public/locales/en-US/grafana.json | 1 + 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/public/app/features/transformers/regression/regression.test.ts b/public/app/features/transformers/regression/regression.test.ts index 00dd836f064..ec82cfca2d5 100644 --- a/public/app/features/transformers/regression/regression.test.ts +++ b/public/app/features/transformers/regression/regression.test.ts @@ -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'); }); }); diff --git a/public/app/features/transformers/regression/regression.ts b/public/app/features/transformers/regression/regression.ts index 80e70367284..751dbd63b25 100644 --- a/public/app/features/transformers/regression/regression.ts +++ b/public/app/features/transformers/regression/regression.ts @@ -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 = { id: DataTransformerID.regression, name: 'Regression analysis', @@ -105,8 +113,14 @@ export const RegressionTransformer: SynchronousDataTransformerInfo 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: {} }, diff --git a/public/app/features/transformers/regression/regressionEditor.tsx b/public/app/features/transformers/regression/regressionEditor.tsx index cf943c1f949..2b340daef2e 100644 --- a/public/app/features/transformers/regression/regressionEditor.tsx +++ b/public/app/features/transformers/regression/regressionEditor.tsx @@ -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 = ({ > 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 }); }} diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index d117d5ed8f2..8e416101cdb 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -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": {