1. 其他教程
  2. 从 Google 表格创建实时仪表板

使用 Google 表格创建实时仪表板

Google Sheets 是一种以电子表格形式存储表格数据的便捷方式。借助 Gradio 和 pandas,可以轻松读取公共或私有的 Google Sheets 数据,然后进行显示或绘图。在本篇博文中,我们将构建一个小型*实时*仪表板,该仪表板会在 Google Sheets 中的数据更新时自动更新。

使用 Gradio,构建仪表板本身仅需 9 行 Python 代码,而我们最终的仪表板将如下所示:

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

根据您使用的是公共访问还是私有 Google Sheet,过程略有不同。我们将涵盖两者,现在就开始吧!

公共 Google Sheets

得益于 pandas 库,从公共 Google Sheet 构建仪表板非常容易。

1. 获取您要使用的 Google Sheets 的 URL。为此,只需转到 Google Sheets,点击右上角的“共享”按钮,然后点击“获取可共享链接”按钮。这将为您提供一个类似如下的 URL:

https://docs.google.com/spreadsheets/d/1UoKzzRzOCt-FXLLqDKLbryEKEgllGAQUEJ5qtmmQwpU/edit#gid=0

2. 现在,让我们修改此 URL,然后使用它将数据从 Google Sheets 读取到 Pandas DataFrame 中。(在下面的代码中,将 URL 变量替换为您公共 Google Sheet 的 URL)

import pandas as pd

URL = "https://docs.google.com/spreadsheets/d/1UoKzzRzOCt-FXLLqDKLbryEKEgllGAQUEJ5qtmmQwpU/edit#gid=0"
csv_url = URL.replace('/edit#gid=', '/export?format=csv&gid=')

def get_data():
    return pd.read_csv(csv_url)

3. 数据查询是一个函数,这意味着使用 gr.DataFrame 组件可以轻松地实时显示它,或者使用 gr.LinePlot 组件可以实时绘制它(当然,根据数据,其他绘图方式可能更合适)。为此,只需将函数传递给相应的组件,并根据您希望组件每隔多久(以秒为单位)刷新一次来设置 every 参数。这是 Gradio 代码:

import gradio as gr

with gr.Blocks() as demo:
    gr.Markdown("# 📈 Real-Time Line Plot")
    with gr.Row():
        with gr.Column():
            gr.DataFrame(get_data, every=gr.Timer(5))
        with gr.Column():
            gr.LinePlot(get_data, every=gr.Timer(5), x="Date", y="Sales", y_title="Sales ($ millions)", overlay_point=True, width=500, height=500)

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

这样就完成了!您拥有一个每 5 秒刷新一次的仪表板,可以从您的 Google Sheet 中拉取数据。

私有 Google Sheets

对于私有 Google Sheets,过程需要多做一些工作,但并不算多!关键区别在于,现在您必须进行身份验证才能授权访问私有 Google Sheets。

身份验证

要进行身份验证,请从 Google Cloud 获取凭据。以下是如何设置 Google Cloud 凭据

1. 首先,登录您的 Google Cloud 账户并访问 Google Cloud Console(https://console.cloud.google.com/)。

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

3. 然后,点击“+ 已启用 API 和服务”按钮,该按钮允许您为项目启用特定服务。搜索“Google Sheets API”,点击它,然后点击“启用”按钮。如果看到“管理”按钮,则表示 Google Sheets 已启用,您已准备就绪。

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

5. 在“创建凭据”对话框中,选择“服务账号密钥”作为要创建的凭据类型,并为其命名。记下服务账号的电子邮件

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"
}

查询

获得凭据 .json 文件后,您可以使用以下步骤查询您的 Google Sheet:

1. 点击 Google Sheet 右上角的“共享”按钮。将 Google Sheets 与身份验证子部分第 5 步中的服务电子邮件地址共享(此步骤很重要!)。然后点击“获取可共享链接”按钮。这将为您提供一个类似如下的 URL:

https://docs.google.com/spreadsheets/d/1UoKzzRzOCt-FXLLqDKLbryEKEgllGAQUEJ5qtmmQwpU/edit#gid=0

2. 安装 gspread 库,它使在 Python 中使用 Google Sheets API 变得容易,方法是在终端运行:pip install gspread

3. 编写一个函数来加载 Google Sheet 中的数据,如下所示(将 URL 变量替换为您私有 Google Sheet 的 URL):

import gspread
import pandas as pd

# Authenticate with Google and get the sheet
URL = 'https://docs.google.com/spreadsheets/d/1_91Vps76SKOdDQ8cFxZQdgjTJiz23375sAT7vPvaj4k/edit#gid=0'

gc = gspread.service_account("path/to/key.json")
sh = gc.open_by_url(URL)
worksheet = sh.sheet1

def get_data():
    values = worksheet.get_all_values()
    df = pd.DataFrame(values[1:], columns=values[0])
    return df

4. 数据查询是一个函数,这意味着使用 gr.DataFrame 组件可以轻松地实时显示它,或者使用 gr.LinePlot 组件可以实时绘制它(当然,根据数据,其他绘图方式可能更合适)。为此,我们只需将函数传递给相应的组件,并根据我们希望组件每隔多久(以秒为单位)刷新一次来设置 every 参数。这是 Gradio 代码:

import gradio as gr

with gr.Blocks() as demo:
    gr.Markdown("# 📈 Real-Time Line Plot")
    with gr.Row():
        with gr.Column():
            gr.DataFrame(get_data, every=gr.Timer(5))
        with gr.Column():
            gr.LinePlot(get_data, every=gr.Timer(5), x="Date", y="Sales", y_title="Sales ($ millions)", overlay_point=True, width=500, height=500)

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

现在您拥有一个每 5 秒刷新一次的仪表板,可以从您的 Google Sheet 中拉取数据。

结论

至此,一切就绪!只需几行代码,您就可以使用 gradio 和其他库从公共或私有 Google Sheet 读取数据,然后在实时仪表板中显示和绘制数据。

gradio