Облако — это новая норма, и я расскажу, как использовать Google Cloud для исследования, обработки и анализа данных.

Эта статья является продолжением Части 1 Здесь и Части 2 Здесь. Эта часть будет посвящена использованию Google BigQuery. Мы рассмотрим использование веб-консоли и интерфейса командной строки экземпляра для навигации по BigQuery.

Если у вас возникнут какие-либо проблемы с разрешениями, вам необходимо проверить свое разрешение IAM/API.

Использование веб-консоли

В веб-консоли мы увидим домашнюю страницу. Обратите внимание, что в проекте нет набора данных/базы данных. Нажмите на кнопку «Добавить».

Нажмите «Облачное хранилище Google».

Загрузите файл из облачного хранилища Google и создайте новый набор данных.

Я использовал приведенные ниже настройки для своего набора данных, затем нажмите «Создать набор данных».

Введите имя таблицы по вашему выбору и не забудьте отметить галочкой автоматическое определение схемы. Вы также можете сделать это вручную, если хотите. Ваша последняя страница должна быть похожа на фотографию ниже. Затем нажмите «Создать таблицу».

После создания таблицы обновите страницу, и вы сможете увидеть созданную таблицу полетов.

Использование экземпляра CLI (интерфейс командной строки)

Теперь мы попробуем разместить таблицу с помощью CLI, а не вручную через веб-консоль.

Чтобы составить таблицу, нам понадобятся данные и схема данных. Вместо того, чтобы вручную вводить схему данных в формате JSON, для этого конкретного примера мы можем загрузить схему из ранее загруженной таблицы, используя код ниже.

bq show --schema --format=prettyjson flights202301.flightstable > schemafordata.json

Файл JSON должен выглядеть, как показано ниже.

Затем мы создадим набор данных с помощью интерфейса командной строки экземпляра, используя приведенный ниже код.

bq mk flights202301cli

Для наглядности попробуем загрузить данные в таблицу без схемы, но это не сработает.

bq load flights202301cli.flightstable gs://lszbucket1/data_202301.csv

Мы используем приведенный ниже код, чтобы запустить его со схемой.

bq load --source_format=CSV flights202301cli.flightstable gs://lszbucket1/data_202301.csv ~/flights/schemafordata.json

Когда мы пытаемся загрузить схему, это должно сработать, но в данном случае это не удалось, потому что мы забыли удалить первую строку заголовков в файле csv. Таким образом, мы изменили код, чтобы пропустить первую строку CSV. Используйте приведенный ниже код:

bq load --source_format=CSV --skip_leading_rows=1 flights202301cli.flightstable gs://lszbucket1/data_202301.csv ~/flights/schemafordata.json

Мы можем проверить таблицу, используя приведенный ниже код.

bq show flights202301cli.flightstable

Мы также должны иметь возможность видеть то, что мы создали из CLI, на веб-консоли.

Теперь, когда у нас есть набор данных в BigQuery, давайте создадим материализованное представление того, что мы хотим, используя приведенный ниже код. Мы можем использовать этот код в BigQuery напрямую или через CLI.

Я буду использовать приведенный ниже код для создания материализованного представления:

CREATE OR REPLACE MATERIALIZED VIEW
  `flights202301.flightstable_view` AS
SELECT
  FlightDate AS FL_DATE,
  Operating_Airline_ AS UNIQUE_CARRIER,
  OriginAirportSeqID AS ORIGIN_AIRPORT_SEQ_ID,
  Origin AS ORIGIN,
  DestAirportSeqID AS DEST_AIRPORT_SEQ_ID,
  Dest AS DEST,
  CRSDepTime AS CRS_DEP_TIME,
  DepTime AS DEP_TIME,
  CAST(DepDelay AS FLOAT64) AS DEP_DELAY,
  CAST(TaxiOut AS FLOAT64) AS TAXI_OUT,
  WheelsOff AS WHEELS_OFF,
  WheelsOn AS WHEELS_ON,
  CAST(TaxiIn AS FLOAT64) AS TAXI_IN,
  CRSArrTime AS CRS_ARR_TIME,
  ArrTime AS ARR_TIME,
  CAST(ArrDelay AS FLOAT64) AS ARR_DELAY,
IF
  (Cancelled = 1.00, TRUE, FALSE) AS CANCELLED,
IF
  (Diverted = 1.00, TRUE, FALSE) AS DIVERTED,
  DISTANCE
FROM
  `secure-brook-395300.flights202301.flightstable`;

При использовании CLI не забудьте заменить Flight202301 на Flight202301cli или имя набора данных.

Можно наблюдать, что было создано новое представление.

Мы также можем сделать то же самое с помощью CLI. Сначала создайте файл sql, используя nano. Файл должен содержать приведенный ниже сценарий (аналогичный приведенному выше).

Затем запустите приведенный ниже код:

bq query --use_legacy_sql=false --project_id=secure-brook-395300 < createview.sql

После обновления веб-консоли мы увидим новое представление в наборе данных cli.

Чтобы выполнить предварительную проверку данных, мы можем попытаться получить 5 основных пунктов отправления с наибольшим количеством рейсов, используя приведенный ниже код sql.

SELECT
  origin,
  COUNT(*) AS num_flights
FROM
  `flights202301.flightstable_view`
GROUP BY
  origin
ORDER BY
  num_flights DESC
LIMIT
  5;

Результаты веб-консоли показаны ниже.

Мы можем сохранить приведенный выше код в top5origin.sql.

Мы можем использовать CLI с приведенным ниже кодом, чтобы получить тот же результат, что и в веб-консоли.

bq query --use_legacy_sql=false --project_id=secure-brook-395300 < top5origin.sql

Поиск оптимального порога (веб-консоль)

Далее мы будем использовать SQL, чтобы найти оптимальный порог из нескольких возможных порогов около 15 минут.

Мы введем приведенный ниже код в файл, известный какOptimthreshold.sql.

WITH
  contingency_table AS (
  SELECT
    THRESH,
    COUNTIF(dep_delay < THRESH
      AND arr_delay < 15) AS true_positives,
    COUNTIF(dep_delay < THRESH
      AND arr_delay >= 15) AS false_positives,
    COUNTIF(dep_delay >= THRESH
      AND arr_delay < 15) AS false_negatives,
    COUNTIF(dep_delay >= THRESH
      AND arr_delay >= 15) AS true_negatives,
    COUNT(*) AS total
  FROM
    `secure-brook-395300.flights202301.flightstable_view`,
    UNNEST([5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]) AS THRESH
  WHERE
    arr_delay IS NOT NULL
    AND dep_delay IS NOT NULL
  GROUP BY
    THRESH )
SELECT
  ROUND((true_positives + true_negatives)/total, 2) AS accuracy,
  ROUND(false_positives/(true_positives+false_positives), 2) AS fpr,
  ROUND(false_negatives/(false_negatives+true_negatives), 2) AS fnr,
  *
FROM
  contingency_table

Мы ищем уровень ложноотрицательных результатов (FNR) менее 0,20.

Судя по выходным данным, показанным ниже, 15 минут — это порог, при котором FNR меньше. Судя по выходным данным, показанным ниже, 15 минут — это порог, при котором FNR меньше 0,20, чем 0,20.

Поиск оптимального порога (CLI)

Мы можем сделать то же самое и из CLI. Мы можем сохранить приведенный выше код вOptimthreshold.sql.

Мы можем использовать CLI с приведенным ниже кодом, чтобы получить тот же результат, что и в веб-консоли.

bq query --use_legacy_sql=false --project_id=secure-brook-395300 < optimalthreshold.sql

Из BigQuery мы можем либо перейти к VertexAI для более глубокого машинного обучения, либо использовать, если анализа/моделирования из BigQuery достаточно, мы можем использовать LookerStudio для создания визуализаций.