時序分析函數(shù)
時間序列分析函數(shù)用于處理互聯(lián)網(wǎng)服務(wù)系統(tǒng)或商務(wù)運作中產(chǎn)生的指標數(shù)據(jù),這些數(shù)據(jù)可用于預(yù)測未來趨勢和檢測運作過程中的異常情況。日志服務(wù)支持時間序列分析函數(shù),本文介紹時間序列分析函數(shù)的基本語法和示例。
背景信息
本文介紹時間序列分析函數(shù)示例的日志包含三個字段索引。更多信息,請參見創(chuàng)建索引。
日志樣例如下:
{"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"}
時序分析函數(shù)列表
函數(shù)名稱 | 語法 | 說明 | 返回值類型 |
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) | 用于時序預(yù)測,根據(jù)給定的時間序列預(yù)測未來指定時間段的指標變化。預(yù)測的結(jié)果以JSON格式返回。 | varchar | |
ts_extract_features(array(double) period_unix_time_array, array(double) metric_value_array) | 用于時序特征提取,以便于利用這些特征進行后續(xù)的機器模式識別。 | array(double) | |
ts_extract_features_in_json(array(double) period_unix_time_array, array(double) metric_value_array) | varchar | ||
| 用于時序填充,對缺失的時間點補充數(shù)據(jù)。 | 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函數(shù)
根據(jù)給定的時間序列,預(yù)測未來指定時間段的指標變化。預(yù)測的結(jié)果以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)
參數(shù) | 說明 |
| 時序中時間部分的數(shù)組。 入?yún)㈩愋头譃?種:
|
| 時序中指標部分的數(shù)組,專注于非零數(shù)值的數(shù)據(jù)點。函數(shù)需指定時間段范圍以便于對缺失數(shù)據(jù)進行填充。 |
| 時序數(shù)據(jù)的時間段范圍的開始時刻。 入?yún)㈩愋头譃?種:
|
| 時序數(shù)據(jù)的時間段范圍的結(jié)束時刻。 入?yún)㈩愋头譃?種:
說明 時間區(qū)間 |
| 往前預(yù)測到這個時刻為止,不包含這個時刻。 可以為兩種類型入?yún)ⅲ?/span>
|
| 時間序列數(shù)據(jù)的單位時間間隔。例如 |
| 可選參數(shù),指定數(shù)據(jù)填充方法及是否輸出歷史數(shù)據(jù)。
|
使用示例
查詢和分析語句
* | 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
返回結(jié)果
{ "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 } }
返回參數(shù)說明:
參數(shù)
說明
predictions
時間序列預(yù)測結(jié)果以結(jié)構(gòu)體數(shù)組形式呈現(xiàn),每個結(jié)構(gòu)體代表一個時間點的預(yù)測值。預(yù)測的時間范圍由
data_end_time
和prediction_end_time
參數(shù)確定,構(gòu)成一個左開右閉的時間區(qū)間。若在`options`參數(shù)中設(shè)置outputhist=true
,則數(shù)組將包含歷史數(shù)據(jù),使得整個數(shù)據(jù)的時間范圍擴展至[data_begin_time, prediction_end_time)
。結(jié)構(gòu)體數(shù)組參數(shù)說明:
timePeriod
:預(yù)測的時間點。prediction
:預(yù)測指標的數(shù)值。actualValue
:實際的數(shù)據(jù)值。在[data_end_time, prediction_end_time)時間區(qū)間內(nèi),actualValue的值均為NaN,原因是該時間段尚未產(chǎn)生實際的指標數(shù)據(jù)。當參數(shù)選項中設(shè)置'outputhist=true'
時,predictions
字段內(nèi)的數(shù)組將包含[data_begin_time, data_end_time)時間范圍的歷史數(shù)據(jù),其中actualValue
表示該歷史數(shù)據(jù)中的實際指標。upperBoundBy3StdDev
和lowerBoundBy3StdDev
:這兩個字段描述的是以預(yù)測值(prediction)為中心的訓練預(yù)測誤差的3倍標準差區(qū)間邊界。這些區(qū)間通常代表99%的置信區(qū)間,表明未來收集的真實值有99%的概率落在所預(yù)測的區(qū)間范圍內(nèi)。可以通過結(jié)合prediction值與errorSummary.standardDeviation字段來計算一個自定義的置信區(qū)間,例如,在兩個標準誤差范圍內(nèi)的預(yù)測區(qū)間。然而,當區(qū)間變得更加狹窄時,置信水平也會相應(yīng)降低,例如,兩個標準誤差內(nèi)的置信區(qū)間將大概降至95%。isForecast
:判斷數(shù)據(jù)點對應(yīng)的時間是屬于未來還是歷史,通過與預(yù)設(shè)的時間點data_end_time
進行比較實現(xiàn)。具體而言,如果數(shù)據(jù)點的時間小于data_end_time
,則返回false,表示該數(shù)據(jù)點位于過去;反之,則返回true,表示數(shù)據(jù)點指向未來。
isHistoryIncluded
predictions
字段里的內(nèi)容是否包含歷史數(shù)據(jù)。true:包含歷史數(shù)據(jù)。
false:不包含歷史數(shù)據(jù)。
errorSummary
預(yù)測在歷史數(shù)據(jù)上測試模型時的預(yù)測誤差的概括。預(yù)測模型會在歷史數(shù)據(jù)上測試,在指標預(yù)測中,預(yù)測值與實際值之間的差異會產(chǎn)生誤差。通過對歷史數(shù)據(jù)進行預(yù)測并總結(jié)相應(yīng)的統(tǒng)計值,可以評估預(yù)測的整體準確性。
meanAbsError
:預(yù)測誤差的絕對值的平均值。meanAbsPercentageError
:相對百分比誤差的絕對值的平均值。rootMeanSquareError
:均方誤差,即誤差的平方的平均值的平方根。standardDeviation
:誤差的標準差,表示預(yù)測的平均上下波動的大小。meanError
:誤差的平均值。sampleSize
:歷史數(shù)據(jù)樣本的個數(shù)(樣本容量)。targetMean
:指標歷史數(shù)據(jù)樣本的平均值。targetStdDev
:指標歷史數(shù)據(jù)樣本的標準差。rsquare
:R平方值是衡量回歸模型預(yù)測精度的一個指標,基于歷史數(shù)據(jù)進行測試,范圍是(0,1)
,越接近1代表預(yù)測準確度越高。correlation
:rsquare
的平方根。
ts_extract_features或ts_extract_features_in_json函數(shù)
主要對時間序列進行特征提取,方便用戶使用這些特征進行后續(xù)的機器模式識別。
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)
參數(shù) | 說明 |
| 時間序列中的Unix時間的數(shù)組。 |
| 時間序列的指標數(shù)值。 說明
|
使用示例
示例一
查詢和分析語句
* | select metric_id, ts_extract_features( array_agg(to_unixtime(time_period)), array_agg(metric_value)) as feature_values group by metric_id
返回結(jié)果
feature_values
是生成的特征值的數(shù)組。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
返回結(jié)果
names
:特征向量名稱構(gòu)成的數(shù)組。values
:特征向量值構(gòu)成的數(shù)組。
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函數(shù)
用于時序填充,對缺失的時間點補充數(shù)據(jù)。
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)
參數(shù) | 說明 |
| 時間序列中時間部分的數(shù)組,是double數(shù)組類型的Unix時間。 |
| 時間序列中指標部分的數(shù)組,是double數(shù)組類型。 |
| 時間序列數(shù)據(jù)的時間段范圍的開始時刻,double類型的Unix時間。 |
| 時間序列數(shù)據(jù)的時間段范圍的結(jié)束時刻。 說明 時間區(qū)間 |
| 時間序列數(shù)據(jù)的單位時間間隔。例如 |
fill_option | 可選參數(shù),指定數(shù)據(jù)填充方法及是否輸出歷史數(shù)據(jù)。
|
使用示例
查詢和分析語句
* | 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
返回結(jié)果
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函數(shù)
分析一個時間序列的近似的多個周期。
varchar ts_analyze_cycles(array(double) unixtime_periods, array(double) metric_values, double begin_unixtime, end_unixtime, varchar time_unit, varchar fill_option)
參數(shù) | 說明 |
| 時間序列中時間部分的數(shù)組,是double數(shù)組類型的Unix時間。 |
| 時間序列中指標部分的數(shù)組,是double數(shù)組類型。 |
| 時間序列數(shù)據(jù)的時間段范圍的開始時刻,double類型的Unix時間。 |
| 時間序列數(shù)據(jù)的時間段范圍的結(jié)束時刻。 說明 時間區(qū)間 |
| 時間序列數(shù)據(jù)的單位時間間隔。例如 |
fill_option | 指定數(shù)據(jù)填充方法及是否輸出歷史數(shù)據(jù)。
|
使用示例
查詢和分析語句
* | 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
返回結(jié)果
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}]}
返回結(jié)果參數(shù)說明:
參數(shù)
說明
cycleSize
最相似的周期長度。
cycleCorrelation
最相似的周期的相關(guān)程度。
frequencyWeight
對時間序列進行功率譜分析之后對應(yīng)周期的譜密度的大小。
topCycles
對時間序列的多周期分析,提供最多前五個周期的相關(guān)分析數(shù)據(jù)。每一個周期都包含
cycleSize
,cycleCorrelation
,frequencyWeight
這三個字段信息。