Função ai_forecast
Aplica-se a: SQL do Databricks
Importante
Esta funcionalidade está em Visualização Pública. Entre em contato com sua equipe de conta do Databricks para participar da versão prévia.
ai_forecast()
é uma função com valor de tabela projetada para extrapolar dados de série temporal no futuro. Consulte Argumentos para saber os argumentos disponíveis para configurar essa função.
Requisito
SQL warehouse Pro ou Serverless
Sintaxe
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()
pode prever qualquer número de grupos (consulte group_col
) e até 100 métricas (consulte value_col
) dentro de cada grupo. A frequência de previsão é a mesma para todas as métricas em um grupo, mas pode ser diferente em diferentes grupos (consulte frequency
).
As seguintes são argumentos disponíveis para esta função:
observed
é a entrada com valor de tabela usada como dados de treinamento para o procedimento de previsão.- Essa relação de entrada deve conter uma coluna de “tempo” e uma ou mais colunas de “valor”. As colunas “Grupo” e “parâmetros” são opcionais. Quaisquer colunas adicionais na relação de entrada são ignoradas.
horizon
é uma quantidade convertível em carimbo de data/hora que representa o horário de término exclusivo dos resultados da previsão. Dentro de um grupo (vejagroup_col
), os resultados da previsão abrangem o tempo entre a última observação e o horizonte. Se o horizonte for menor que o último tempo de observação, nenhum resultado será gerado.time_col
é uma cadeia de caracteres que faz referência à “coluna de tempo” emobserved
. A coluna referenciada portime_col
deve ser umDATE
ou umTIMESTAMP
.value_col
é uma cadeia de caracteres ou uma matriz de strings que faz referência a colunas de valor emobserved
. As colunas referenciadas por esse argumento devem ser convertíveis paraDOUBLE
.group_col
(opcional) é uma cadeia de caracteres ou um matriz de cadeia de caracteres que representa as colunas do grupo emobserved
. Se especificado, as colunas de grupo serão usadas como critérios de particionamento e as previsões serão geradas para cada grupo de forma independente. Se não for especificado, todos os dados de entrada serão tratados como um único grupo.prediction_interval_width
(opcional) é um valor entre 0 e 1 que representa a largura do intervalo de predição. Os valores futuros têm uma probabilidade deprediction_interval_width
% de cair entre{v}_upper
e{v}_lower
.frequency
(opcional) é uma unidade de tempo ou cadeia de caracteres de alias de deslocamento do pandas que especifica a granularidade de tempo dos resultados da previsão. Se não for especificado, a granularidade da previsão será inferida automaticamente para cada grupo de forma independente. Se um valor de frequência for especificado, ele será aplicado igualmente a todos os grupos.- A frequência inferida dentro de um grupo é a moda das observações mais recentes. Essa é uma operação de conveniência que não pode ser ajustada pelo usuário.
- Por exemplo, uma série temporal com 99 “segundas-feiras” e 1 “terça-feira” resulta na “semana” sendo a frequência inferida.
seed
(opcional) é um número usado para inicializar qualquer gerador de números pseudoaleatórios usado no procedimento de previsão.parameters
(opcional) é um JSON codificado em cadeia de caracteres ou o nome de um identificador de coluna que representa a parametrização do procedimento de previsão. Qualquer combinação de parâmetros pode ser especificada em qualquer ordem, por exemplo,{“weekly_order”: 10, “global_cap”: 1000}
. Quaisquer parâmetros não especificados são determinados automaticamente com base nos atributos dos dados de treinamento. Os seguintes parâmetros são compatíveis:global_cap
eglobal_floor
podem ser usados em conjunto ou independentemente para definir o domínio possível dos valores métricos.{“global_floor”: 0}
, por exemplo, pode ser usado para restringir uma métrica como o custo a ser sempre positiva. Eles se aplicam globalmente aos dados de treinamento e aos dados previstos e não podem ser usados para fornecer restrições rígidas apenas aos valores previstos.daily_order
eweekly_order
definir a ordem de Fourier dos componentes de sazonalidade diária e semanal.
Devoluções
Um novo conjunto de linhas contendo os dados previstos. O esquema de saída conterá as colunas de tempo e grupo com seus tipos inalterados. Por exemplo, se a coluna de tempo de entrada tiver o tipo DATE
, o tipo de coluna de tempo de saída também será DATE
. Para cada coluna de valor existem três colunas de saída com o padrão {v}_forecast
, {v}_upper
, e {v}_lower
. Independentemente dos tipos de valores de entrada, as colunas de valores previstos são sempre do tipo DOUBLE
. A tabela de saída contém apenas valores futuros, abrangendo o intervalo de tempo entre o final dos dados observados até o horizonte.
Veja alguns exemplos da inferência de esquema realizada pelo AI_FORECAST abaixo:
Tabela de entrada | Argumentos | Tabela de saída |
---|---|---|
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 |
Exemplos
O exemplo a seguir prevê até uma data 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'
)
O seguinte é um exemplo mais complexo:
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}'
)
Observe que é muito comum que as tabelas não materializem 0s ou entradas vazias. Se os valores das entradas ausentes puderem ser inferidos, por exemplo 0
, então esses valores deverão ser reunidos antes de chamar a função de previsão. Se os valores estiverem realmente ausentes ou desconhecidos, eles poderão ser deixados como NULL
.
Para dados muito esparsos, é uma prática recomendada unir valores ausentes ou fornecer explicitamente um valor de frequência para evitar resultados inesperados da inferência de frequência “automática”. Por exemplo, a inferência de frequência “automática” em duas entradas com 14 dias de intervalo inferirá uma frequência de “14D”, mesmo que a frequência “real” possa ser semanal com 1 valor ausente. A união das entradas ausentes elimina essa ambigüidade.
Finalmente, mostramos um exemplo onde diferentes parâmetros de previsão são aplicados a diferentes grupos na tabela 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'
)
Observe o uso de um identificador de coluna como argumento parameters
. Isso permite que os usuários armazenem JSONs de parâmetros previamente determinados em uma tabela e os reutilizem em novos dados.
Limitações
As seguintes limitações se aplicam durante a versão preliminar:
- O procedimento de previsão padrão é um modelo linear por partes e de sazonalidade, semelhante a um profeta. Esse é o único procedimento de previsão suportado disponível.
- As mensagens de erro são entregues por meio do mecanismo UDTF do Python e contêm informações de rastreamento do Python. O final do rastreamento contém a mensagem de erro real.