Поделиться через


series_decompose()

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Применяет преобразование декомпозиции для ряда.

Принимает выражение, содержащее ряд (динамический числовый массив) в качестве входных данных и разлагает его на сезонные, тенденции и остаточные компоненты.

Синтаксис

series_decompose(Серия , [ тенденция, сезонности , Test_points Seasonality_threshold ], )

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Type Обязательно Описание
Серия dynamic ✔️ Массив числовых значений, как правило, результирующий результат операторов make-series или make_list .
Сезонность int Управляет сезонным анализом. Возможны следующие значения:

- -1: автоматическое определение сезонности с помощью series_periods_detect. Это значение по умолчанию.
— Период: положительное целое число, указывающее ожидаемый период в количестве ячеек. Например, если ряд находится в 1 - h ячейках, еженедельный период составляет 168 ячеек.
- 0: нет сезонности, поэтому пропустите извлечение этого компонента.
Тенденция string Управляет анализом тренда. Возможны следующие значения:

- avg: определите компонент тренда как average(x). Это значение по умолчанию.
- linefit: извлечение компонента тренда с помощью линейной регрессии.
- none: нет тенденции, поэтому пропустите извлечение этого компонента.
Test_points int Положительное целое число, указывающее количество точек в конце ряда, которые следует исключить из обучения или регрессии, процесса. Этот параметр должен быть задан для целей прогнозирования. Значение по умолчанию равно 0.
Seasonality_threshold real Пороговое значение для оценки сезонности, если для параметра "Сезонность " задано значение autodetect. Порог оценки по умолчанию — 0,6.

Дополнительные сведения см. в series_periods_detect.

Возвраты

Функция возвращает следующую соответствующую серию:

  • baseline: прогнозируемое значение ряда (сумма сезонных и трендовых компонентов см. ниже).
  • seasonal: ряд сезонных компонентов:
    • Если период не обнаружен или явно задано значение 0: константа 0.
    • Значение , если обнаружено или установлено положительное целое число: медиана точек ряда на одном этапе
  • trend: ряд компонента тренда.
  • residual: ряд остаточного компонента (то есть x — базовый план).

Примечание.

  • Порядок выполнения компонента:
  1. Извлечение сезонной серии
  2. Вычитает его из x, создав десезональную серию
  3. Извлечение компонента тренда из десезональной серии
  4. Создание базового плана = сезонный + тренд
  5. Создание остатка = x — базовый план
  • Следует включить либо сезонность, либо тенденцию. В противном случае функция является избыточной и просто возвращает базовые показатели = 0 и остаточную = x.

Дополнительные сведения о декомпозиции рядов

Этот метод обычно применяется к временным рядам метрик, которые, как ожидается, будут проявляться периодически и (или) поведение тренда. Этот метод можно использовать для прогнозирования будущих значений метрик и (или) обнаружения аномальных значений. Неявное предположение об этом процессе регрессии заключается в том, что помимо сезонного и трендового поведения временные ряды являются стохастиками и случайным образом распределены. Прогнозирование будущих значений метрик из сезонных и трендовых компонентов, игнорируя остаточную часть. Обнаруживайте аномальные значения, основанные только на обнаружении выбросов только на остаточной части. Дополнительные сведения см. в разделе "Декомпозиция временных рядов".

Примеры

Еженедельная сезонность

В следующем примере мы создадим ряд с еженедельной сезонностью и без тренда, а затем добавим в него некоторые излишние. series_decompose находит и автоматически обнаруживает сезонность и создает базовые показатели, почти идентичные сезонному компоненту. Добавленные выбросы можно четко увидеть в остаточных компонентах.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 10.0, 15.0) - (((t%24)/10)*((t%24)/10)) // generate a series with weekly seasonality
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose(y)
| render timechart  

Ряд декомпилировать 1.

Еженедельная сезонность с тенденцией

В этом примере мы добавим тенденцию к серии из предыдущего примера. Во-первых, мы запускаем series_decompose с параметрами по умолчанию. avg Значение по умолчанию по умолчанию принимает только среднее значение и не вычисляет тенденцию. Созданный базовый план не содержит тенденцию. При наблюдении за тенденцией в остатках становится очевидно, что этот пример менее точный, чем предыдущий пример.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose(y)
| render timechart  

Ряд декомпилировать 2.

Затем мы повторно запустите тот же пример. Так как мы ожидаем тенденцию в серии, мы указываем linefit в параметре тренда. Мы видим, что обнаружена положительная тенденция, и базовый план гораздо ближе к входной серии. Остаточные остатки близки к нулю, и выделяются только вылитые. Мы видим все компоненты серии на диаграмме.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose(y, -1, 'linefit')
| render timechart  

Ряд декомпилировать 3.

  • Визуализация результатов с помощью аномалий