series_decompose()
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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 — базовый план).
Примечание.
- Порядок выполнения компонента:
- Извлечение сезонной серии
- Вычитает его из x, создав десезональную серию
- Извлечение компонента тренда из десезональной серии
- Создание базового плана = сезонный + тренд
- Создание остатка = 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
Еженедельная сезонность с тенденцией
В этом примере мы добавим тенденцию к серии из предыдущего примера. Во-первых, мы запускаем 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
Затем мы повторно запустите тот же пример. Так как мы ожидаем тенденцию в серии, мы указываем 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