series_decompose()

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

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

Синтаксис

series_decompose(Серии, [ Сезонность,Тенденция,, Test_pointsSeasonality_threshold ])

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

Параметры

Имя Тип Обязательно Описание
Series 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 Пороговое значение для оценки сезонности, если для параметра Сезонность задано автоматическое определение. Порог оценки по умолчанию — 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 в параметре trend. Мы видим, что положительная тенденция обнаружена, а базовый план гораздо ближе к входным рядам. Остатки близки к нулю, и выделяются только выбросы. Мы видим все компоненты ряда на диаграмме.

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.