適用於:
Databricks SQL
ai_forecast() 是一個表值函數,能將時間序列資料向前推推。 如需設定此函式的可用引數,請參閱引數。
此函式有兩個版本。 第二版採用研究優化的時間序列基礎模型,提升開箱即用的準確度,第二版則新增假日、外部協變量及非負預報支援。 用參數 version 選擇執行的版本。 詳情請參見 論證 。
要求
- Pro 或 無伺服器 SQL 資料倉儲
- 將您的工作空間註冊到 預測 AI 功能 預覽(推薦版本 2 為必備)。 請參閱 管理 Azure Databricks 預覽。
語法
Tip
Azure Databricks recommends version 2 for ai_forecast. 版本 2 相較於版本 1 提供了以下改進:
- 一個研究優化的時間序列基礎模型,旨在提升開箱即用的準確度
- 內建節日支援
holiday_region - 外部協變量,包括未來與僅過去的協變量,且
covariate_col - 非負預報
positive_only
使用版本 2 時,請傳遞 version => '2'。 請確保您已啟用 預測 AI 功能 預覽。 請參閱 管理 Azure Databricks 預覽。
版本 2(推薦)
ai_forecast(observed, horizon, time_col, value_col
[, group_col] [, covariate_col] [, prediction_interval_width]
[, frequency] [, holiday_region] [, positive_only] [, version])
第 1 版
ai_forecast(observed, horizon, time_col, value_col
[, group_col] [, prediction_interval_width] [, frequency]
[, seed] [, parameters] [, version])
引數
ai_forecast() 可以預測任意數目的群組 (請參閱 group_col) 和每個群組中最多 100 個計量 (請參閱 value_col)。 同一群組中所有指標的預測頻率相同,但不同群組間可能有所不同(參見 frequency)。
版本 2(推薦)
-
observed是用作預測程序訓練數據的表格數據輸入。- 此輸入關係必須包含一個「時間」欄位及一個或多個「值」欄位。 「群組」與「協變量」欄位為可選。 輸入關聯中的任何額外數據行會被忽略。
-
horizon是一個可轉換為時間戳記的數量,表示預測結果的唯一正確結束時間。 在一個群組 (請參閱group_col) 中,預測結果的時間範圍是從上次觀測到預測期。 如果邊際小於上次觀測時間,則不會產生任何結果。 -
time_col是參考 中observed「時間欄位」的字串。 所time_col參考的欄位必須是 aDATE或TIMESTAMP。 -
value_col是字串或字串陣列,參考observed中的數值列。 此參數所參考的欄位必須可鑄造成DOUBLE。 -
group_col(選擇性) 是字串或字串陣列,代表observed中的群組數據行。 如果指定,則會使用群組數據行做為分割準則,而且會針對每個群組獨立產生預測。 如果未指定,則完整輸入資料將視為單一群組。 -
covariate_col(可選)是參考外部共變量欄位observed的字串或字串陣列。 協變數是影響預報的其他變數,例如價格、行銷支出或天氣。 支援兩種協變量:-
未來協變數:預測期內的數值已知,例如計畫定價或排程廣告活動。 要以此方式使用協變數,請在中加入涵蓋預測視界(最後一次觀測之後的日期,最多到
observed)的列horizon,並填入協變量,value_col欄位則留在NULL。ai_forecast預測這些NULL-target 列,並以其協變數值為條件。 -
僅過去的協變量:數值僅適用於歷史期間,例如觀測到的天氣或宏觀經濟指標。 只在歷史列中填充協變數。 如果你沒有在預測範圍內提供協變數值,而是
ai_forecast僅將協變數作為過去值使用;這不是錯誤。
-
未來協變數:預測期內的數值已知,例如計畫定價或排程廣告活動。 要以此方式使用協變數,請在中加入涵蓋預測視界(最後一次觀測之後的日期,最多到
-
prediction_interval_width(選用) 是一個介於 0 和 1 之間的值,表示預測間隔的寬度。 預測值有prediction_interval_width% 機率落在{v}_upper與{v}_lower之間。 -
frequency(可選)是 pandas 偏移別名字串(例如'D', ,'W''ME','H') 用以指定預報結果的時間細節。 如果未指定,則會自動為每個群組單獨推斷預測細微性。 若指定,必須與各組內輸入資料的推斷細度相符。- 群組內推斷的頻率是最近觀測的模式。 這種推論是一種方便操作,使用者無法調整。
- 例如,一個包含99個「星期一」和1個「星期二」的時間序列,推斷出的「週」即為頻率。
-
holiday_region(可選)是一個區域代碼,能自動模擬該區域的節日效應,例如'US'。 若未指定,則不模擬假日效應。 -
positive_only(可選)當設為TRUE時,會限制預測值為非負值。 這個論點可以用在不能為負的指標上,例如銷售、盤點或庫存。 預設值為FALSE。 -
version(可選):版本切換以支援遷移('1'針對版本 1 行為,'2'針對版本 2 行為)。 若未指定,則預設為版本 1。 版本 2 的參數 (covariate_col,holiday_region,positive_only) 需要version => '2'。
第 1 版
-
observed是用作預測程序訓練數據的表格數據輸入。- 此輸入關係必須包含一個「時間」欄位及一個或多個「值」欄位。 「群組」和「參數」欄位是可選的。 輸入關聯中的任何額外數據行會被忽略。
-
horizon是一個可轉換為時間戳記的數量,表示預測結果的唯一正確結束時間。 在一個群組 (請參閱group_col) 中,預測結果的時間範圍是從上次觀測到預測期。 如果邊際小於上次觀測時間,則不會產生任何結果。 -
time_col是參考 中observed「時間欄位」的字串。 所time_col參考的欄位必須是 aDATE或TIMESTAMP。 -
value_col是字串或字串陣列,參考observed中的數值列。 此參數所參考的欄位必須可鑄造成DOUBLE。 -
group_col(選擇性) 是字串或字串陣列,代表observed中的群組數據行。 如果指定,則會使用群組數據行做為分割準則,而且會針對每個群組獨立產生預測。 如果未指定,則完整輸入資料將視為單一群組。 -
prediction_interval_width(選用) 是一個介於 0 和 1 之間的值,表示預測間隔的寬度。 預測值有prediction_interval_width% 機率落在{v}_upper與{v}_lower之間。 -
frequency(選擇性) 是時間單位或 pandas 位移別名字符串,指定預測結果的時間粒度。 如果未指定,則會自動為每個群組單獨推斷預測細微性。 如果已指定頻率值,則會同樣套用至所有群組。- 群組內推斷的頻率是最近觀測的模式。 這種推論是一種方便操作,使用者無法調整。
- 例如,一個包含99個「星期一」和1個「星期二」的時間序列,推斷出的「週」即為頻率。
-
seed(可選)是用來啟動預測過程中任何偽隨機數產生器的數字。 -
parameters(選擇性) 是字串編碼的 JSON 或數據行標識碼的名稱,代表預測程式的參數化。 任何參數組合都可以依任何順序指定,例如,{"weekly_order": 10, "global_cap": 1000}。 任何未指定的參數都會根據定型數據的屬性自動決定。 支援下列參數:-
global_cap和global_floor可以一起使用,或單獨用來定義計量值的可能定義域。 例如,{"global_floor": 0}可用於限制成本等計量一律為正數。 這些限制適用於訓練資料與預測資料,無法僅對預測值提供嚴格約束。 -
daily_order和weekly_order設定每日和每週季節性成分的傅立葉階數。
-
-
version(可選):版本切換以支援遷移('1'針對版本 1 行為,'2'針對版本 2 行為)。 若未指定,則預設為版本 1。 版本 2 的參數 (covariate_col,holiday_region,positive_only) 需要version => '2'。
退貨
版本 2(推薦)
包含預測數據的新數據列集。 輸出結構包含時間欄與群組欄位,且其類型未變。 例如,若輸入時間欄位的型別 DATE為 ,則輸出時間欄位的類型也是 DATE。 針對每個值資料列,有三個輸出資料列具有模式 {v}_forecast、{v}_upper和 {v}_lower。 不論輸入值類型為何,預測的值資料行一律是類型 DOUBLE。 輸出表僅包含預測值,涵蓋從觀測數據結束到視界的時間範圍。
下表展示了AI_FORECAST所執行的模式推論範例:
| 輸入數據表 | 引數 | 輸出數據表 |
|---|---|---|
ts: TIMESTAMPval: DOUBLE |
time_col => 'ts'value_col => 'val' |
ts: TIMESTAMPval_forecast: DOUBLEval_upper: DOUBLEval_lower: DOUBLE |
ds: DATEval BIGINT |
time_col => 'ds'value_col => 'val' |
ds: DATEval_forecast: DOUBLEval_upper: DOUBLEval_lower: DOUBLE |
ts: TIMESTAMPdim1: STRINGdollars: DECIMAL(10, 2) |
time_col => 'ts'value_col => 'dollars'group_col => 'dim1' |
ts: TIMESTAMPdim1: STRINGdollars_forecast: DOUBLEdollars_upper: DOUBLEdollars_lower: DOUBLE |
ts: TIMESTAMPdim1: STRINGdim2: BIGINTdollars: DECIMAL(10, 2)users: BIGINT |
time_col => 'ts'value_col => ARRAY('dollars', 'users')group_col => ARRAY('dim1', 'dim2') |
ts: TIMESTAMPdim1: STRINGdim2: BIGINTdollars_forecast: DOUBLEdollars_upper: DOUBLEdollars_lower: DOUBLEusers_forecast: DOUBLEusers_upper: DOUBLEusers_lower: DOUBLE |
第 1 版
包含預測數據的新數據列集。 輸出結構包含時間欄與群組欄位,且其類型未變。 例如,若輸入時間欄位的型別 DATE為 ,則輸出時間欄位的類型也是 DATE。 針對每個值資料列,有三個輸出資料列具有模式 {v}_forecast、{v}_upper和 {v}_lower。 不論輸入值類型為何,預測的值資料行一律是類型 DOUBLE。 輸出表僅包含預測值,涵蓋從觀測數據結束到視界的時間範圍。
下表展示了AI_FORECAST所執行的模式推論範例:
| 輸入數據表 | 引數 | 輸出數據表 |
|---|---|---|
ts: TIMESTAMPval: DOUBLE |
time_col => 'ts'value_col => 'val' |
ts: TIMESTAMPval_forecast: DOUBLEval_upper: DOUBLEval_lower: DOUBLE |
ds: DATEval BIGINT |
time_col => 'ds'value_col => 'val' |
ds: DATEval_forecast: DOUBLEval_upper: DOUBLEval_lower: DOUBLE |
ts: TIMESTAMPdim1: STRINGdollars: DECIMAL(10, 2) |
time_col => 'ts'value_col => 'dollars'group_col => 'dim1' |
ts: TIMESTAMPdim1: STRINGdollars_forecast: DOUBLEdollars_upper: DOUBLEdollars_lower: DOUBLE |
ts: TIMESTAMPdim1: STRINGdim2: BIGINTdollars: DECIMAL(10, 2)users: BIGINT |
time_col => 'ts'value_col => ARRAY('dollars', 'users')group_col => ARRAY('dim1', 'dim2') |
ts: TIMESTAMPdim1: STRINGdim2: BIGINTdollars_forecast: DOUBLEdollars_upper: DOUBLEdollars_lower: DOUBLEusers_forecast: DOUBLEusers_upper: DOUBLEusers_lower: DOUBLE |
範例
版本 2(推薦)
以下範例使用版本2預測至指定日期:
WITH
aggregated AS (
SELECT
DATE(tpep_pickup_datetime) AS ds,
SUM(fare_amount) AS revenue
FROM
samples.nyctaxi.trips
GROUP BY
1
)
SELECT * FROM AI_FORECAST(
TABLE(aggregated),
horizon => '2016-03-31',
time_col => 'ds',
value_col => 'revenue',
version => '2'
)
以下範例模擬了美國的假期效應,並將預測限制為非負值:
WITH
aggregated AS (
SELECT
DATE(tpep_pickup_datetime) AS ds,
SUM(fare_amount) AS revenue
FROM
samples.nyctaxi.trips
GROUP BY
1
)
SELECT * FROM AI_FORECAST(
TABLE(aggregated),
horizon => '2016-03-31',
time_col => 'ds',
value_col => 'revenue',
holiday_region => 'US',
positive_only => true,
version => '2'
)
以下範例使用外部協變量。
observed表格(daily_sales)包含promotion一個同時填充歷史期間與預報視界的欄位,revenue預報視界列中左側NULL,因此promotion用作未來協變數:
SELECT * FROM AI_FORECAST(
TABLE(daily_sales),
horizon => '2016-03-31',
time_col => 'ds',
value_col => 'revenue',
covariate_col => 'promotion',
version => '2'
)
第 1 版
下列範例預測截止指定日期之前的情況:
WITH
aggregated AS (
SELECT
DATE(tpep_pickup_datetime) AS ds,
SUM(fare_amount) AS revenue
FROM
samples.nyctaxi.trips
GROUP BY
1
)
SELECT * FROM AI_FORECAST(
TABLE(aggregated),
horizon => '2016-03-31',
time_col => 'ds',
value_col => 'revenue'
)
以下是更複雜的範例:
WITH
aggregated AS (
SELECT
DATE(tpep_pickup_datetime) AS ds,
dropoff_zip,
SUM(fare_amount) AS revenue,
COUNT(*) AS n_trips
FROM
samples.nyctaxi.trips
GROUP BY
1, 2
),
spine AS (
SELECT all_dates.ds, all_zipcodes.dropoff_zip
FROM (SELECT DISTINCT ds FROM aggregated) all_dates
CROSS JOIN (SELECT DISTINCT dropoff_zip FROM aggregated) all_zipcodes
)
SELECT * FROM AI_FORECAST(
TABLE(
SELECT
spine.*,
COALESCE(aggregated.revenue, 0) AS revenue,
COALESCE(aggregated.n_trips, 0) AS n_trips
FROM spine LEFT JOIN aggregated USING (ds, dropoff_zip)
),
horizon => '2016-03-31',
time_col => 'ds',
value_col => ARRAY('revenue', 'n_trips'),
group_col => 'dropoff_zip',
prediction_interval_width => 0.9,
parameters => '{"global_floor": 0}'
)
注意
ai_forecast 不會將表格中缺失的或 NULL 條目的值填補為 0。 如果能推斷出缺失元素的正確值,則必須在呼叫 ai_forecast 函數前將它們合併。 如果值確實遺失或未知,您可以將值保留為 NULL 或移除這些值。
對於稀疏資料,最佳做法是整合缺失值或明確提供頻率值,以避免「自動」頻率推論產生意外輸出。 例如,對兩個相隔14天的條目進行「自動」頻率推斷,即使「真實」頻率可能是每週一次且缺失1個值,也會推斷出「14D」頻率。 合併遺失的項目會消除這種歧義。
以下範例展示了輸入表中不同群組如何應用不同的預報參數。 此範例使用 parameters 自變數作為數據行標識符。 此方法讓使用者能將先前確定的參數 JSON 儲存在資料表中,並在新資料中重複使用。
WITH past AS (
SELECT
CASE
WHEN fare_amount < 30 THEN 'Under $30'
ELSE '$30 or more'
END AS revenue_bucket,
CASE
WHEN fare_amount < 30 THEN '{"daily_order": 0}'
ELSE '{"daily_order": "auto"}'
END AS parameters,
DATE(tpep_pickup_datetime) AS ds,
SUM(fare_amount) AS revenue
FROM samples.nyctaxi.trips
GROUP BY ALL
)
SELECT * FROM AI_FORECAST(
TABLE(past),
horizon => (SELECT MAX(ds) + INTERVAL 30 DAYS FROM past),
time_col => 'ds',
value_col => 'revenue',
group_col => ARRAY('revenue_bucket'),
parameters => 'parameters'
)
限制
版本 2(推薦)
測試期間適用以下限制:
- 版本 2 目前還在 Beta 階段,並非預設版本。 要使用版本 2,請透過設定
version => '2'選擇加入。 版本 1 目前處於公開預覽階段,仍是預設版本。 - 預設的預測程序是時間序列基礎模型。 此模型是目前唯一被支援的預測程序。
- 錯誤訊息透過 Python UDTF 引擎傳遞,並包含 Python 回溯資訊。 回溯結尾包含實際的錯誤訊息。
- 每次呼叫 的
ai_forecast執行獨立推理。 如果你多次呼叫ai_forecast不同prediction_interval_width值以產生巢狀預測區間,所得區間無法保證巢狀。 比較預測區間時,使用一個值的ai_forecast單一prediction_interval_width呼叫。
第 1 版
公開預覽期間適用以下限制:
- 版本 1 目前為公開預覽版,為預設版本。 版本 2 目前為 Beta 版,可透過設定
version => '2'取得。 - 版本 1 正在棄用路徑上。 在即將推出的版本中,預設版本會改為版本 2,而版本 1 則被棄用。 若要在預設變更後繼續使用版本 1 的行為,請透過設定
version => '1'釘選 。 - 預設的預測操作使用了一種類似 Prophet 的分段線性與季節性模型。 此模型是目前唯一被支援的預測程序。
- 錯誤訊息透過 Python UDTF 引擎傳遞,並包含 Python 回溯資訊。 回溯結尾包含實際的錯誤訊息。
- 每次呼叫 都會
ai_forecast執行獨立的分位數迴歸。 如果你多次呼叫ai_forecast不同prediction_interval_width值以產生巢狀預測區間,所得區間無法保證正確巢狀,因為分位數是跨呼叫獨立計算,且沒有約束來驗證正確排序。 比較預測區間時,使用一個值的ai_forecast單一prediction_interval_width呼叫。