时序分析函数

时间序列分析函数用于处理互联网服务系统或商务运作中产生的指标数据,这些数据可用于预测未来趋势和检测运作过程中的异常情况。日志服务支持时间序列分析函数,本文介绍时间序列分析函数的基本语法和示例。

背景信息

  • 本文介绍时间序列分析函数示例的日志包含三个字段索引。更多信息,请参见创建索引

    image

  • 日志样例如下:

    {"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函数

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或ts_extract_features_in_json函数

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

ts_fill_missing或ts_impute函数

  • ts_fill_missing(array(double) unixtime_periods, array(double) metric_values, double begin_unixtime, end_unixtime, varchar time_unit, varchar fill_option)

  • ts_impute(array(double) unixtime_periods, array(double) metric_values, double begin_unixtime, end_unixtime, varchar time_unit, varchar fill_option)

  • ts_fill_nan(array(double) unixtime_periods, array(double) metric_values, double begin_unixtime, end_unixtime, varchar time_unit, varchar fill_option)

用于时序填充,对缺失的时间点补充数据。

array(array(double))

ts_analyze_cycles函数

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)

参数

说明

time_periods

时序中时间部分的数组。

入参类型分为3种:

  • timestamp类型。

  • varchar类型,例如2024-01-01 10:00:00

  • double类型的Unix时间。

metric_values

时序中指标部分的数组,专注于非零数值的数据点。函数需指定时间段范围以便于对缺失数据进行填充。

data_begin_time

时序数据的时间段范围的开始时刻。

入参类型分为3种:

  • timestamp类型。

  • varchar类型,例如2024-01-01 10:00:00

  • double类型的Unix时间。

data_end_time

时序数据的时间段范围的结束时刻。

入参类型分为3种:

  • timestamp类型。

  • varchar类型,例如2024-01-01 10:00:00

  • double类型的Unix时间。

说明

时间区间[data_begin_time, data_end_time)包括data_begin_time但不包括data_end_time

prediction_end_time

往前预测到这个时刻为止,不包含这个时刻。

可以为两种类型入参:

  1. timestamp类型。

  2. double类型的Unix时间。

time_unit

时间序列数据的单位时间间隔。例如'10 second' '1 minute''1 hour''1 day''1 week''1 month''1 year'等。

options

可选参数,指定数据填充方法及是否输出历史数据。

  • 数据填充方法:

    • 指定值(value)

    • 均值(mean)

    • 中位数(median)

    • 最小值(min)

    • 最大值(max)

    • 局部插值(local-interpolation)

  • 是否输出历史数据:

    • true:输出

    • false:不输出

  • 参数示例

    • fillnan=value:0,outputhist=false:用0填充缺失值,不输出历史数据。

    • fillnan=mean,outputhist=false:用平均值填充缺失值,不输出历史数据。

    • fillnan=local-interpolation,outputhist=false:使用局部插值填充缺失值,不输出历史数据。

使用示例

  • 查询和分析语句

    * | 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_timeprediction_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表示该历史数据中的实际指标。

    • upperBoundBy3StdDevlowerBoundBy3StdDev:这两个字段描述的是以预测值(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代表预测准确度越高。

    • correlationrsquare的平方根。

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)

参数

说明

period_unix_time_array

时间序列中的Unix时间的数组。

metric_value_array

时间序列的指标数值。

说明

period_unix_time_arraymetric_value_array描述一个时间序列。

使用示例

示例一

  • 查询和分析语句

    * | 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)

参数

说明

unixtime_periods

时间序列中时间部分的数组,是double数组类型的Unix时间。

metric_values

时间序列中指标部分的数组,是double数组类型。

begin_unixtime

时间序列数据的时间段范围的开始时刻,double类型的Unix时间。

end_unixtime

时间序列数据的时间段范围的结束时刻。

说明

时间区间[begin_unixtime, end_unixtime)begin_unixtimeend_unixtime组成,其中包含begin_unixtime但不包含end_unixtime

time_unit

时间序列数据的单位时间间隔。例如'10 second' '1 minute''1 hour''1 day''1 week''1 month''1 year'等。

fill_option

可选参数,指定数据填充方法及是否输出历史数据。

  • 数据填充方法:

    • 指定值(value)

    • 均值(mean)

    • 中位数(median)

    • 最小值(min)

    • 最大值(max)

    • 局部插值(local-interpolation)

  • 是否输出历史数据:

    • true:输出

    • false:不输出

  • 参数示例

    • fillnan=value:0,outputhist=false:用0填充缺失值,不输出历史数据。

    • fillnan=mean,outputhist=false:用平均值填充缺失值,不输出历史数据。

    • fillnan=local-interpolation,outputhist=false:使用局部插值填充缺失值,不输出历史数据。

使用示例

  • 查询和分析语句

    * | 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)

参数

说明

unixtime_periods

时间序列中时间部分的数组,是double数组类型的Unix时间。

metric_values

时间序列中指标部分的数组,是double数组类型。

begin_unixtime

时间序列数据的时间段范围的开始时刻,double类型的Unix时间。

end_unixtime

时间序列数据的时间段范围的结束时刻。

说明

时间区间[begin_unixtime, end_unixtime)begin_unixtimeend_unixtime组成,其中包含begin_unixtime但不包含end_unixtime

time_unit

时间序列数据的单位时间间隔。例如'10 second' '1 minute''1 hour''1 day''1 week''1 month''1 year'等。

fill_option

指定数据填充方法及是否输出历史数据。

  • 数据填充方法:

    • 指定值(value)

    • 均值(mean)

    • 中位数(median)

    • 最小值(min)

    • 最大值(max)

    • 局部插值(local-interpolation)

  • 是否输出历史数据:

    • true:输出

    • false:不输出

  • 参数示例

    • fillnan=value:0,outputhist=false:用0填充缺失值,不输出历史数据。

    • fillnan=mean,outputhist=false:用平均值填充缺失值,不输出历史数据。

    • fillnan=local-interpolation,outputhist=false:使用局部插值填充缺失值,不输出历史数据。

使用示例

  • 查询和分析语句

    * | 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这三个字段信息。