series_decompose()

对序列应用分解转换。

采用包含序列(动态数值数组)的表达式作为输入,并将其分解为周期性、趋势和残差组件。

语法

series_decompose(Series, [ Seasonality,Trend,Test_points,Seasonality_threshold ])

详细了解语法约定

参数

客户 类型​​ 必需 说明
系列 dynamic 数值的数组,通常是 make-seriesmake_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 - 基线)。

注意

  • 组件执行顺序:
  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  

Series decompose 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  

Series decompose 2.

接下来,我们重新运行同一示例。 由于我们预计序列中存在趋势,因此,我们在 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  

Series decompose 3.