全部產品
Search
文件中心

Simple Log Service:時序分析函數

更新時間:Oct 30, 2024

時間序列分析函數用於處理互連網服務系統或商務運作中產生的指標資料,這些資料可用於預測未來趨勢和檢測運作過程中的異常情況。Log Service支援時間序列分析函數,本文介紹時間序列分析函數的基本文法和樣本。

背景資訊

  • 本文介紹時間序列分析函數樣本的日誌包含三個欄位索引。更多資訊,請參見建立索引

    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這三個欄位資訊。