series_decompose()
对序列应用分解转换。
采用包含序列(动态数值数组)的表达式作为输入,并将其分解为周期性、趋势和残差组件。
语法
series_decompose(
Series ,
[ Seasonality,
Trend,
Test_points,
Seasonality_threshold ])
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
系列 | dynamic |
✔️ | 数值的数组,通常是 make-series 或 make_list 运算符生成的输出。 |
季节性 | int |
控制周期性分析。 可能的值为: - -1 :使用 series_periods_detect 自动检测周期性。 这是默认值。- Period:一个正整数,按箱数指定所需期间。例如,如果将序列按 1 - h 箱分箱,则一个每周期间为 168 箱。- 0 :无周期性,因此请跳过提取此组件的操作。 |
|
趋势 | string |
控制趋势分析。 可能的值为: - avg :将趋势组件定义为 average(x) 。 这是默认值。- linefit :使用线性回归提取趋势组件。- none :无趋势,因此请跳过提取此组件的操作。 |
|
Test_points | int |
正整数,指定要从学习或回归过程中排除的序列末尾处的点的数目。 应当设置此参数,用于预测。 默认值为 0。 | |
Seasonality_threshold | real |
当 Seasonality 设置为 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
接下来,我们重新运行同一示例。 由于我们预计序列中存在趋势,因此,我们在 trend 参数中指定 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
相关内容
- 使用 anomalychart 来可视化结果