1. 其他教程
  2. 从 BigQuery 数据创建仪表板

使用 BigQuery 数据创建实时仪表板

Google BigQuery 是一项用于处理超大数据集的云服务。它是一个无服务器且高度可扩展的数据仓库解决方案,使用户能够 使用类似 SQL 的查询 来分析数据。

在本教程中,我们将向您展示如何使用 Python 查询 BigQuery 数据集,并使用 gradio 在实时更新的仪表板中显示数据。仪表板将如下所示

在本指南中,我们将介绍以下步骤

  1. 设置您的 BigQuery 凭据
  2. 使用 BigQuery 客户端
  3. 构建实时仪表板(仅需7 行 Python 代码

我们将使用 纽约时报的 COVID 数据集,该数据集在 BigQuery 上可作为公共数据集使用。该数据集名为 covid19_nyt.us_counties,包含有关美国各县 COVID 确诊病例和死亡人数的最新信息。

先决条件:本指南使用 Gradio Blocks,因此请确保您熟悉 Blocks 类。

设置您的 BigQuery 凭据

要将 Gradio 与 BigQuery 结合使用,您需要获取 BigQuery 凭据并将其与 BigQuery Python 客户端一起使用。如果您已经拥有 BigQuery 凭据(以 .json 文件形式),则可以跳过此部分。如果没有,您可以在几分钟内免费完成。

  1. 首先,登录您的 Google Cloud 帐户并转到 Google Cloud Console(https://console.cloud.google.com/

  2. 在 Cloud Console 中,点击左上角的汉堡菜单,然后从菜单中选择“API 和服务”。如果您没有现有项目,则需要创建一个。

  3. 然后,点击“+ 已启用 API 和服务”按钮,该按钮允许您为项目启用特定服务。搜索“BigQuery API”,点击它,然后点击“启用”按钮。如果您看到“管理”按钮,则表示 BigQuery 已启用,您可以继续操作。

  4. 在“API 和服务”菜单中,点击“凭据”选项卡,然后点击“创建凭据”按钮。

  5. 在“创建凭据”对话框中,选择“服务帐户密钥”作为要创建的凭据类型,并为其命名。还要通过授予服务帐户角色(例如“BigQuery 用户”以允许您运行查询)来授予其权限。

  6. 选择服务帐户后,选择“JSON”密钥类型,然后点击“创建”按钮。这将下载包含您的凭据的 JSON 密钥文件到您的计算机。它看起来会像这样

{
	"type": "service_account",
	"project_id": "your project",
	"private_key_id": "your private key id",
	"private_key": "private key",
	"client_email": "email",
	"client_id": "client id",
	"auth_uri": "https://#/o/oauth2/auth",
	"token_uri": "https://#/o/oauth2/token",
	"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
	"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/email_id"
}

使用 BigQuery 客户端

获取凭据后,您需要使用 BigQuery Python 客户端通过您的凭据进行身份验证。为此,您需要通过在终端中运行以下命令来安装 BigQuery Python 客户端

pip install google-cloud-bigquery[pandas]

您会注意到我们安装了 pandas 插件,这有助于将 BigQuery 数据集处理为 pandas DataFrame。安装客户端后,您可以使用以下代码通过您的凭据进行身份验证

from google.cloud import bigquery

client = bigquery.Client.from_service_account_json("path/to/key.json")

通过身份验证的凭据,您现在可以使用 BigQuery Python 客户端与您的 BigQuery 数据集进行交互。

这是一个查询 BigQuery 中 covid19_nyt.us_counties 数据集以显示当前日期当日确诊病例最多的 20 个县的函数的示例

import numpy as np

QUERY = (
    'SELECT * FROM `bigquery-public-data.covid19_nyt.us_counties` '
    'ORDER BY date DESC,confirmed_cases DESC '
    'LIMIT 20')

def run_query():
    query_job = client.query(QUERY)
    query_result = query_job.result()
    df = query_result.to_dataframe()
    # Select a subset of columns
    df = df[["confirmed_cases", "deaths", "county", "state_name"]]
    # Convert numeric columns to standard numpy types
    df = df.astype({"deaths": np.int64, "confirmed_cases": np.int64})
    return df

构建实时仪表板

一旦您有了查询数据的函数,就可以使用 Gradio 库中的 gr.DataFrame 组件以表格形式显示结果。这是检查数据并确保其已正确查询的有用方法。

以下是如何使用 gr.DataFrame 组件显示结果的示例。通过将 run_query 函数传递给 gr.DataFrame,我们指示 Gradio 在页面加载时运行该函数并显示结果。此外,您还可以传入关键字 every 来告诉仪表板每小时(60*60 秒)刷新一次。

import gradio as gr

with gr.Blocks() as demo:
    gr.DataFrame(run_query, every=gr.Timer(60*60))

demo.launch()

也许您想为我们的仪表板添加可视化。您可以使用 gr.ScatterPlot() 组件将数据可视化为散点图。这使您可以查看数据集中不同变量(如病例数和死亡人数)之间的关系,并有助于探索数据和获得见解。同样,我们可以通过传递 every 参数来实时完成此操作。

这是一个完整的示例,展示了如何使用 gr.ScatterPlot 进行可视化,以及如何使用 gr.DataFrame 显示数据

import gradio as gr

with gr.Blocks() as demo:
    gr.Markdown("# 💉 Covid Dashboard (Updated Hourly)")
    with gr.Row():
        gr.DataFrame(run_query, every=gr.Timer(60*60))
        gr.ScatterPlot(run_query, every=gr.Timer(60*60), x="confirmed_cases",
                        y="deaths", tooltip="county", width=500, height=500)

demo.queue().launch()  # Run the demo with queuing enabled
gradio