Usar feriados personalizados em um modelo de previsão de série temporal ARIMA_PLUS

Este tutorial mostra como fazer as seguintes tarefas:

  • Criar um modelo de previsão de série temporal ARIMA_PLUS que use apenas feriados integrados.
  • Criar um modelo de previsão de série temporal ARIMA_PLUS que use feriados personalizados, além de feriados integrados.
  • Confira os resultados previstos desses modelos.
  • Inspecione um modelo para conferir quais feriados ele modela.
  • Avaliar os efeitos dos feriados personalizados nos resultados previstos.
  • Compare o desempenho do modelo que usa apenas feriados integrados com aqueles que usam feriados personalizados, além dos integrados.

Neste tutorial, usamos as tabelas públicas bigquery-public-data.wikipedia.pageviews_*.

Permissões necessárias

  • Para criar o conjunto de dados, é preciso ter a permissão de IAM bigquery.datasets.create.

  • Para criar o modelo, você precisa das seguintes permissões:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Para executar a inferência, você precisa das seguintes permissões:

    • bigquery.models.getData
    • bigquery.jobs.create

Para mais informações sobre os papéis e as permissões do IAM no BigQuery, consulte Introdução ao IAM.

Custos

Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:

  • BigQuery: You incur costs for the data you process in BigQuery.

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para um teste sem custo financeiro.

Para saber mais, acesse a página Preços do BigQuery.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. crie um conjunto de dados

    Crie um conjunto de dados do BigQuery para armazenar seu modelo de ML.

    Console

    1. No console do Google Cloud , acesse a página BigQuery.

      Acessar a página do BigQuery

    2. No painel Explorer, clique no nome do seu projeto.

    3. Clique em Conferir ações > Criar conjunto de dados.

    4. Na página Criar conjunto de dados, faça o seguinte:

      • Para o código do conjunto de dados, insira bqml_tutorial.

      • Em Tipo de local, selecione Multirregião e EUA (várias regiões nos Estados Unidos).

      • Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.

    bq

    Para criar um novo conjunto de dados, utilize o comando bq mk com a sinalização --location. Para obter uma lista completa de parâmetros, consulte a referência comando bq mk --dataset.

    1. Crie um conjunto de dados chamado bqml_tutorial com o local dos dados definido como US e uma descrição de BigQuery ML tutorial dataset:

      bq --location=US mk -d \
       --description "BigQuery ML tutorial dataset." \
       bqml_tutorial

      Em vez de usar a flag --dataset, o comando usa o atalho -d. Se você omitir -d e --dataset, o comando vai criar um conjunto de dados por padrão.

    2. Confirme se o conjunto de dados foi criado:

      bq ls

    API

    Chame o método datasets.insert com um recurso de conjunto de dados definido.

    {
      "datasetReference": {
         "datasetId": "bqml_tutorial"
      }
    }

    BigQuery DataFrames

    Antes de testar esta amostra, siga as instruções de configuração dos BigQuery DataFrames no Guia de início rápido do BigQuery: como usar os BigQuery DataFrames. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

    Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, consulte Configurar o ADC para um ambiente de desenvolvimento local.

    import google.cloud.bigquery
    
    bqclient = google.cloud.bigquery.Client()
    bqclient.create_dataset("bqml_tutorial", exists_ok=True)

    Preparar os dados da série temporal

    Agregar os dados de visualização de páginas da Wikipédia para a página do Google I/O em uma única tabela, agrupada por dia:

    1. Acessar a página do BigQuery.

      Acessar o BigQuery

    2. No painel Editor SQL, execute a seguinte instrução SQL:

      CREATE OR REPLACE TABLE `bqml_tutorial.googleio_page_views`
      AS
      SELECT
        DATETIME_TRUNC(datehour, DAY) AS date,
        SUM(views) AS views
      FROM
        `bigquery-public-data.wikipedia.pageviews_*`
      WHERE
        datehour >= '2017-01-01'
        AND datehour < '2023-01-01'
        AND title = 'Google_I/O'
      GROUP BY
        DATETIME_TRUNC(datehour, DAY)

    Crie um modelo de previsão de série temporal que usa feriados integrados

    Crie um modelo que preveja visualizações de página diárias da página "Google I/O" da Wikipédia, com base em dados de visualização de página antes de 2022 e considerando os feriados integrados:

    1. Acessar a página do BigQuery.

      Acessar o BigQuery

    2. No painel Editor SQL, execute a seguinte instrução SQL:

      CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio`
        OPTIONS (
          model_type = 'ARIMA_PLUS',
          holiday_region = 'US',
          time_series_timestamp_col = 'date',
          time_series_data_col = 'views',
          data_frequency = 'DAILY',
          horizon = 365)
      AS
      SELECT
        *
      FROM
        `bqml_tutorial.googleio_page_views`
      WHERE
        date < '2022-01-01';

    Visualize os resultados previstos

    Depois de criar o modelo usando feriados integrados, mescle os dados originais da tabela bqml_tutorial.googleio_page_views com o valor previsto da função ML.EXPLAIN_FORECAST. e visualize-os usando o Looker Studio:

    1. Acessar a página do BigQuery.

      Acessar o BigQuery

    2. No painel Editor SQL, execute a seguinte instrução SQL:

      SELECT
        original.date,
        original.views AS original_views,
        explain_forecast.time_series_adjusted_data
          AS adjusted_views_without_custom_holiday,
      FROM
        `bqml_tutorial.googleio_page_views` original
      INNER JOIN
        (
          SELECT
            *
          FROM
            ML.EXPLAIN_FORECAST(
              MODEL `bqml_tutorial.forecast_googleio`,
              STRUCT(365 AS horizon))
        ) explain_forecast
        ON
          TIMESTAMP(original.date)
          = explain_forecast.time_series_timestamp
      ORDER BY
        original.date;
    3. No painel Resultados da consulta, clique em Explorar dados e depois em Explorar com o Looker Studio. O Looker Studio é aberto em uma nova guia.

    4. Na guia do Looker Studio, clique em Adicionar um gráfico e no gráfico de série temporal:

      Adicionar um gráfico de séries temporais

      Insira o gráfico no relatório.

    5. Na guia Configuração do painel Gráfico, clique em Adicionar métrica e selecione adjusted_views_without_custom_holiday:

      Inclua outra métrica.

      O gráfico será assim:

      Gráfico de série temporal dos resultados da previsão usando feriados integrados

      O modelo de previsão captura a tendência geral muito bem. No entanto, ela não captura o aumento do tráfego relacionado aos eventos anteriores do Google I/O e não gera uma previsão precisa para

      1. As próximas seções mostram como lidar com algumas dessas limitações.

    Criar um modelo de previsão de série temporal que usa feriados personalizados e integrados

    Conforme exibido no histórico do Google I/O, o evento do Google I/O ocorreu em datas diferentes entre 2017 e 2022. Para considerar essa variação, crie um modelo que preveja visualizações de página para a página "Google_I/O" da Wikipédia até 2022, com base nos dados de visualização de página anteriores a 2022 e usando feriados personalizados para representar para o evento Google I/O todos os anos. Nesse modelo, ajuste também a janela de efeito de feriado para cobrir três dias perto da data do evento, capturando melhor algum tráfego de página em potencial antes e depois do evento.

    1. Acessar a página do BigQuery.

      Acessar o BigQuery

    2. No painel Editor SQL, execute a seguinte instrução SQL:

      CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`
        OPTIONS (
          model_type = 'ARIMA_PLUS',
          holiday_region = 'US',
          time_series_timestamp_col = 'date',
          time_series_data_col = 'views',
          data_frequency = 'DAILY',
          horizon = 365)
      AS (
        training_data AS (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date < '2022-01-01'
          ),
        custom_holiday AS (
            SELECT
              'US' AS region,
              'GoogleIO' AS holiday_name,
              primary_date,
              1 AS preholiday_days,
              2 AS postholiday_days
            FROM
              UNNEST(
                [
                  DATE('2017-05-17'),
                  DATE('2018-05-08'),
                  DATE('2019-05-07'),
                  -- cancelled in 2020 due to pandemic
                  DATE('2021-05-18'),
                  DATE('2022-05-11')])
                AS primary_date
          )
      );

    Visualize os resultados previstos

    Depois de criar o modelo usando feriados personalizados, mescle os dados originais da tabela bqml_tutorial.googleio_page_views com o valor previsto da função ML.EXPLAIN_FORECAST e visualize-o usando o Looker Studio:

    1. Acessar a página do BigQuery.

      Acessar o BigQuery

    2. No painel Editor SQL, execute a seguinte instrução SQL:

      SELECT
        original.date,
        original.views AS original_views,
        explain_forecast.time_series_adjusted_data
          AS adjusted_views_with_custom_holiday,
      FROM
        `bqml_tutorial.googleio_page_views` original
      INNER JOIN
        (
          SELECT
            *
          FROM
            ML.EXPLAIN_FORECAST(
              MODEL
                `bqml_tutorial.forecast_googleio_with_custom_holiday`,
              STRUCT(365 AS horizon))
        ) explain_forecast
        ON
          TIMESTAMP(original.date)
          = explain_forecast.time_series_timestamp
      ORDER BY
        original.date;
    3. No painel Resultados da consulta, clique em Explorar dados e depois em Explorar com o Looker Studio. O Looker Studio é aberto em uma nova guia.

    4. Na guia do Looker Studio, clique em Adicionar um gráfico, no gráfico de série temporal e insira o gráfico no relatório.

    5. Na guia Configuração do painel Gráfico, clique em Adicionar métrica e selecione adjusted_views_with_custom_holiday.

      O gráfico será assim:

      Gráfico de série temporal dos resultados da previsão usando feriados personalizados

      Conforme exibido, os feriados personalizados otimizaram o desempenho do modelo de previsão. Agora, é possível capturar com eficácia o aumento de visualizações de página causado pelo Google I/O.

    Inspecionar informações de feriados

    Inspecione a lista de feriados que foram considerados durante a modelagem usando a função ML.HOLIDAY_INFO:

    1. Acessar a página do BigQuery.

      Acessar o BigQuery

    2. No painel Editor SQL, execute a seguinte instrução SQL:

      SELECT *
      FROM
        ML.HOLIDAY_INFO(
          MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`);

      Os resultados mostram o Google I/O e os feriados integrados na lista de feriados:

      Resultados da função ML.HOLIDAY_INFO.

    Avaliar os efeitos dos feriados personalizados

    Avaliar os efeitos dos feriados personalizados nos resultados previstos usando a função ML.EXPLAIN_FORECAST:

    1. Acessar a página do BigQuery.

      Acessar o BigQuery

    2. No painel Editor SQL, execute a seguinte instrução SQL:

      SELECT
        time_series_timestamp,
        holiday_effect_GoogleIO,
        holiday_effect_US_Juneteenth,
        holiday_effect_Christmas,
        holiday_effect_NewYear
      FROM
        ML.EXPLAIN_FORECAST(
          model
            `bqml_tutorial.forecast_googleio_with_custom_holiday`,
          STRUCT(365 AS horizon))
      WHERE holiday_effect != 0;

      Os resultados mostram que o Google I/O contribui com uma grande quantidade de efeito do feriado para os resultados previstos:

      Resultados da função ML.EXPLAIN_FORECAST.

    Comparar o desempenho do modelo

    Use a função ML.EVALUATE para comparar o desempenho do primeiro modelo criado sem feriados personalizados e do segundo modelo criado com feriados personalizados. Para conferir o desempenho do segundo modelo em relação à previsão de um feriado personalizado, defina o período como a semana do Google I/O em 2022:

    1. Acessar a página do BigQuery.

      Acessar o BigQuery

    2. No painel Editor SQL, execute a seguinte instrução SQL:

      SELECT
        "original" AS model_type,
        *
      FROM
        ml.evaluate(
          MODEL `bqml_tutorial.forecast_googleio`,
          (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date >= '2022-05-08'
              AND date < '2022-05-12'
          ),
          STRUCT(
            365 AS horizon,
            TRUE AS perform_aggregation))
      UNION ALL
      SELECT
        "with_custom_holiday" AS model_type,
        *
      FROM
        ml.evaluate(
          MODEL
            `bqml_tutorial.forecast_googleio_with_custom_holiday`,
          (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date >= '2022-05-08'
              AND date < '2022-05-12'
          ),
          STRUCT(
            365 AS horizon,
            TRUE AS perform_aggregation));

      Os resultados mostram que o segundo modelo oferece uma melhoria significativa de desempenho:

      Resultados da função ML.EXPLAIN_FORECAST.

    Limpar

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.