【Gradio】表格数据科学与图表-连接到数据库

简介

本指南解释了如何使用 Gradio 将您的应用程序连接到数据库。我们将连接到托管在 AWS 上的 PostgreSQL 数据库,但 gradio 对您连接到的数据库类型及其托管位置完全不可知。因此,只要您能够编写 Python 代码来连接到您的数据,您就可以使用 gradio 在 Web UI 中显示它 💪

 概览 

我们将分析芝加哥的共享单车数据。数据托管在这里的 kaggle 上。我们的目标是创建一个仪表板,使我们的业务利益相关者能够回答以下问题:

  1. 电动自行车比普通自行车更受欢迎吗?

  2. 前五大最受欢迎的出发自行车站是哪些?

芝加哥自行车共享仪表板

本演示从托管在 AWS 上的 postgresql 数据库中提取 2022 年 3 月的芝加哥自行车共享数据。本演示使用 psycopg2,但任何 postgresql 客户端库(如 SQLAlchemy)都与 gradio 兼容。

连接凭证由定义在 Space 中的环境变量作为秘密处理。

如果数据库中添加了数据,每当网页重新加载时,本演示中的图表就会更新。

本演示可作为您的数据库连接应用的起点!

第一步 - 创建您的数据库 

我们将在亚马逊的 RDS 服务上托管的 PostgreSQL 上存储我们的数据。如果您还没有 AWS 账户,请创建一个,并在免费层上创建一个 PostgreSQL 数据库。

重要提示:如果您计划在 HuggingFace Spaces 上托管此演示,请确保数据库位于 8080 端口。Spaces 将阻止所有出站连接,除非它们是向端口 80、443 或 8080 发出的,如此处所述。RDS 不允许您在端口 80 或 443 上创建 PostgreSQL 实例。

创建数据库后,从 Kaggle 下载数据集并将其上传到您的数据库。为了这个演示,我们只会上传 2022 年 3 月的数据。

第 2.a 步 - 编写您的 ETL 代码 

我们将查询我们的数据库,按自行车类型(电动,标准或停靠)分别统计骑行总数。我们还将查询每个站点出发的骑行总数,并取前 5 名。

然后,我们将使用 matplotlib 将我们的查询结果进行可视化

我们将使用 pandas 的 read_sql 方法连接到数据库。这需要安装 psycopg2 库。

为了连接到我们的数据库,我们将把数据库用户名、密码和主机指定为环境变量。这将通过避免在我们的应用程序文件中以明文存储敏感信息,使我们的应用更加安全。

#导入os,pandas以及matplotlib.pyplot这三个库
import os
import pandas as pd
import matplotlib.pyplot as plt


#获取环境变量"DB_USER"、"DB_PASSWORD"和"DB_HOST"的值,分别赋值给变量DB_USER,DB_PASSWORD和DB_HOST
#如果对应的环境变量不存在,这些值将为None
DB_USER = os.getenv("DB_USER")
DB_PASSWORD = os.getenv("DB_PASSWORD")
DB_HOST = os.getenv("DB_HOST")


#定义数据库端口号
PORT = 8080


#定义数据库名称
DB_NAME = "bikeshare"


#根据上述参数构建连接字符串
connection_string = f"postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}?port={PORT}&dbname={DB_NAME}"


#定义函数get_count_ride_type,该函数用于获取不同类型的自行车的行程数,并将结果制作成柱状图
def get_count_ride_type():
    # 使用SQL语句从数据库中提取数据,并将结果转化为pandas dataframe
    df = pd.read_sql(
    """
    -- 计算 ride_id 的数量(代表行程数量),并命名为 n,选择 rideable_type
    SELECT COUNT(ride_id) as n, rideable_type
    -- 从名为 rides 的表中选择数据
    FROM rides
    -- 根据 rideable_type 进行分组
    GROUP BY rideable_type
    -- 根据 n(行程数量)进行降序排序
    ORDER BY n DESC
    """,
    #连接数据库
    con=connection_string
    )
    #创建一张新的图表
    fig_m, ax = plt.subplots()
    #创建柱状图
    ax.bar(x=df['rideable_type'], height=df['n'])
    ax.set_title("Number of rides by bycycle type")
    ax.set_ylabel("Number of Rides")
    ax.set_xlabel("Bicycle Type")
    return fig_m


# 定义函数get_most_popular_stations,该函数用于获取最受欢迎的5个自行车站点,并将结果制作成柱状图
def get_most_popular_stations():
    # 使用SQL语句从数据库中提取数据,并将结果转化为pandas dataframe
    df = pd.read_sql(
        """
        -- 选择 ride_id 的计数(表示行程数量)并命名为 n,以及起始站点名称的最大值(由于已经按照 start_station_id 分组,所以同一组内的 start_station_name 应该相同,使用 MAX 函数可以获取到当前组内的站点名称)并命名为 station
        SELECT COUNT(ride_id) as n, MAX(start_station_name) as station
        -- 从名为 RIDES 的表中选择数据
        FROM RIDES
        -- 只选择起始站点名称不为 NULL 的数据
        WHERE start_station_name is NOT NULL
        -- 根据起始站点编号 start_station_id 分组
        GROUP BY start_station_id
        -- 按照 n(行程数量)从大到小排序
        ORDER BY n DESC
        -- 仅返回前5条记录
        LIMIT 5
    """,
    #连接数据库
    con=connection_string
    )
    #创建一张新的图表
    fig_m, ax = plt.subplots()
    #创建柱状图
    # 使用matplotlib的bar方法绘制柱状图,df['station']为X轴,df['n']为Y轴
    ax.bar(x=df['station'], height=df['n'])
    # 设置图表标题为"Most popular stations"
    ax.set_title("Most popular stations")
    # 设置Y轴标签为"Number of Rides"
    ax.set_ylabel("Number of Rides")
    # 设置X轴标签为"Station Name"
    ax.set_xlabel("Station Name")
    # 设置X轴刻度标签的显示方式,使用df['station']的值作为标签,设置标签旋转角度为45度,靠右对齐,用锚点方式进行旋转
    ax.set_xticklabels(df['station'], rotation=45, ha="right", rotation_mode="anchor") 
    # 设置X轴的刻度标签字体大小为8
    ax.tick_params(axis="x", labelsize=8) 
    # 调整子图参数,使子图适应图例,使之填满图像区域
    fig_m.tight_layout()
    return fig_m

如果您要在本地运行我们的脚本,您可以像这样将您的凭证作为环境变量传入

DB_USER='username' DB_PASSWORD='password' DB_HOST='host' python app.py

第 2.c 步 - 编写您的 gradio 应用程序 

我们将使用 gr.Row() 并排显示两个独立的 gr.Plot 组件来展示或 matplotlib 图表。因为我们已经用 demo.load() 事件触发器包装了获取数据的函数,所以我们的演示将在每次网页加载时动态地从数据库中获取最新数据。🪄

# 导入 gradio 库并简化为 gr
import gradio as gr


# 利用 gr.Blocks() 创建一个上下文环境,命名为 demo
with gr.Blocks() as demo:
    # 在 demo 中创建一个行布局(Row)
    with gr.Row():
        # 在创建的行布局中添加两个绘图空间,命名为 bike_type 和 station
        bike_type = gr.Plot()
        station = gr.Plot()


    # 加载 get_count_ride_type 函数,并设置其输出到 bike_type 绘图空间
    demo.load(get_count_ride_type, inputs=None, outputs=bike_type)
    # 加载 get_most_popular_stations 函数,并设置其输出到 station 绘图空间
    demo.load(get_most_popular_stations, inputs=None, outputs=station)


# 启动并呈现用户界面
demo.launch()

第 3 步 - 部署 

如果您运行上面的代码,您的应用将开始在本地运行。通过传递 share=True 参数给 launch ,您甚至可以获得一个临时的可分享链接。

但是如果你想要一个永久的部署解决方案呢?让我们将我们的 Gradio 应用部署到免费的 HuggingFace Spaces 平台上。

如果你之前没有使用过 Spaces,请按照这里的前一个指南https://www.gradio.app/guides/using-hugging-face-integrations操作。你将需要添加 DB_USER 、 DB_PASSWORD 和 DB_HOST 变量作为“Repo Secrets”。你可以在“设置”标签中完成此操作。

02509ed5bab9e34faf7252ba3a60f509.png

 结论 

恭喜你!你已经知道如何将你的 gradio 应用程序连接到云上托管的数据库了!☁️

我们的仪表板现在正在 Spaces 上运行。完整代码在这里

正如你所见,gradio 让你有能力连接到你的数据无论它在哪里,并且可以按照你想要的方式显示!🔥

<think>好的,用户问的是Python的UI框架中哪个最适合做BI(商业智能)。首先,我需要理解BI工具的需求。BI通常需要数据可视化、交互式仪表盘、数据处理能力和用户友好性。所以,Python中适合的框架应该具备这些特点。 接下来,我得回忆一下Python有哪些常见的UI框架。比如Dash、Streamlit、Panel、Bokeh、PyQt/PySide、Gradio、Voilà等。每个框架的特点不同,需要逐一分析它们在BI场景下的优缺点。 Dash是基于Flask和React的,适合创建交互式仪表盘,支持Plotly图表,可能有较多的组件和扩展。Streamlit以快速开发著称,适合快速搭建数据应用,但可能在复杂交互上有限。Panel可以整合多个可视化库,比如Bokeh、Matplotlib,灵活性高。Bokeh本身专注于可视化,适合需要定制化图表的场景。PyQt/PySide是传统的桌面UI框架,适合需要复杂桌面应用的情况,但学习曲线陡峭。Gradio比较轻量,适合快速部署模型界面。Voilà能将Jupyter笔记本转换为仪表盘,适合已有分析脚本的情况。 然后,需要比较它们的优缺点。例如,Dash和Streamlit在BI方面可能更常用,因为它们的生态较好,社区支持多。特别是Dash,被广泛用于企业级BI解决方案,因为它支持复杂的布局和回调,适合需要高度定制和交互的场景。Streamlit开发速度快,适合原型开发,但可能在处理复杂业务逻辑时显得不足。 还要考虑用户的技术背景。如果用户是数据分析师,可能更倾向于低代码或声明式的框架,如Streamlit或Dash。如果是开发人员,可能更看重灵活性和控制力,会选择Panel或PyQt。 另外,集成数据能力也很重要。比如,是否容易Pandas、NumPy、机器学习库等整合。Dash和Streamlit在这方面都做得不错,因为它们本身就是为数据应用设计的。 还要提到部署的便捷性。BI工具可能需要部署到Web服务器,Dash和Streamlit都支持部署,但Dash可能需要更多的配置,而Streamlit Cloud简化了部署过程。Voilà适合已经使用Jupyter Notebook的用户,可以快速转换。 可能还需要提到社区和文档支持。Dash和Streamlit都有活跃的社区和丰富的文档,这对解决问题和持续维护很重要。 最后,总结推荐,根据不同的需求和场景,给出最佳选择。比如,如果需要高度定制和复杂交互,推荐Dash;如果快速开发和小型项目,推荐Streamlit;已有Jupyter环境则选Voilà,等等。</think>Python中有多个适合构建商业智能(BI)工具的UI框架,根据场景需求不同,推荐如下: --- ### **1. 最佳综合选择:Dash** - **核心优势**:专为数据分析可视化设计,支持复杂交互式仪表盘,企业级应用广泛。 - **特点**: - 基于Flask + React,提供声明式布局和回调机制。 - 无缝集成Plotly图表库(支持热力图、3D图等)。 - 支持多页面应用、权限控制和复杂业务逻辑。 - 可通过`dash-enterprise`部署到云服务。 - **适用场景**:需要高度定制化、交互复杂的企业级BI系统。 - **代码示例**: ```python import dash from dash import html, dcc app = dash.Dash() app.layout = html.Div([ dcc.Graph(figure=px.line(df, x="日期", y="销售额")) ]) ``` --- ### **2. 快速原型开发:Streamlit** - **核心优势**:极简代码实现数据应用,适合快速验证和轻量级BI需求。 - **特点**: - 通过简单函数调用生成UI组件(滑块、按钮等)。 - 自动重载脚本,开发效率高。 - 支持Markdown、LaTeX公式(通过`st.latex`)。 - 可部署到Streamlit Cloud或私有服务器。 - **适用场景**:内部报告、临时分析工具或MVP(最小可行产品)。 - **代码示例**: ```python import streamlit as st st.title("销售分析") st.line_chart(df, x="月份", y="增长率") ``` --- ### **3. 灵活可视化整合:Panel** - **核心优势**:兼容多种可视化库(Bokeh、Matplotlib、Plotly),适合混合技术栈。 - **特点**: - 支持动态绑定数据更新(如实时数据流)。 - 可嵌入Jupyter Notebook或独立部署为Web应用。 - 提供响应式布局和主题系统。 - **适用场景**:需要结合多种图表库的复杂BI面板。 - **代码示例**: ```python import panel as pn pn.extension() plot = df.hvplot.line("时间", "指标") dashboard = pn.Column("# 实时监控", plot) dashboard.servable() ``` --- ### **4. 传统桌面应用:PyQt/PySide** - **核心优势**:构建本地化桌面BI工具,适合离线环境或硬件集成。 - **特点**: - 提供完整的UI控件(表格、树形菜单等)。 - 支持多线程处理大数据。 - 可打包为EXE或DMG文件。 - **适用场景**:需要本地数据库或硬件交互的专用BI工具。 - **代码示例**: ```python from PyQt5 import QtWidgets app = QtWidgets.QApplication([]) window = QtWidgets.QMainWindow() table = QtWidgets.QTableView() window.setCentralWidget(table) window.show() app.exec_() ``` --- ### **5. Jupyter生态集成:Voilà** - **核心优势**:将Jupyter Notebook直接转换为仪表盘,适合已有分析脚本。 - **特点**: - 保留Notebook的交互性(如IPywidgets)。 - 支持隐藏代码单元格,仅展示可视化结果。 - 可通过模板定制UI风格。 - **适用场景**:快速将现有分析脚本发布为内部BI工具。 --- ### **选择建议** | 需求场景 | 推荐框架 | |---------------------------|----------------| | 企业级复杂交互仪表盘 | Dash | | 快速验证或临时报告 | Streamlit | | 混合多种图表库 | Panel | | 离线桌面应用 | PyQt/PySide | | 基于Jupyter的轻量级部署 | Voilà | --- ### **技术补充** - **数据层**:均可整合Pandas、NumPy、Dask等库。 - **部署方案**: - Web应用:Dash/Streamlit/Panel + Docker/Nginx。 - 桌面端:PyInstaller打包PyQt应用。 - 云原生:Streamlit Cloud或Dash Enterprise。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值