時間序列分析函數用於處理互連網服務系統或商務運作中產生的指標資料,這些資料可用於預測未來趨勢和檢測運作過程中的異常情況。Log Service支援時間序列分析函數,本文介紹時間序列分析函數的基本文法和樣本。
背景資訊
本文介紹時間序列分析函數樣本的日誌包含三個欄位索引。更多資訊,請參見建立索引。
日誌範例如下:
{"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
這三個欄位資訊。