在 Jupyter Notebook 中以視覺化方式呈現 BigQuery 資料

BigQuery 是用於 PB 規模的分析資料倉儲,針對大量資料,也能以近乎即時的速度,執行 SQL 查詢。

資料視覺化工具可協助您理解 BigQuery 資料,以及利用互動方式分析資料。您可以使用視覺化工具來協助識別趨勢、加以回應,然後使用資料進行預測。在此教學課程中,您要在 Jupyter Notebook 中使用 BigQuery Python 用戶端程式庫與 Pandas,以視覺化方式呈現 BigQuery natality 範例資料表中的資料。

目標

在此教學課程中,您將執行下列作業:

  • 設定執行 Jupyter Notebook 的環境
  • 使用 BigQuery Python 用戶端程式庫與 Pandas 查詢 BigQuery 資料並以視覺化方式呈現資料

費用

BigQuery 是一種付費產品,當您存取 BigQuery 時,就會產生 BigQuery 使用費。BigQuery 查詢價格提供每個月前 1 TB 的用量免費。詳情請參閱 BigQuery 定價頁面。

事前準備

開始本教學課程之前,請先使用 Google Cloud Platform 主控台建立或選取專案。

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  3. 新專案會自動啟用 BigQuery。如要在現有的專案中啟用 BigQuery,請前往 啟用BigQuery API。

    啟用 API

  4. 如果您不想為專案提供信用卡或啟用計費功能,BigQuery 也提供沙箱機制。無論您的專案是否已啟用計費功能,本主題中所述的步驟都適用於您的專案。如果您想要啟用計費功能,請參閱這篇說明文章瞭解如何啟用。

設定本機 Jupyter 環境

在這個教學課程內容中,您會使用本機託管的 Jupyter Notebook。只要完成下列步驟,即可安裝 Jupyter、設定驗證,以及安裝所需的 Python 程式庫。

  1. 在終端機中執行下列指令,安裝最新版本的 BigQuery Python 用戶端程式庫,包括 Pandas 程式庫。使用 Pandas 的函式會用到 Pandas 程式庫。

    pip install --upgrade google-cloud-bigquery[pandas]
    
  2. 按照 Jupyter 說明文件中的安裝操作說明,安裝 Jupyter。

  3. 按照開始使用驗證功能頁面中的操作說明,設定應用程式預設憑證。您可以建立服務帳戶並設定環境變數,以設定驗證。

總覽:Jupyter Notebook

Notebook 提供一個可以編寫和執行程式碼的環境。Notebook 基本上是一種產出物,儲存為 .ipynb 檔案 — 可包含描述性文字內容、可執行的程式碼區塊,以及相關聯的結果 (以互動式 HTML 呈現)。在結構方面,Notebook 是一連串的儲存格。

儲存格是一種輸入文字區塊,此區塊經過系統評估後會產生結果。儲存格可分成兩種類型:

  • 程式碼儲存格 — 包含要評估的程式碼。因執行程式碼而產生的任何輸出或結果,皆會立即呈現在輸入程式碼下方。

  • Markdown 儲存格 — 包含 markdown 文字,此文字可轉換成 HTML 以產生標頭、清單和格式化文字。

下方的螢幕擷取畫面顯示 Markdown 儲存格,後接 Python 程式碼儲存格。請注意 Python 儲存格的輸出會立即顯示在程式碼下方。

Jupyter markdown 與程式碼儲存格

每個開啟的 Notebook 都與一個執行中的工作階段相關聯。在 IPython 中,這也稱之為核心。此工作階段會執行在 Notebook 內輸入的所有程式碼,並管理狀態 (變數及其值、函式及類別,以及您載入的所有現有 Python 模組)。

查詢及視覺化 BigQuery 資料

在這一節的教學課程中,您會建立 Cloud Datalab 筆記本,以用來查詢和視覺化 BigQuery 中的資料。您將使用 natality 範例資料表中的資料來建立視覺化輸出。此教學課程中的所有查詢均使用標準 SQL 語法。

使用 Jupyter Notebook 查詢及視覺化 BigQuery 資料:

  1. 如果您尚未啟動 Jupyter,請在終端機中執行下列指令:

    jupyter notebook
    
  2. Jupyter 現在應會在瀏覽器視窗中執行並開啟。在 Jupyter 視窗中,按一下 [New] (新增) 按鈕,並選取 [Python 2] 或 [Python 3],建立新的 Python Notebook。

    Jupyter 新 Python 3 Notebook

  3. 點選頁面頂端的 [Untitled] (未命名)

  4. 在「Rename notebook」(重新命名筆記本) 對話方塊中輸入新名稱 (例如 BigQuery tutorial),然後按一下 [Rename] (重新命名)

  5. BigQuery Python 用戶端程式庫提供了一個魔法指令,讓您使用最少的程式碼執行查詢。如要從用戶端程式庫載入此魔法指令,請將下列程式碼貼到筆記本中的第一個儲存格。

    %load_ext google.cloud.bigquery
  6. 按一下 [Run] (執行) 按鈕,或使用 SHIFT + ENTER 來執行指令。

  7. BigQuery 用戶端程式庫提供了一個魔法儲存格指令 %%bigquery,可用來執行 SQL 查詢並將結果傳回為 Pandas DataFrame。請將以下內容輸入到下一個儲存格中,以傳回每年出生總人數。

    %%bigquery
    SELECT
        source_year AS year,
        COUNT(is_male) AS birth_count
    FROM `bigquery-public-data.samples.natality`
    GROUP BY year
    ORDER BY year DESC
    LIMIT 15
  8. 按一下 [Run] (執行)

  9. 查詢結果會出現在程式碼儲存格下方。

    按年份排序的出生人數表格

  10. 在下一個儲存格區塊中,輸入下列指令以執行相同查詢,但這次將結果儲存至新的變數 total_births,此變數會做為 %%bigquery 的引數提供,然後便可將結果用於進一步的分析與視覺化。

    %%bigquery total_births
    SELECT
        source_year AS year,
        COUNT(is_male) AS birth_count
    FROM `bigquery-public-data.samples.natality`
    GROUP BY year
    ORDER BY year DESC
    LIMIT 15
  11. 按一下 [Run] (執行)

  12. 現在,您已將 Pandas DataFrame 儲存至變數 total_births,並已準備好可以繪圖了。為了對繪製查詢結果做好準備,請將下列內建魔法指令貼到下一個儲存格中以啟用 matplotlib,這是 Pandas 用於繪圖的程式庫。

    %matplotlib inline
  13. 按一下 [Run] (執行)

  14. 在下一個儲存格中,輸入下列程式碼,使用 Pandas DataFrame.plot() 方法來以視覺方式將查詢結果呈現為長條圖。請參閱 Pandas 說明文件,進一步瞭解如何使用 Pandas 視覺化資料。

    total_births.plot(kind='bar', x='year', y='birth_count');
  15. 按一下 [Run] (執行)

  16. 圖表會顯示在程式碼區塊下方。

    按年份排序的出生人數長條圖

  17. 接下來,將下列查詢貼入到下一個儲存格中,以擷取平日的出生人數。

    %%bigquery births_by_weekday
    SELECT
        wday,
        SUM(CASE WHEN is_male THEN 1 ELSE 0 END) AS male_births,
        SUM(CASE WHEN is_male THEN 0 ELSE 1 END) AS female_births
    FROM `bigquery-public-data.samples.natality`
    WHERE wday IS NOT NULL
    GROUP BY wday
    ORDER BY wday ASC

    因為 wday (平日) 欄位允許空值,所以查詢會排除 wday 是空值的記錄。

  18. 按一下 [Run] (執行)

  19. 在下一個儲存格中,輸入下列程式碼,將查詢結果在折線圖中以視覺方式呈現。

    births_by_weekday.plot(x='wday');
  20. 按一下 [Run] (執行)

  21. 圖表會顯示在程式碼區塊下方。請注意,星期日 (1) 和星期六 (7) 的出生人數大幅減少。

    平日的出生人數折線圖

  22. 按一下 [File] > [Save and Checkpoint] 或按一下工具列中的儲存圖示。建立檢查點可讓您將 Notebook 還原成之前的狀態。

Pandas DataFrames

魔法指令可以讓您使用最少的語法來與 BigQuery 互動。%%bigquery 會在幕後使用 BigQuery Python 用戶端程式庫執行特定查詢、將結果轉換為 Pandas Dataframe、選擇性地將結果儲存至變數,以及最終顯示結果。直接使用 BigQuery Python 用戶端程式庫,而非透過魔法指令使用,可讓您進一步掌控查詢,並進行更複雜的設定。程式庫與 Pandas 之間的整合可以讓您將宣告 SQL 與命令式程式 (Python) 的功能結合在一起,以執行想要的資料分析、視覺化作業及轉換工作。

使用 Pandas DataFrames 查詢和視覺化 BigQuery 資料

在這一節的教學課程中,您將使用 pandas DataFrames 在 BigQuery 中查詢資料並以視覺化方式呈現資料。您會使用 BigQuery Python 用戶端程式庫來查詢 BigQuery 資料,並透過 Pandas 程式庫,使用 DataFrames 來分析資料。

  1. 在下一個儲存格中輸入下列 Python 程式碼,以匯入 BigQuery Python 用戶端程式庫並初始化用戶端。BigQuery 用戶端可用來與 BigQuery API 收發訊息。

    from google.cloud import bigquery
    client = bigquery.Client()
  2. 按一下 [Run] (執行)

  3. 使用 Client.query() 方法來執行查詢。在下一個儲存格中,輸入下列程式碼來執行查詢,按照胎兒數來擷取多胞胎的年度計數 (2 為雙胞胎,3 為三胞胎,依此類推)。

    sql = """
    SELECT
        plurality,
        COUNT(1) AS count,
        year
    FROM
        `bigquery-public-data.samples.natality`
    WHERE
        NOT IS_NAN(plurality) AND plurality > 1
    GROUP BY
        plurality, year
    ORDER BY
        count DESC
    """
    df = client.query(sql).to_dataframe()
    df.head()
  4. 按一下 [Run] (執行)

  5. 如要在 DataFrame 中繪製查詢結果的圖表,請將下列程式碼插入到下一個儲存格中來透視資料,並建立一段時間的多胞胎計數圖表的堆疊長條圖。

    pivot_table = df.pivot(index='year', columns='plurality', values='count')
    pivot_table.plot(kind='bar', stacked=True, figsize=(15, 7));
  6. 按一下 [Run] (執行)

  7. 圖表會顯示在程式碼區塊下方。

    按年份排序的多胞胎出生數堆疊長條圖

  8. 在下一個儲存格中,輸入下列查詢,按懷孕週數擷取出生人數。

    sql = """
    SELECT
        gestation_weeks,
        COUNT(1) AS count
    FROM
        `bigquery-public-data.samples.natality`
    WHERE
        NOT IS_NAN(gestation_weeks) AND gestation_weeks <> 99
    GROUP BY
        gestation_weeks
    ORDER BY
        gestation_weeks
    """
    df = client.query(sql).to_dataframe()
  9. 按一下 [Run] (執行)

  10. 如要在 DataFrame 中繪製查詢結果的圖表,請將下列程式碼貼到下一個儲存格中。

    ax = df.plot(kind='bar', x='gestation_weeks', y='count', figsize=(15,7))
    ax.set_title('Count of Births by Gestation Weeks')
    ax.set_xlabel('Gestation Weeks')
    ax.set_ylabel('Count');
  11. 按一下 [Run] (執行)

  12. 長條圖會顯示在程式碼區塊下方。

    按懷孕週數排序的平均重量圖表

後續步驟

  • 進一步瞭解如何撰寫 BigQuery 查詢:有關如何執行查詢、建立使用者定義的函式 (UDF) 等更多資訊,請參閱 BigQuery 說明文件的查詢資料

  • 探索 BigQuery 語法:在 BigQuery 中,SQL 查詢的慣用方言是標準 SQL,詳情請參閱 SQL 參考資料。如需 BigQuery 的舊版 SQL 語法說明,請參閱查詢參考資料 (舊版 SQL)

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁