时间序列分析函数用于处理互联网服务系统或商务运作中产生的指标数据,这些数据可用于预测未来趋势和检测运作过程中的异常情况。日志服务支持时间序列分析函数,本文介绍时间序列分析函数的基本语法和示例。
背景信息
本文介绍时间序列分析函数示例的日志包含三个字段索引。更多信息,请参见创建索引。
日志样例如下:
{"metric_id":1,"metric_value":90.0,"time_period":"2024-01-01 00:00:00"} {"metric_id":1,"metric_value":92.0,"time_period":"2024-01-01 00:01:00"} {"metric_id":1,"metric_value":93.0,"time_period":"2024-01-01 00:02:00"} {"metric_id":2,"metric_value":85.0,"time_period":"2024-01-01 00:00:00"} {"metric_id":2,"metric_value":87.0,"time_period":"2024-01-01 00:01:00"} {"metric_id":2,"metric_value":89.0,"time_period":"2024-01-01 00:02:00"} {"metric_id":3,"metric_value":96.0,"time_period":"2024-01-01 00:00:00"} {"metric_id":3,"metric_value":97.0,"time_period":"2024-01-01 00:01:00"} {"metric_id":3,"metric_value":98.0,"time_period":"2024-01-01 00:02:00"}
时序分析函数列表
函数名称 | 语法 | 说明 | 返回值类型 |
ts_forecast(array(timestamp) time_periods, array(double) metric_values, timestamp data_begin_time, timestamp data_end_time, timestamp prediction_end_time, varchar time_unit, varchar options) | 用于时序预测,根据给定的时间序列预测未来指定时间段的指标变化。预测的结果以JSON格式返回。 | varchar | |
ts_extract_features(array(double) period_unix_time_array, array(double) metric_value_array) | 用于时序特征提取,以便于利用这些特征进行后续的机器模式识别。 | array(double) | |
ts_extract_features_in_json(array(double) period_unix_time_array, array(double) metric_value_array) | varchar | ||
| 用于时序填充,对缺失的时间点补充数据。 | array(array(double)) | |
ts_analyze_cycles(array(double) unixtime_periods, array(double) metric_values, double begin_unixtime, end_unixtime, varchar time_unit, varchar fill_option) | 用于时序周期分析,分析一个时间序列的近似的多个周期。 | varchar |
ts_forecast函数
根据给定的时间序列,预测未来指定时间段的指标变化。预测的结果以JSON格式返回。
varchar ts_forecast(array(varchar) time_periods, array(double) metric_values, varchar data_begin_time, varchar data_end_time, timestamp prediction_end_time, varchar time_unit, varchar options)
参数 | 说明 |
| 时序中时间部分的数组。 入参类型分为3种:
|
| 时序中指标部分的数组,专注于非零数值的数据点。函数需指定时间段范围以便于对缺失数据进行填充。 |
| 时序数据的时间段范围的开始时刻。 入参类型分为3种:
|
| 时序数据的时间段范围的结束时刻。 入参类型分为3种:
说明 时间区间 |
| 往前预测到这个时刻为止,不包含这个时刻。 可以为两种类型入参:
|
| 时间序列数据的单位时间间隔。例如 |
| 可选参数,指定数据填充方法及是否输出历史数据。
|
使用示例
查询和分析语句
* | select metric_id, ts_forecast( array_agg(time_period), -- time_period array array_agg(metric_value), -- metric_value array '2024-01-01 00:00:00', -- sample start time (inclusive) '2024-01-01 00:05:00', -- sample end time (exclusive) '2024-01-01 01:00:00', -- prediction end time (exclusive) '1 miute', -- time unit 'avg' ) as forecast_outcome from log where time_period >= '2024-01-01 00:00:00' and time_period < '2024-01-01 00:06:00' group by metric_id
返回结果
{ "predictions":[ { "timePeriod":1704067200, "prediction":59.2251832913215, "actualValue":"NaN", "upperBoundBy3StdDev":84.66650365159649, "lowerBoundBy3StdDev":33.78386293104651, "isForecast":true }, { "timePeriod":1704067260, "prediction":57.62225491132578, "actualValue":"NaN", "upperBoundBy3StdDev":83.06357527160077, "lowerBoundBy3StdDev":32.18093455105079, "isForecast":true }, ... ], "isHistoryIncluded":false, "errorSummary":{ "meanAbsError":6.359932652686714, "meanAbsPercentageError":0.08384313053350512, "rootMeanSquareError":8.480440120091664, "standardDeviation":8.480440120091664, "meanError":-0.31236100941915534, "sampleSize":10080, "targetMean":97.94062488445213, "targetStdDev":11.186867641715377, "rsquare":0.92532833455449703, "correlation":0.961939880946048 } }
返回参数说明:
参数
说明
predictions
时间序列预测结果以结构体数组形式呈现,每个结构体代表一个时间点的预测值。预测的时间范围由
data_end_time
和prediction_end_time
参数确定,构成一个左开右闭的时间区间。若在`options`参数中设置outputhist=true
,则数组将包含历史数据,使得整个数据的时间范围扩展至[data_begin_time, prediction_end_time)
。结构体数组参数说明:
timePeriod
:预测的时间点。prediction
:预测指标的数值。actualValue
:实际的数据值。在[data_end_time, prediction_end_time)时间区间内,actualValue的值均为NaN,原因是该时间段尚未产生实际的指标数据。当参数选项中设置'outputhist=true'
时,predictions
字段内的数组将包含[data_begin_time, data_end_time)时间范围的历史数据,其中actualValue
表示该历史数据中的实际指标。upperBoundBy3StdDev
和lowerBoundBy3StdDev
:这两个字段描述的是以预测值(prediction)为中心的训练预测误差的3倍标准差区间边界。这些区间通常代表99%的置信区间,表明未来收集的真实值有99%的概率落在所预测的区间范围内。可以通过结合prediction值与errorSummary.standardDeviation字段来计算一个自定义的置信区间,例如,在两个标准误差范围内的预测区间。然而,当区间变得更加狭窄时,置信水平也会相应降低,例如,两个标准误差内的置信区间将大概降至95%。isForecast
:判断数据点对应的时间是属于未来还是历史,通过与预设的时间点data_end_time
进行比较实现。具体而言,如果数据点的时间小于data_end_time
,则返回false,表示该数据点位于过去;反之,则返回true,表示数据点指向未来。
isHistoryIncluded
predictions
字段里的内容是否包含历史数据。true:包含历史数据。
false:不包含历史数据。
errorSummary
预测在历史数据上测试模型时的预测误差的概括。预测模型会在历史数据上测试,在指标预测中,预测值与实际值之间的差异会产生误差。通过对历史数据进行预测并总结相应的统计值,可以评估预测的整体准确性。
meanAbsError
:预测误差的绝对值的平均值。meanAbsPercentageError
:相对百分比误差的绝对值的平均值。rootMeanSquareError
:均方误差,即误差的平方的平均值的平方根。standardDeviation
:误差的标准差,表示预测的平均上下波动的大小。meanError
:误差的平均值。sampleSize
:历史数据样本的个数(样本容量)。targetMean
:指标历史数据样本的平均值。targetStdDev
:指标历史数据样本的标准差。rsquare
:R平方值是衡量回归模型预测精度的一个指标,基于历史数据进行测试,范围是(0,1)
,越接近1代表预测准确度越高。correlation
:rsquare
的平方根。
ts_extract_features或ts_extract_features_in_json函数
主要对时间序列进行特征提取,方便用户使用这些特征进行后续的机器模式识别。
array(double) ts_extract_features(array(double) period_unix_time_array, array(double) metric_value_array)
或
varchar ts_extract_features_in_json(array(double) period_unix_time_array, array(double) metric_value_array)
参数 | 说明 |
| 时间序列中的Unix时间的数组。 |
| 时间序列的指标数值。 说明
|
使用示例
示例一
查询和分析语句
* | select metric_id, ts_extract_features( array_agg(to_unixtime(time_period)), array_agg(metric_value)) as feature_values group by metric_id
返回结果
feature_values
是生成的特征值的数组。metric_id
feature_values
1
[0.123456, ...]
示例二
查询和分析语句
* | select metric_id, ts_extract_features_in_json( array_agg(to_unixtime(time_period)), array_agg(metric_value)) as feature_values group by metric_id
返回结果
names
:特征向量名称构成的数组。values
:特征向量值构成的数组。
metric_id
feature_values
1
{"values":[1.0,0.0,0.0,0.0,645.0,41685.0,1.0,1.0,0.0,64.5,64.5,10.0,2.8722813232690143],"names":["value__variance_larger_than_standard_deviation","value__has_duplicate_max","value__has_duplicate_min","value__has_duplicate","value__sum_values","value__abs_energy","value__mean_abs_change","value__mean_change"]
ts_fill_missing或ts_impute函数
用于时序填充,对缺失的时间点补充数据。
array(array(double)) ts_fill_missing(array(double) unixtime_periods, array(double) metric_values, double begin_unixtime, double end_unixtime, varchar time_unit, varchar fill_option)
或
array(array(double)) ts_impute(array(double) unixtime_periods, array(double) metric_values, double begin_unixtime, double end_unixtime, varchar time_unit, varchar fill_option)
或
array(array(double)) ts_fill_nan(array(double) unixtime_periods, array(double) metric_values, double begin_unixtime, double end_unixtime, varchar time_unit, varchar fill_option)
参数 | 说明 |
| 时间序列中时间部分的数组,是double数组类型的Unix时间。 |
| 时间序列中指标部分的数组,是double数组类型。 |
| 时间序列数据的时间段范围的开始时刻,double类型的Unix时间。 |
| 时间序列数据的时间段范围的结束时刻。 说明 时间区间 |
| 时间序列数据的单位时间间隔。例如 |
fill_option | 可选参数,指定数据填充方法及是否输出历史数据。
|
使用示例
查询和分析语句
* | select metric_id, ts_fill_missing( array_agg(to_unixtime(time_period)), -- time periods array_agg(metric_value), -- metric values to_unixtime(timestamp '2024-01-01 00:00:00'), -- series begin time to_unixtime(timestamp '2024-01-01 00:05:00'), -- series end time '1 minute', -- series time unit 'value=0' -- fill the missing values with 0 ) as imputed_time_series from log where time_period >= '2024-01-01 00:00:00' and time_period < '2024-01-01 00:05:00' group by metric_id
返回结果
metric_id
imputed_time_series
1
[[1704038400.0,1704038460.0,1704038520.0,1704038580.0,1704038640.0],[60.0,61.0,62.0,63.0,64.0]]
2
[[1704038400.0,1704038460.0,1704038520.0,1704038580.0,1704038640.0],[70.0,71.0,72.0,73.0,74.0]]
3
[[1704038400.0,1704038460.0,1704038520.0,1704038580.0,1704038640.0],[80.0,81.0,82.0,83.0,84.0]]
ts_analyze_cycles函数
分析一个时间序列的近似的多个周期。
varchar ts_analyze_cycles(array(double) unixtime_periods, array(double) metric_values, double begin_unixtime, end_unixtime, varchar time_unit, varchar fill_option)
参数 | 说明 |
| 时间序列中时间部分的数组,是double数组类型的Unix时间。 |
| 时间序列中指标部分的数组,是double数组类型。 |
| 时间序列数据的时间段范围的开始时刻,double类型的Unix时间。 |
| 时间序列数据的时间段范围的结束时刻。 说明 时间区间 |
| 时间序列数据的单位时间间隔。例如 |
fill_option | 指定数据填充方法及是否输出历史数据。
|
使用示例
查询和分析语句
* | select metric_id, ts_analyze_cycles( array_agg(to_unixtime(time_period)), -- time periods array_agg(metric_value), -- metric values to_unixtime(timestamp '2024-01-01 00:00:00'), -- series begin time to_unixtime(timestamp '2024-01-01 00:05:00'), -- series end time '1 minute', -- series time unit 'value=0' -- fill the missing values with 0 ) as imputed_time_series from log where time_period >= '2024-01-01 00:00:00' and time_period < '2024-01-01 00:05:00' group by metric_id
返回结果
metric_id
cycle_analysis
1
{"cycleSize":66,"cycleCorrelation":0.9859745299608902,"frequencyWeight":2.8240516697103124E7,"topCycles":[{"cycleSize":66,"cycleCorrelation":0.9859745299608902,"frequencyWeight":2.8240516697103124E7},{"cycleSize":72,"cycleCorrelation":0.9750729127628865,"frequencyWeight":9538762.646349236},{"cycleSize":22,"cycleCorrelation":0.9628902341901314,"frequencyWeight":1.5834018306832194E7},{"cycleSize":33,"cycleCorrelation":0.9518752073734051,"frequencyWeight":1.1270983504364485E7}]}
返回结果参数说明:
参数
说明
cycleSize
最相似的周期长度。
cycleCorrelation
最相似的周期的相关程度。
frequencyWeight
对时间序列进行功率谱分析之后对应周期的谱密度的大小。
topCycles
对时间序列的多周期分析,提供最多前五个周期的相关分析数据。每一个周期都包含
cycleSize
,cycleCorrelation
,frequencyWeight
这三个字段信息。