【Gradio】表格数据科学与图表-连接到数据库
简介
本指南解释了如何使用 Gradio 将您的应用程序连接到数据库。我们将连接到托管在 AWS 上的 PostgreSQL 数据库,但 gradio 对您连接到的数据库类型及其托管位置完全不可知。因此,只要您能够编写 Python 代码来连接到您的数据,您就可以使用 gradio 在 Web UI 中显示它 💪
概览
我们将分析芝加哥的共享单车数据。数据托管在这里的 kaggle 上。我们的目标是创建一个仪表板,使我们的业务利益相关者能够回答以下问题:
电动自行车比普通自行车更受欢迎吗?
前五大最受欢迎的出发自行车站是哪些?
芝加哥自行车共享仪表板
本演示从托管在 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 dataframedf = pd.read_sql("""-- 计算 ride_id 的数量(代表行程数量),并命名为 n,选择 rideable_typeSELECT 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 dataframedf = pd.read_sql("""-- 选择 ride_id 的计数(表示行程数量)并命名为 n,以及起始站点名称的最大值(由于已经按照 start_station_id 分组,所以同一组内的 start_station_name 应该相同,使用 MAX 函数可以获取到当前组内的站点名称)并命名为 stationSELECT 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轴的刻度标签字体大小为8ax.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 和 stationbike_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”。你可以在“设置”标签中完成此操作。
结论
恭喜你!你已经知道如何将你的 gradio 应用程序连接到云上托管的数据库了!☁️
我们的仪表板现在正在 Spaces 上运行。完整代码在这里
正如你所见,gradio 让你有能力连接到你的数据无论它在哪里,并且可以按照你想要的方式显示!🔥
相关文章:

【Gradio】表格数据科学与图表-连接到数据库
简介 本指南解释了如何使用 Gradio 将您的应用程序连接到数据库。我们将连接到托管在 AWS 上的 PostgreSQL 数据库,但 gradio 对您连接到的数据库类型及其托管位置完全不可知。因此,只要您能够编写 Python 代码来连接到您的数据,您就可以使用…...

艾多美用“艾”为生命加油,献血活动回顾
用艾为生命加油 6月10日~16日,艾多美中国开启献血周活动,已经陆续收到来自烟台总部、山东、广东、河南、四川、重庆、贵阳,乌鲁木齐,吉林,等地区的艾多美员工、会员、经销商发来的爱心助力,截止到目前&…...

人工智能在气象预报领域的崛起:GraphCast引领新纪元
最近,谷歌推出的天气预测大模型GraphCast在全球范围内引起了广泛关注,其卓越的表现不仅刷新了人们对AI能力的认知,更预示着传统天气预报工作模式的深刻变革。 GraphCast是一款基于机器学习技术的天气预测工具,它通过深度学习和大数…...

http和https的区别在哪
HTTP(超文本传输协议)和HTTPS(超文本传输安全协议)之间存在几个关键区别主要涉及安全性、端口、成本、加密方式、搜索引擎优化(SEO)、身份验证等方面 1、安全性:HTTP(超文本传输协议…...

windows10远程桌面端口,Windows 10远程桌面端口修改的两个方法
在Windows 10系统中,远程桌面功能允许用户通过网络从一台计算机远程访问和控制另一台计算机。默认情况下,远程桌面服务使用的端口是3389。然而,出于安全考虑,许多管理员和用户希望修改这一默认端口。本指南将详细介绍如何在Window…...
力扣1504.统计全1子矩形
力扣1504.统计全1子矩形 开一个二维数组存每个点从它本身开始向左有多少连续的1 遍历矩形右下角(i,j) 再遍历行k in i每一行的矩形数量 minx min(minx,left(k,j)) class Solution {public:int numSubmat(vector<vector<int>>& mat) {int n mat.size();int…...
vue3高德地图组件化,解决复用地图组件时渲染失败问题
思路:多个页面都需要调用地图,将地图封装成一个组件进行复用,发现调用时只有第一次渲染成功了。 解决:相同 id 的地图渲染只能有一次,如果多个复用地图的页面不需要同时渲染,使用 v-if 来控制;…...
Langchain 如何工作
How does LangChain work? LangChain是如何工作的? Let’s consider our initial example where we upload the US Constitution PDF and pose questions to it. In this scenario, LangChain compiles the data from the PDF and organizes it. 让我们考虑我们最初的例子…...

【数据结构】顺序表实操——通讯录项目
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...

C++继承与多态—多重继承的那些坑该怎么填
课程总目录 文章目录 一、虚基类和虚继承二、菱形继承的问题 一、虚基类和虚继承 虚基类:被虚继承的类,就称为虚基类 virtual作用: virtual修饰成员方法是虚函数可以修饰继承方式,是虚继承,被虚继承的类就称为虚基类…...

论文阅读:基于谱分析的全新早停策略
来自JMLR的一篇论文,https://www.jmlr.org/papers/volume24/21-1441/21-1441.pdf 这篇文章试图通过分析模型权重矩阵的频谱来解释模型,并在此基础上提出了一种用于早停的频谱标准。 1,分类难度对权重矩阵谱的影响 1.1 相关研究 在最近针对…...

1.接口测试-postman学习
目录 1.接口相关概念2.接口测试流程3.postman基本使用-创建请求(1)环境(2)新建项目集合Collections(3)新建collection(4)新建模块(5)构建请求请求URLheader设…...
2024年码蹄杯本科院校赛道初赛(省赛)
赛时所写题,简单写一下思路,qwq 第一题: 输出严格次小值, //#pragma GCC optimize(2)#include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue> #incl…...

PHP蜜语翻译器在线文字转码解码源码
源码介绍 PHP蜜语翻译器在线文字转码解码源码 文字加密通话、一键转换、蜜语密码 无需数据库,可以将文字、字母、数字、代码、表情、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容!支持在线加密解密 有多种加密展示…...
安卓浏览器区分启动、打开、分享
搞了几个钟头,终于全兼容了,分享有2种类型! void getDataFromIntent(Intent intent) {if (intent.getAction().equals(Intent.ACTION_VIEW)) {urln intent.getDataString();if (urln ! null) {if (urln.contains("\n"))urln url…...

C/C++ 数组负数下标
一 概述 在 C 中,数组是一块连续的内存空间,数组的下标通常用来定位这段内存中的特定元素。下标通常从 0 开始,最大到数组长度减 1。例如,一个有 10 个元素的数组,其有效下标范围是从 0 到 9。 当你尝试使用负数下标来…...
钓鱼网站开发原理(社会工程学)
钓鱼网站开发原理(社会工程学) 一、课程简介1、课程大纲2、课程目标3、知识储备 二、钓鱼网站简介1、什么是钓鱼网站2、开发&原理 三、PHP环境搭建1、简介2、自动安装MySQL/apache/PHP3、安装navicat 四、PDO表单入库案例1、语法2、显示登录表单3、入…...

如何优雅地使用 console.log 打印数组或对象
一、背景 使用 console.log 在控制台中打印数组或者对象时,很多时候它们的字段都是默认关闭的,需要手动一个个的点开,非常不直观且麻烦。 二、解决方案 使用 JSON.stringify() 的第三个参数 我们来看一下官方对于 JSON.stringify 的介绍 三、…...

模式分解的概念(下)-无损连接分解的与保持函数依赖分解的定义和判断、损失分解
一、无损连接分解 1、定义 2、检验一个分解是否是无损连接分解的算法 输入与输出 输入: 关系模式R(U,F),F是最小函数依赖集 R上的一个分解 输出: 判断分解是否为无损连接分解 (1&#x…...
vue3父组件获取子组件的实例对象
一,ref 在父组件的模板里,对子组件的标签定义ref属性,并且设置属性值,在方法里获取ref()获取实例对象。 父组件: <template><div ><div>我是父组件</div><<SonCom ref"sonComRe…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...