Google Sheets 是一种以电子表格形式存储表格数据的简便方法。通过 Gradio 和 pandas,可以轻松地从公共或私有的 Google Sheets 中读取数据,然后显示数据或绘制图表。在这篇博客文章中,我们将构建一个小的实时仪表板,当 Google Sheets 中的数据更新时,仪表板也会更新。
构建仪表板本身只需使用Gradio的9行Python代码,我们的最终仪表板将如下所示:
先决条件: 本指南使用 Gradio Blocks,因此请确保您熟悉 Blocks 类。
根据您使用的是公开可访问的Google表格还是私人Google表格,过程会有所不同。我们将涵盖这两种情况,让我们开始吧!
从公共Google表格构建仪表板非常容易,这要归功于pandas库:
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表格中提取数据。
对于私有的Google Sheets,这个过程需要多一点工作,但并不多!关键的区别在于,现在你必须进行身份验证以授权访问私有的Google Sheets。
要进行身份验证,请从Google Cloud获取凭据。以下是如何设置Google Cloud凭据:
1. 首先,登录您的Google Cloud账户并进入Google Cloud控制台 (https://console.cloud.google.com/)
2. 在云控制台中,点击左上角的汉堡菜单,并从菜单中选择“APIs & Services”。如果您没有现有项目,则需要创建一个。
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://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"
}一旦你有了凭证 .json 文件,你可以按照以下步骤查询你的Google表格:
1. 点击Google表格右上角的“分享”按钮。使用认证子部分第5步中的服务电子邮件地址分享Google表格(此步骤很重要!)。然后点击“获取可分享链接”按钮。这将给你一个类似这样的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表格中提取数据。
这就是全部内容!只需几行代码,您就可以使用gradio和其他库从公共或私有的Google表格中读取数据,然后在实时仪表板中显示和绘制数据。