Google Sheets 是一种以电子表格形式存储表格数据的便捷方式。借助 Gradio 和 pandas,可以轻松读取公共或私有的 Google Sheets 数据,然后进行显示或绘图。在本篇博文中,我们将构建一个小型*实时*仪表板,该仪表板会在 Google Sheets 中的数据更新时自动更新。
使用 Gradio,构建仪表板本身仅需 9 行 Python 代码,而我们最终的仪表板将如下所示:
先决条件:本指南使用 Gradio Blocks,因此请确保您熟悉 Blocks 类。
根据您使用的是公共访问还是私有 Google Sheet,过程略有不同。我们将涵盖两者,现在就开始吧!
得益于 pandas 库,从公共 Google Sheet 构建仪表板非常容易。
1. 获取您要使用的 Google Sheets 的 URL。为此,只需转到 Google Sheets,点击右上角的“共享”按钮,然后点击“获取可共享链接”按钮。这将为您提供一个类似如下的 URL:
https://docs.google.com/spreadsheets/d/1UoKzzRzOCt-FXLLqDKLbryEKEgllGAQUEJ5qtmmQwpU/edit#gid=02. 现在,让我们修改此 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 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=02. 安装 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 读取数据,然后在实时仪表板中显示和绘制数据。