series_periods_detect()
找出一个时序中最重要的周期。
语法
series_periods_detect(
series,
min_period,
max_period,
num_periods)
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
series | dynamic |
✔️ | 数值的数组,通常是 make-series 或 make_list 运算符生成的输出。 |
min_period | real |
✔️ | 要搜索的最小时间段。 |
max_period | real |
✔️ | 要搜索的最大时间段。 |
num_periods | long |
✔️ | 所需的最大周期数。 此数字将是输出动态数组的长度。 |
重要
- 该算法可检测至少包含 4 个点且最多包含序列长度一半的期间。
- 请将 min_period 设置为略低于预计在时序中找到的期间数,而将 max_period 设置为略高于该期间数。 例如,如果你有每小时聚合的信号,并且你要查找每日和每周期间(分别是 24 小时和 168 小时),则可以设置 min_period=0.8*24、max_period=1.2*168,并围绕这些期间留出 20% 的富余。
- 输入时序必须有规律。 也就是说,聚合在常量箱中(使用 make-series 创建的时序始终满足此条件)。 否则,输出就没有意义。
返回
此函数输出一个包含两个列的表:
- periods:一个动态数组,其中包含已找到的期间(以箱大小为单位,按其分数排序)。
- scores:一个动态数组,其中包含 0 到 1 之间的值。 每个数组都会度量 periods 数组中的一个期间在其相应位置上的重要性。
示例
下面的查询嵌入了应用程序某个月流量的快照,一天聚合两次。 箱大小为 12 小时。
print y=dynamic([80, 139, 87, 110, 68, 54, 50, 51, 53, 133, 86, 141, 97, 156, 94, 149, 95, 140, 77, 61, 50, 54, 47, 133, 72, 152, 94, 148, 105, 162, 101, 160, 87, 63, 53, 55, 54, 151, 103, 189, 108, 183, 113, 175, 113, 178, 90, 71, 62, 62, 65, 165, 109, 181, 115, 182, 121, 178, 114, 170])
| project x=range(1, array_length(y), 1), y
| render linechart
对此序列运行 series_periods_detect()
将得到每周周期(长度为 14 个点)。
print y=dynamic([80, 139, 87, 110, 68, 54, 50, 51, 53, 133, 86, 141, 97, 156, 94, 149, 95, 140, 77, 61, 50, 54, 47, 133, 72, 152, 94, 148, 105, 162, 101, 160, 87, 63, 53, 55, 54, 151, 103, 189, 108, 183, 113, 175, 113, 178, 90, 71, 62, 62, 65, 165, 109, 181, 115, 182, 121, 178, 114, 170])
| project x=range(1, array_length(y), 1), y
| project series_periods_detect(y, 0.0, 50.0, 2)
输出
series_periods_detect_y_periods | series_periods_detect_y_periods_scores |
---|---|
[14.0, 0.0] | [0.84, 0.0] |
注意
由于采样太粗糙(箱大小为 12 小时),因此没有找到也可以在图表中看到的每日期间,因此包含 2 箱的每日期间低于算法所要求的包含 4 个点的最小期间大小。