Compartilhar via


Função ai_forecast

Aplica-se a: verificação marcada como sim 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 (veja group_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” em observed. A coluna referenciada por time_col deve ser um DATE ou um TIMESTAMP.
  • value_col é uma cadeia de caracteres ou uma matriz de strings que faz referência a colunas de valor em observed. As colunas referenciadas por esse argumento devem ser convertíveis para DOUBLE.
  • group_col (opcional) é uma cadeia de caracteres ou um matriz de cadeia de caracteres que representa as colunas do grupo em observed. 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 de prediction_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 e global_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 e weekly_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.