Función ai_forecast
Se aplica a: Databricks SQL
Importante
Esta funcionalidad está en versión preliminar pública. Póngase en contacto con el equipo de la cuenta de Databricks para participar en la versión preliminar.
La función ai_forecast()
es una función con valores de tabla diseñada para extrapolar los datos de series temporales en el futuro. Consulte Argumentos para ver los argumentos disponibles para configurar esta función.
Requisito
Almacenamiento SQL pro o sin servidor
Sintaxis
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 '{}'
)
Argumentos
ai_forecast()
puede predecir cualquier número de grupos (consulte group_col
) y hasta 100 métricas (consulte value_col
) dentro de cada grupo. La frecuencia de previsión es la misma para todas las métricas de un grupo, pero puede ser diferente en distintos grupos (consulte frequency
).
Están disponibles los siguientes argumentos para esta función:
observed
es la entrada con valores de tabla que se usa como datos de entrenamiento para el procedimiento de previsión.- Esta relación de entrada debe contener una columna "time" y una o varias columnas "value". Las columnas "Group" y "parameters" son opcionales. Se omiten las columnas adicionales de la relación de entrada.
horizon
es una cantidad convertible de marca de tiempo que representa la hora de finalización exclusiva de los resultados de previsión. Dentro de un grupo (vergroup_col
) los resultados de previsión abarcan el tiempo entre la última observación y el horizonte. Si horizon es menor que la última hora de observación, no se generan resultados.time_col
es una cadena que hace referencia a la "columna de tiempo" enobserved
. La columna a la que hace referenciatime_col
debe ser unDATE
o unTIMESTAMP
.value_col
es una cadena o una matriz de cadenas que hacen referencia a columnas de valor enobserved
. Las columnas a las que hace referencia este argumento deben convertirse enDOUBLE
.group_col
(opcional) es una cadena o una matriz de cadenas que representan las columnas de grupo enobserved
. Si se especifica, las columnas de grupo se usan como criterios de creación de particiones y las previsiones se generan para cada grupo de forma independiente. Si no se especifica, los datos de entrada completos se tratan como un único grupo.prediction_interval_width
(opcional) es un valor entre 0 y 1 que representa el ancho del intervalo de predicción. Los valores futuros tienen una probabilidadprediction_interval_width
% de estar entre{v}_upper
y{v}_lower
.frequency
(opcional) es una cadena de alias de desplazamiento de pandas o unidad de tiempo que especifica la granularidad de tiempo de los resultados de la previsión. Si no se especifica, la granularidad de la previsión se deduce automáticamente para cada grupo de forma independiente. Si se especifica un valor de frecuencia, se aplica igualmente a todos los grupos.- La frecuencia inferida dentro de un grupo es el modo de las observaciones más recientes. Se trata de una operación de conveniencia que el usuario no puede optimizar.
- Por ejemplo, una serie temporal con 99 "lunes" y 1 "martes" da como resultado que la "semana" sea la frecuencia inferida.
seed
(opcional) es un número que se usa para inicializar los generadores de números pseudoaleatorios utilizados en el procedimiento de previsión.parameters
(opcional) es un JSON con codificación de cadena o el nombre de un identificador de columna que representa la parametrización del procedimiento de previsión. Cualquier combinación de parámetros se puede especificar en cualquier orden, por ejemplo,{“weekly_order”: 10, “global_cap”: 1000}
. Los parámetros no especificados se determinan automáticamente en función de los atributos de los datos de entrenamiento. Se admiten los siguientes parámetros:global_cap
yglobal_floor
se pueden usar juntos o de forma independiente para definir el dominio posible de los valores de métricas.{“global_floor”: 0}
, por ejemplo, se puede usar para restringir una métrica como el costo para que siempre sea positivo. Se aplican globalmente a los datos de entrenamiento y a los datos previstos, y no se pueden usar para proporcionar restricciones estrictas solo en los valores previstos.daily_order
yweekly_order
establecen el orden fourier de los componentes de estacionalidad diaria y semanal.
Devoluciones
Nuevo conjunto de filas que contienen los datos previstos. El esquema de salida contendrá la hora y las columnas de grupo con sus tipos sin cambios. Por ejemplo, si la columna de hora de entrada tiene el tipo DATE
, el tipo de columna de hora de salida también será DATE
. Para cada columna de valor hay tres columnas de salida con el patrón {v}_forecast
, {v}_upper
y {v}_lower
. Independientemente de los tipos de valor de entrada, las columnas de valor previsto siempre son de tipo DOUBLE
. La tabla de salida solo contiene valores futuros, que abarcan el intervalo de tiempo entre el final de los datos observados hasta el horizonte.
Consulte algunos ejemplos de la inferencia de esquema realizada por AI_FORECAST a continuación:
Input table (Tabla de entrada) | Argumentos | Tabla de salida |
---|---|---|
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 |
Ejemplos
En el ejemplo siguiente se prevé hasta una fecha especificada:
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'
)
A continuación se muestra un ejemplo más complejo:
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}'
)
Tenga en cuenta que es muy común que las tablas no materialicen 0 o entradas vacías. Si los valores de las entradas que faltan se pueden deducir, por ejemplo 0
, estos valores se deben fusionar antes de llamar a la función de previsión. Si los valores realmente faltan o se desconocen, se pueden dejar como NULL
.
Para los datos muy dispersos, se recomienda fusionar valores que faltan o proporcionar un valor de frecuencia explícitamente para evitar una salida inesperada de la inferencia de frecuencia "automática". Por ejemplo, la inferencia de frecuencia "automática" en dos entradas separadas de 14 días deducirá una frecuencia de "14D", incluso si la frecuencia "real" podría ser semanal con 1 valor que falta. La fusión de las entradas que faltan elimina esta ambigüedad.
Por último, se muestra un ejemplo en el que se aplican distintos parámetros de previsión a distintos grupos de la tabla de entrada:
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'
)
Tenga en cuenta el uso de un identificador de columna como argumento parameters
. Esto permite a los usuarios almacenar JSON de parámetros determinados previamente en una tabla y reutilizarlos en nuevos datos.
Limitaciones
Se aplican las siguientes limitaciones durante la versión preliminar:
- El procedimiento de previsión predeterminado es un modelo lineal y estacionalidad similar a un profeta. Este es el único procedimiento de previsión admitido disponible.
- Los mensajes de error se entregan a través del motor UDTF de Python y contienen información de seguimiento de Python. El final del seguimiento contiene el mensaje de error real.