在 Jupyter 笔记本中直观呈现 BigQuery 数据


本教程介绍如何在 Vertex AI Workbench 上的托管式 Jupyter 笔记本实例中使用 Python 版 BigQuery 客户端库和 Pandas 来探索和直观呈现数据。数据可视化工具可帮助您以交互方式分析 BigQuery 数据,以确定趋势并提供基于您的数据的数据洞见。 本教程使用 Google 趋势 BigQuery 公共数据集中的数据。

目标

  • 使用 Vertex AI Workbench 创建代管式 Jupyter 笔记本实例。
  • 使用笔记本中的魔法命令查询 BigQuery 数据。
  • 使用 BigQuery Python 客户端库和 Pandas 查询并直观呈现 BigQuery 数据。

费用

BigQuery 是一款付费产品,因此对 BigQuery 的访问会产生 BigQuery 使用费。每月处理的前 1 TB 查询数据免费。如需了解详情,请参阅 BigQuery 价格页面。

Vertex AI Workbench 是一款付费产品,并且在使用 Vertex AI Workbench 实例时会产生计算、存储和管理费用。如需了解详情,请参阅 Vertex AI Workbench 价格页面。

准备工作

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

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery API.

    Enable the API

    对于新项目,系统会自动启用 BigQuery。

  4. 启用 Notebooks API。

    启用 Notebooks API

概览:Jupyter 笔记本

笔记本提供了编写和执行代码的环境。笔记本实质上是一种源工件,以 IPYNB 文件的形式进行保存。它可包含描述性文本内容、可执行代码块和以交互式 HTML 形式呈现的输出。

从结构上来说,笔记本是一系列的单元。 单元是一个输入文本块,系统会对其进行评估并生成结果。单元有三种类型:

  • 代码单元 - 包含要评估的代码。执行的代码的输出或结果根据执行的代码进行渲染。
  • Markdown 单元 - 包含 Markdown 文本,该文本可转换为 HTML 以生成标头、列表和带格式的文本
  • 原始单元 - 可用于将不同代码格式渲染为 HTML 或 LaTeX。

下图显示了一个 Markdown 单元,后跟一个 Python 代码单元,后跟输出:

Jupyter Markdown 单元和代码单元。

每个打开的笔记本都与某个正在运行的会话相关联(在 Python 中也称为内核)。此会话执行笔记本中的所有代码,并管理状态。状态包括变量及其值、函数和类,以及您加载的任何现有 Python 模块。

在 Google Cloud 中,您可以使用基于 Vertex AI Workbench 笔记本的环境来查询和探索数据、开发和训练模型,并将代码作为流水线来运行。在本教程中,您将在 Vertex AI Workbench 上创建代管式笔记本实例,然后在 JupyterLab 界面中探索 BigQuery 数据。

创建代管式笔记本实例

在本部分中,您将在 Google Cloud 上设置 JupyterLab 实例,以便创建代管式笔记本。

  1. 在 Google Cloud 控制台中,进入 Workbench 页面。

    进入 Workbench

  2. 点击 新建笔记本

  3. 笔记本名称字段中,输入实例的名称。

  4. 区域列表中,为您的实例选择一个区域。

  5. 权限部分中,选择一个选项以定义哪些用户可以访问代管式笔记本实例:

    • 服务账号:此选项会向有权访问与运行时关联的 Compute Engine 服务账号的所有用户授予访问权限。如需指定您自己的服务账号,请清除使用 Compute Engine 默认服务账号复选框,然后输入要使用的服务账号电子邮件地址。如需详细了解服务账号,请参阅服务账号类型
    • 仅限单个用户:此选项仅授予特定用户访问权限。在用户电子邮件字段中,输入将使用代管式笔记本实例的用户的用户账号电子邮件地址。
  6. 可选:要修改实例的高级设置,请点击高级设置。如需了解详情,请参阅使用高级设置创建实例

  7. 点击创建

    稍等几分钟,以便创建实例。Vertex AI Workbench 会自动启动该实例。当实例可供使用时,Vertex AI Workbench 会激活打开 JupyterLab 链接。

浏览 JupyterLab 中的 BigQuery 资源

在本部分中,您将打开 JupyterLab 并探索代管式笔记本实例中可用的 BigQuery 资源。

  1. 在您创建的代管式笔记本实例对应的行中,点击打开 JupyterLab

    如果出现提示,如果您同意这些条款,请点击身份验证。您的代管式笔记本实例会在新的浏览器标签页中打开 JupyterLab。

  2. 在 JupyterLab 导航菜单中,点击 BigQuery 笔记本中的 BigQuery

    BigQuery 窗格列出了可用的项目和数据集,您可以在其中执行以下任务:

    • 如需查看数据集的说明,请双击数据集名称。
    • 要显示数据集的表、视图和模型,请展开数据集。
    • 如需在 JupyterLab 中以标签页的形式打开摘要说明,请双击表、视图或模型。

    注意:在表的摘要说明上,点击预览标签页以预览表的数据。下图显示了在 bigquery-public-data 项目的 google_trends 数据集中找到的 international_top_terms的预览:

    国际热门术语列表。

使用 %%bigquery 魔法命令查询笔记本数据

在本部分中,您可以直接在笔记本单元中写入 SQL,并将 BigQuery 中的数据读取到 Python 笔记本。

使用一个或两个百分比字符(%%%)的魔法命令可让您使用最少的语法在笔记本中与 BigQuery 进行交互。Python 版 BigQuery 客户端库会自动安装在代管式笔记本实例中。在后台,%%bigquery 魔法命令使用 Python 版 BigQuery 客户端库运行给定查询,将结果转换为 Pandas DataFrame,以及视需要将结果保存到变量中,然后显示结果。

注意:从 google-cloud-bigquery Python 软件包 1.26.0 版开始,默认使用 BigQuery Storage API%%bigquery 魔法命令下载结果。

  1. 如需打开笔记本文件,请选择文件 > 新建 > 笔记本

  2. 选择内核对话框中,选择 Python(本地),然后点击选择

    系统会打开您的新 IPYNB 文件。

  3. 如需获取 international_top_terms 数据集中国家/地区的区域数,请输入以下语句:

    %%bigquery
    SELECT
      country_code,
      country_name,
      COUNT(DISTINCT region_code) AS num_regions
    FROM
      `bigquery-public-data.google_trends.international_top_terms`
    WHERE
      refresh_date = DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
    GROUP BY
      country_code,
      country_name
    ORDER BY
      num_regions DESC;
    
  4. 点击  运行单元

    输出类似于以下内容:

    Query complete after 0.07s: 100%|██████████| 4/4 [00:00<00:00, 1440.60query/s]
    Downloading: 100%|██████████| 41/41 [00:02<00:00, 20.21rows/s]
    country_code      country_name    num_regions
    0   TR  Turkey         81
    1   TH  Thailand       77
    2   VN  Vietnam        63
    3   JP  Japan          47
    4   RO  Romania        42
    5   NG  Nigeria        37
    6   IN  India          36
    7   ID  Indonesia      34
    8   CO  Colombia       33
    9   MX  Mexico         32
    10  BR  Brazil         27
    11  EG  Egypt          27
    12  UA  Ukraine        27
    13  CH  Switzerland    26
    14  AR  Argentina      24
    15  FR  France         22
    16  SE  Sweden         21
    17  HU  Hungary        20
    18  IT  Italy          20
    19  PT  Portugal       20
    20  NO  Norway         19
    21  FI  Finland        18
    22  NZ  New Zealand    17
    23  PH  Philippines    17
    ...
    
  5. 在下一个单元(在上一个单元的输出下方)中,输入以下命令以运行相同查询,但这次会将结果保存到名为 regions_by_country 的新 Pandas DataFrame 中。您通过在 %%bigquery 魔法命令中使用参数来提供该名称。

    %%bigquery regions_by_country
    SELECT
      country_code,
      country_name,
      COUNT(DISTINCT region_code) AS num_regions
    FROM
      `bigquery-public-data.google_trends.international_top_terms`
    WHERE
      refresh_date = DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
    GROUP BY
      country_code, country_name
    ORDER BY
      num_regions DESC;
    

    注意:如需详细了解 %%bigquery 命令的可用参数,请参阅客户端库魔法命令文档

  6. 点击  运行单元

  7. 在下一个单元中,输入以下命令以查看您刚刚读取的查询结果的前几行:

    regions_by_country.head()
    
  8. 点击  运行单元

    Pandas DataFrame regions_by_country 已准备好绘制图表。

直接使用 BigQuery 客户端库查询笔记本中的数据

在本部分中,您将使用 Python 版 BigQuery 客户端库直接读取数据到 Python 笔记本中。

该客户端库可让您更好地控制查询,并可让您使用更复杂的查询和作业配置。借助该库与 Pandas 的集成,您可以结合声明性 SQL 与命令式代码 (Python) 的强大功能,来分析、直观呈现和转换数据。

注意:有许多 Python 数据分析、数据整理和可视化库(例如 numpypandasmatplotlib 等)可供您使用。其中一些库是以 DataFrame 对象为基础而构建的。

  1. 在下一个单元中,输入以下 Python 代码以导入 Python 版 BigQuery 客户端库并初始化客户端:

    from google.cloud import bigquery
    
    client = bigquery.Client()
    

    BigQuery 客户端用于通过 BigQuery API 收发消息。

  2. 点击  运行单元

  3. 在下一个单元中,输入以下代码以检索美国 top_terms 在某个时间段内以某个天数为时间单位而重叠的每日热门字词的百分比。此处的思路是查看每天的热门字词,并查看它们与前一天、前 2 天、前 3 天等时间单位(大概一个月范围内所有日期对)中热门字词的重叠百分比。

    sql = """
    WITH
      TopTermsByDate AS (
        SELECT DISTINCT refresh_date AS date, term
        FROM `bigquery-public-data.google_trends.top_terms`
      ),
      DistinctDates AS (
        SELECT DISTINCT date
        FROM TopTermsByDate
      )
    SELECT
      DATE_DIFF(Dates2.date, Date1Terms.date, DAY)
        AS days_apart,
      COUNT(DISTINCT (Dates2.date || Date1Terms.date))
        AS num_date_pairs,
      COUNT(Date1Terms.term) AS num_date1_terms,
      SUM(IF(Date2Terms.term IS NOT NULL, 1, 0))
        AS overlap_terms,
      SAFE_DIVIDE(
        SUM(IF(Date2Terms.term IS NOT NULL, 1, 0)),
        COUNT(Date1Terms.term)
        ) AS pct_overlap_terms
    FROM
      TopTermsByDate AS Date1Terms
    CROSS JOIN
      DistinctDates AS Dates2
    LEFT JOIN
      TopTermsByDate AS Date2Terms
      ON
        Dates2.date = Date2Terms.date
        AND Date1Terms.term = Date2Terms.term
    WHERE
      Date1Terms.date <= Dates2.date
    GROUP BY
      days_apart
    
    ORDER BY
      days_apart;
    """
    pct_overlap_terms_by_days_apart = client.query(sql).to_dataframe()
    
    pct_overlap_terms_by_days_apart.head()
    

    正在使用的 SQL 被封装在 Python 字符串中,然后传递给 query() 方法以运行查询。to_dataframe 方法等待查询完成,并使用 BigQuery Storage API 将结果下载到 Pandas DataFrame。

  4. 点击  运行单元

    前几行查询结果会显示在代码单元下方。

       days_apart   num_date_pairs  num_date1_terms overlap_terms   pct_overlap_terms
     0          0             32               800            800            1.000000
     1          1             31               775            203            0.261935
     2          2             30               750             73            0.097333
     3          3             29               725             31            0.042759
     4          4             28               700             23            0.032857
    

如需详细了解如何使用 BigQuery 客户端库,请参阅使用客户端库快速入门。

直观呈现 BigQuery 数据

在本部分中,您将使用图表功能直观呈现之前在 Jupyter 笔记本中运行的查询的结果。

  1. 在下一个单元中输入以下代码,以便使用 Pandas DataFrame.plot() 方法创建条形图,用于直观呈现按国家/地区返回区域数的查询结果:

    regions_by_country.plot(kind="bar", x="country_name", y="num_regions", figsize=(15, 10))
    
  2. 点击  运行单元

    图表类似于以下内容:

    国际热门字词(按国家/地区排列)结果

  3. 在下一个单元中输入以下代码,以便使用 pandas DataFrame.plot() 方法创建散点图,以直观呈现热门搜索字词在以固定天数为单位的时间段中重叠百分比的查询结果。

    pct_overlap_terms_by_days_apart.plot(
      kind="scatter",
      x="days_apart",
      y="pct_overlap_terms",
      s=len(pct_overlap_terms_by_days_apart["num_date_pairs"]) * 20,
      figsize=(15, 10)
      )
    
  4. 点击  运行单元

    图表类似于以下内容。每个点的大小反映了数据中以较多天数为时间单位的时间段中日期对的数量。例如,以 1 天为时间单位的时间段中的日期对数量多于以以 30 天为时间单位的时间段中的日期对数量,系统会提供更多句对,因为在一个月的时间中每天提供热门搜索字词。

    国际热门字词(以天数为时间单位排列)图表。

如需详细了解数据可视化,请参阅 Pandas 文档

使用 %bigquery_stats 魔法命令获取所有表列的统计信息和可视化内容

在本部分中,您将使用笔记本快捷方式获取 BigQuery 表所有字段的摘要统计信息和可视化内容。

BigQuery 客户端库提供了一个魔法命令 %bigquery_stats,您可以使用特定的表名称调用该命令,以提供表概览和表每一列的详细统计信息。

  1. 在下一个单元中,输入以下代码以在 US top_terms上运行该分析:

    %bigquery_stats bigquery-public-data.google_trends.top_terms
    
  2. 点击  运行单元

    运行一段时间后,系统会显示一个图片,其中包含 top_terms 表的 7 个变量中每个变量的各种统计信息。下图显示了一些示例输出的部分内容:

    国际热门字词统计信息概览。

查看您的查询历史记录并重复使用查询

如需在 JupyterLab 的标签页中查看查询历史记录,请执行以下步骤:

  1. 在 JupyterLab 导航菜单中,点击 BigQuery 笔记本中的 BigQuery 以打开 BigQuery 窗格。

  2. BigQuery 窗格中,向下滚动,然后点击BigQuery

    在左侧导航栏底部突出显示的查询历史记录

    系统会在新标签页中打开您的查询列表,您可以在其中执行如下任务:

    • 如需查看查询的详细信息,例如其作业 ID、查询运行时间以及时长,请点击该查询。
    • 如需修改查询,请再次运行查询,或将其复制到笔记本中以备将来使用,然后点击在编辑器中打开查询

保存并下载您的笔记本

在本部分中,您将保存笔记本,并且如果将来要在清理本教程中使用的资源后使用该笔记本,还可以下载下来。

  1. 选择文件 > 保存笔记本
  2. 选择文件 > 下载,将笔记本的本地副本作为 IPYNB 文件下载到计算机上。

清理

为了避免产生费用,最简单的方法是删除您为本教程创建的 Google Cloud 项目。

  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.

后续步骤