Google BigQuery 是一个基于云的服务,用于处理非常大的数据集。它是一个无服务器且高度可扩展的数据仓库解决方案,使用户能够使用类 SQL 查询分析数据。
在本教程中,我们将向您展示如何在 Python 中查询 BigQuery 数据集,并使用 gradio
实时更新的仪表板显示数据。仪表板将如下所示:
我们将在本指南中介绍以下步骤:
设置您的 BigQuery 凭据
使用 BigQuery 客户端
仅用 7 行 Python 代码构建实时仪表板
我们将使用纽约时报的 COVID 数据集,该数据集作为公共数据集在 BigQuery 上可用。该数据集名为 covid19_nyt.us_counties
,包含了美国各县市最新的 COVID 确诊病例和死亡人数的信息。
先决条件:本指南使用 Gradio Blocks,因此请确保您熟悉 Blocks 类。
设置您的 BigQuery 凭证
要将 Gradio 与 BigQuery 一起使用,您需要获取您的 BigQuery 凭证,并将其与 BigQuery Python 客户端一起使用。如果您已经有了 BigQuery 凭证(作为 .json
文件),您可以跳过这一部分。如果没有,您可以在短短几分钟内免费完成此操作。
首先,登录您的谷歌云账户,然后前往谷歌云控制台 ( https://console.cloud.google.com/)
在云控制台中,点击左上角的汉堡菜单,然后从菜单中选择“API 与服务”。如果您还没有现有的项目,您将需要创建一个。
然后,点击“+ 启用 API 与服务”按钮,这将允许您为您的项目启用特定服务。搜索“BigQuery API”,点击它,然后点击“启用”按钮。如果您看到“管理”按钮,那么 BigQuery 已经启用,一切就绪。
在 API 与服务菜单中,点击“凭证”标签,然后点击“创建凭证”按钮。
在“创建凭证”对话框中,选择“服务账户密钥”作为要创建的凭证类型,并给它命名。同时通过赋予它如“BigQuery 用户”这样的角色来授予服务账户权限,这将允许您运行查询。
在选择服务账户后,选择“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://accounts.google.com/o/oauth2/auth","token_uri": "https://accounts.google.com/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 数据框进行处理。客户端安装后,您可以通过运行以下代码使用您的凭证进行认证:
from google.cloud import bigqueryclient = bigquery.Client.from_service_account_json("path/to/key.json")
凭借您的凭证经过认证后,您现在可以使用 BigQuery Python 客户端与您的 BigQuery 数据集进行交互。
这是一个函数的例子,它查询 BigQuery 中的 covid19_nyt.us_counties
数据集,以显示截至当天确诊病例最多的前 20 个县:
import numpy as np# 定义查询语句,用于从 bigquery-public-data.covid19_nyt.us_counties 这个数据集中选取所有列的数据,
# 并按日期和确诊病例数降序排序,只取前20条记录
QUERY = ('SELECT * FROM `bigquery-public-data.covid19_nyt.us_counties` ''ORDER BY date DESC,confirmed_cases DESC ''LIMIT 20')# 定义查询函数
def run_query():# 使用BigQuery客户端执行查询任务query_job = client.query(QUERY)# 获取查询结果query_result = query_job.result()# 将查询结果转换成DataFramedf = query_result.to_dataframe()# 选择一部分列,只包含"confirmed_cases","deaths","county","state_name"的数据df = df[["confirmed_cases", "deaths", "county", "state_name"]]# 将"deaths","confirmed_cases"两列数据类型转换为numpy的int64类型df = df.astype({"deaths": np.int64, "confirmed_cases": np.int64})# 返回处理后的DataFramereturn df
这段代码查询了最近的20条疫情数据,并且选择了确诊病例数、死亡人数、县名和州名这四列数据,以便进行进一步的分析和处理。重点在于后续如何利用这个数据帧进行有所发现或解析出有用的信息。
建设实时仪表板
一旦你有了一个查询数据的函数,你就可以使用 Gradio 库中的 gr.DataFrame
组件以表格格式显示结果。这是检查数据并确保已正确查询的一种有用方法。
这里是一个如何使用 gr.DataFrame
组件来显示结果的例子。通过将 run_query
函数传递给 gr.DataFrame
,我们指示 Gradio 在页面加载时立即运行该函数并显示结果。此外,您还需要传入关键字 every
,以告诉仪表板每小时刷新一次(60*60 秒)。
# 导入gradio库
import gradio as gr# 利用gradio的Blocks类创建交互界面
with gr.Blocks() as demo:# 在交互界面上创建一个数据框组件,每60分钟运行一次run_query函数并显示函数返回的数据gr.DataFrame(run_query, every=60*60)# 使用队列方式运行demo
demo.queue().launch(
这段代码在Gradio UI上创建了一个表格,该表格每小时更新一次,显示了由run_query
函数返回的最新数据。这种方式可以在数据发生变化时,提供一个可视化的、实时更新的界面,让用户能够持续跟踪数据的变化。
也许您想在我们的仪表板中添加一个可视化。您可以使用 gr.ScatterPlot()
组件将数据以散点图的形式进行可视化。这使您能够看到数据集中不同变量(如病例数和病例死亡数)之间的关系,这对于探索数据和获得洞察力非常有用。同样,我们可以通过传入 every
参数来实时完成这一操作。
这里有一个完整的例子,展示了如何使用 gr.ScatterPlot
来进行可视化,除了用 gr.DataFrame
显示数据
# 导入gradio库
import gradio as gr# 利用gradio的Blocks类创建交互界面
with gr.Blocks() as demo:# 在交互界面上添加Markdown组件,显示标题"Covid Dashboard (Updated Hourly)"gr.Markdown("# 💉 Covid Dashboard (Updated Hourly)")# 添加一个行组件,可以在这个行上添加其他的组件with gr.Row():# 在行组件上添加一个数据框组件,每60分钟运行一次run_query函数并显示函数返回的数据gr.DataFrame(run_query, every=60*60)# 在行组件上添加一个散点图组件,横坐标为"confirmed_cases",纵坐标为"deaths",提示信息为对应的"county",每60分钟运行一次run_query函数并生成散点图gr.ScatterPlot(run_query, every=60*60, x="confirmed_cases",y="deaths", tooltip="county", width=500, height=500)# 使用队列方式运行demo
demo.queue().launch()