Funktionen ai_forecast
Gäller för: Databricks SQL
Viktigt!
Den här funktionen finns i offentlig förhandsversion. Kontakta ditt Databricks-kontoteam för att delta i förhandsversionen.
ai_forecast()
är en tabellvärdesfunktion som är utformad för att extrapolera tidsseriedata i framtiden. Se Argument för tillgängliga argument för att konfigurera den här funktionen.
Krav
Pro- eller Serverless SQL-lager
Syntax
ai_forecast(
observed TABLE,
horizon DATE | TIMESTAMP | STRING,
time_col STRING,
value_col STRING | ARRAY<STRING>,
group_col STRING | ARRAY<STRING> | NULL DEFAULT NULL,
prediction_interval_width DOUBLE DEFAULT 0.95,
frequency STRING DEFAULT 'auto',
seed INTEGER | NULL DEFAULT NULL,
parameters STRING DEFAULT '{}'
)
Argument
ai_forecast()
kan prognostisera valfritt antal grupper (se group_col
) och upp till 100 mått (se value_col
) i varje grupp. Prognosfrekvensen är densamma för alla mått i en grupp men kan skilja sig mellan olika grupper (se frequency
).
Följande är tillgängliga argument för den här funktionen:
observed
är tabellvärdesindata som används som träningsdata för prognosproceduren.- Den här indatarelationen måste innehålla en "tidskolumn" och en eller flera "värde"-kolumner. Kolumnerna "Gruppera" och "parametrar" är valfria. Eventuella ytterligare kolumner i indatarelationen ignoreras.
horizon
är en tidsstämpelbegjutbar kvantitet som representerar den rätt exklusiva sluttiden för prognosresultatet. I en grupp (segroup_col
) sträcker sig prognosresultatet över tiden mellan den senaste observationen och horisonten. Om horisonten är mindre än den senaste observationstiden genereras inga resultat.time_col
är en sträng som refererar till "tidskolumnen" iobserved
. Kolumnen som refereras avtime_col
ska vara enDATE
eller enTIMESTAMP
.value_col
är en sträng eller en matris med strängar som refererar till värdekolumner iobserved
. Kolumnerna som refereras till av det här argumentet ska vara gjutbara tillDOUBLE
.group_col
(valfritt) är en sträng eller en matris med strängar som representerar gruppkolumnerna iobserved
. Om det anges används gruppkolumner som partitioneringsvillkor och prognoser genereras för varje grupp oberoende av varandra. Om de är ospecificerade behandlas de fullständiga indata som en enda grupp.prediction_interval_width
(valfritt) är ett värde mellan 0 och 1 som representerar bredden på förutsägelseintervallet. Framtida värden har enprediction_interval_width
% sannolikhet att falla mellan{v}_upper
och{v}_lower
.frequency
(valfritt) är en tidsenhet eller pandas offsetaliassträng som anger prognosresultatets tidskornighet. Om den är ospecificerad härleds prognoskornigheten automatiskt för varje grupp oberoende av varandra. Om ett frekvensvärde anges tillämpas det lika på alla grupper.- Den härledda frekvensen i en grupp är läget för de senaste observationerna. Det här är en bekvämlighetsåtgärd som inte kan ändras av användaren.
- Till exempel resulterar en tidsserie med 99 "måndagar" och 1 "tisdag" i "veckan" som den härledda frekvensen.
seed
(valfritt) är ett tal som används för att initiera eventuella pseudorandomnummergeneratorer som används i prognosproceduren.parameters
(valfritt) är en strängkodad JSON eller namnet på en kolumnidentifierare som representerar parameteriseringen av prognosproceduren. Alla kombinationer av parametrar kan anges i valfri ordning,{“weekly_order”: 10, “global_cap”: 1000}
till exempel . Alla ospecificerade parametrar bestäms automatiskt baserat på attributen för träningsdata. Följande parametrar stöds:global_cap
ochglobal_floor
kan användas tillsammans eller oberoende för att definiera den möjliga domänen för måttvärdena.{“global_floor”: 0}
kan till exempel användas för att begränsa ett mått som kostnad till att alltid vara positivt. Dessa gäller globalt för träningsdata och prognostiserade data och kan inte användas för att endast ge snäva begränsningar för de prognostiserade värdena.daily_order
ochweekly_order
ange den fyrdigare ordningen för säsongskomponenterna varje dag och vecka.
Returer
En ny uppsättning rader som innehåller prognostiserade data. Utdataschemat innehåller tids- och gruppkolumnerna med sina typer oförändrade. Om kolumnen för indatatid till exempel har typen DATE
blir kolumntypen utdatatid också DATE
. För varje värdekolumn finns det tre utdatakolumner med mönstret {v}_forecast
, {v}_upper
och {v}_lower
. Oavsett indatavärdetyperna är de prognostiserade värdekolumnerna alltid typ DOUBLE
. Utdatatabellen innehåller endast framtida värden, som sträcker sig över tidsperioden mellan slutet av de observerade data till horisont.
Se några exempel på schemainferensen som utförs av AI_FORECAST nedan:
Indatatabell | Argument | Utdatatabell |
---|---|---|
ts: TIMESTAMP val: DOUBLE |
time_col => 'ts' value_col => 'val' |
ts: TIMESTAMP val_forecast: DOUBLE val_upper: DOUBLE val_lower: DOUBLE |
ds: DATE val BIGINT |
time_col => 'ds' value_col => 'val' |
ds: DATE val_forecast: DOUBLE val_upper: DOUBLE val_lower: DOUBLE |
ts: TIMESTAMP dim1: STRING dollars: DECIMAL(10, 2) |
time_col => 'ts' value_col => 'dollars' group_col => 'dim1' |
ts: TIMESTAMP dim1: STRING dollars_forecast: DOUBLE dollars_upper: DOUBLE dollars_lower: DOUBLE |
ts: TIMESTAMP dim1: STRING dim2: BIGINT dollars: DECIMAL(10, 2) users: BIGINT |
time_col => 'ts' value_col => ARRAY('dollars', 'users') group_col => ARRAY('dim1', 'dim2') |
ts: TIMESTAMP dim1: STRING dim2: BIGINT dollars_forecast: DOUBLE dollars_upper: DOUBLE dollars_lower: DOUBLE users_forecast: DOUBLE users_upper: DOUBLE users_lower: DOUBLE |
Exempel
Följande exempelprognoser fram till ett angivet datum:
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'
)
Följande är ett mer komplext exempel:
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}'
)
Observera att det är mycket vanligt att tabeller inte materialiserar 0s eller tomma poster. Om värdena för de saknade posterna kan härledas, till exempel 0
, bör dessa värden sammanslutas innan prognosfunktionen anropas. Om värdena verkligen saknas eller är okända kan de lämnas som NULL
.
För mycket glesa data är det bästa praxis att sammanställa saknade värden eller uttryckligen ange ett frekvensvärde för att undvika oväntade utdata från "automatisk" frekvensinferens. Till exempel kommer "automatisk" frekvensinferens på två poster med 14 dagars mellanrum att härleda en frekvens på "14D" även om "verklig" frekvens kan vara varje vecka med ett värde som saknas. Sammansvetsning av de saknade posterna tar bort den här tvetydigheten.
Slutligen visar vi ett exempel där olika prognosparametrar tillämpas på olika grupper i indatatabellen:
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'
)
Observera användningen av en kolumnidentifierare som parameters
argument. Detta gör det möjligt för användare att lagra tidigare fastställda parameter-JSON:er i en tabell och återanvända dem på nya data.
Begränsningar
Följande begränsningar gäller under förhandsversionen:
- Standardprognosproceduren är en profetliknande linjär modell och säsongsvariation. Det här är den enda tillgängliga prognosproceduren som stöds.
- Felmeddelanden levereras via Python UDTF-motorn och innehåller Python-spårningsinformation. Slutet av spårningsservern innehåller det faktiska felmeddelandet.