创建第一个Streamlit应用
创建应用程序
如果您已经顺利完成了前面的步骤,那么您很可能已经安装了 Streamlit 并在“基本概念”和“高级概念”部分中完成了基础操作。如果没有的话,现在正是查看这些内容的好时机。
学习如何使用 Streamlit 的最简单方法就是亲自去实践。在阅读本指南的过程中,逐一测试每种方法。只要你的应用程序正在运行,每次你向脚本中添加新元素并保存后,Streamlit 的用户界面都会询问你是否想要重新运行应用程序并查看更改。这使你能够在一个快速的交互循环中工作:你编写一些代码,保存它,查看输出,再编写一些代码,如此反复,直到你对结果满意为止。目标是使用 Streamlit 创建一个与你的数据或模型相关的交互式应用程序,并在此过程中使用 Streamlit 来审查、调试、完善和分享你的代码。
在本指南中,您将利用 Streamlit 的核心功能来创建一个交互式应用程序;该应用程序将基于纽约市的公共优步数据集来展示乘车和下车的相关信息。完成操作后,您将了解如何获取和缓存数据、绘制图表、在地图上展示信息以及使用诸如滑块之类的交互式控件来筛选结果。
如果您想直接跳过前面的内容,一次性查看全部内容的话,完整的 代码可在下方获取。
Create your first app
Streamlit 不仅仅是一种创建数据应用程序的方式,它还是一个由众多创作者组成的社区,他们分享自己的应用程序和想法,并相互帮助以提升自己的作品质量。请来到社区论坛与我们一同交流吧。我们非常乐意倾听您的问题、想法,并帮助您解决遇到的难题——今天就来参与吧!
- 第一步是创建一个新的 Python 脚本。我们将其命名为
uber_pickups.py。 - 在您喜欢的集成开发环境(IDE)或文本编辑器中打开
uber_pickups.py文件,然后添加以下几行代码:
import streamlit as st
import pandas as pd
import numpy as np
- 每一个优秀的应用程序都有一个标题,那我们就给它加上一个吧:
st.title('Uber pickups in NYC')
- 现在是时候从命令行运行 Streamlit 了:
streamlit run uber_pickups.py
运行一个 Streamlit 应用程序与运行任何其他 Python 脚本并无不同。只要您需要查看该应用程序,就可以使用此命令。
您是否知道您还可以将一个 URL 传递给“streamlit run”命令呢?当与 GitHub Gists 结合使用时,这非常有用。
例如:
streamlit run https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/streamlit_app.py
获取一些数据
既然你已经有了这个应用程序,接下来你需要做的就是获取纽约市内优步的乘车和下车数据集。
首先,让我们编写一个函数来加载数据。将以下代码添加到您的脚本中:
DATE_COLUMN = 'date/time'
DATA_URL = ('https://s3-us-west-2.amazonaws.com/'
'streamlit-demo-data/uber-raw-data-sep14.csv.gz') def load_data(nrows):
data = pd.read_csv(DATA_URL, nrows=nrows)
lowercase = lambda x: str(x).lower()
data.rename(lowercase, axis='columns', inplace=True)
data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN])
return data
您会注意到,
load_data是一个简单的常规函数,它会下载一些数据,将其放入一个 Pandas 数据框中,并将日期列从文本格式转换为日期时间格式。该函数接受一个参数(nrows),该参数指定了您希望加载到数据框中的行数。现在让我们来测试一下这个功能并查看一下输出结果。在您的函数下方添加以下几行代码:
# Create a text element and let the reader know the data is loading.
data_load_state = st.text('Loading data...')
# Load 10,000 rows of data into the dataframe.
data = load_data(10000)
# Notify the reader that the data was successfully loaded.
data_load_state.text('Loading data...done!')
在您应用程序的右上角会看到几个按钮,它们会询问您是否想要重新运行该应用程序。选择“始终重新运行”,那么每次您保存更改时,您所做的改动都会自动显示出来。
好吧,这实在太过平淡无奇了……
结果发现,下载数据并将 10,000 行数据加载到数据框中需要很长时间。将日期列转换为日期时间格式也不是一件简单的事情。您不想每次应用程序更新时都重新加载数据——幸运的是,Streamlit 允许您缓存数据。
轻松实现缓存
尝试在
load_data声明之前添加@st.cache_data:@st.cache_data
def load_data(nrows):
然后保存脚本,Streamlit 将会自动重新运行你的应用程序。由于这是你第一次使用
@st.cache_data来运行脚本,所以你不会看到有任何变化。让我们再对你的文件做一些修改,以便你能更好地体验缓存功能的强大之处。将
data_load_state.text('Loading data...done!')这一行代码替换为以下内容:data_load_state.text("Done! (using st.cache_data)")
现在保存。看看你添加的那条线是如何立即显现出来的吗?如果你稍作退后观察一下,这其实相当令人惊叹。幕后正发生着神奇的事情,而只需一行代码就能激活它。
它是如何运作的呢?
让我们花几分钟时间来探讨一下 @st.cache_data 实际是如何运作的。
当您为使用 Streamlit 的缓存注解的函数添加标记时,它会告知 Streamlit:每当调用该函数时,它都应检查以下两件事:
您在函数调用中所使用的输入参数。
函数内部的代码。
如果这是 Streamlit 首次以这些确切的值、以这种确切的组合方式看到这两项内容,它就会运行该函数并将结果存储在本地缓存中。下次调用该函数时,如果这两个值没有发生变化,那么 Streamlit 就知道可以完全跳过执行该函数。相反,它会从本地缓存中读取输出并将其传递给调用者——就像魔法一样。
“但是,等一下,”你自言自语道,“这听起来太完美了,简直不可思议。那么这一切的局限性究竟在哪里呢?”
嗯,主要有以下几点:
Streamlit 只会检查当前工作目录内的更改。如果您升级了一个 Python 库,那么 Streamlit 的缓存只有在该库安装在您的工作目录内时才会注意到这一变化。
如果您的函数不是确定性的(也就是说,其输出取决于随机数),或者如果它从外部时变源(例如,实时股票市场行情服务)中获取数据,那么缓存的值将一无所知。
最后,您应该避免修改使用 st.cache_data 缓存的函数的输出,因为缓存值是通过引用存储的。
虽然这些限制需要牢记在心,但很多时候它们并不会成为一个问题。在那些时候,这个缓存确实具有变革性。
每当您的代码中存在长时间运行的计算时,请考虑对其进行重构,以便能够使用 @st.cache_data(如果可行的话)。请阅读缓存以获取更多详细信息。
检查原始数据
在开始处理数据之前,先查看一下所使用的原始数据总是个不错的做法。让我们在应用程序中添加一个子标题以及原始数据的打印输出:
st.subheader('Raw data')
st.write(data)
在基本概念指南中,您了解到 st.write 函数能够呈现您传递给它的几乎任何内容。在这种情况下,您传入了一个数据框,它呈现成了一个可交互的表格。
st.write 会根据输入数据的类型来执行正确操作。如果其表现不符合您的预期,您可以使用诸如 st.dataframe 这样的专门命令来替代。有关完整列表,请参阅 API 参考文档。
绘制一个直方图
既然您已经有机会查看了这个数据集并对其内容有所了解,那么让我们再进一步操作一下,绘制一个直方图,以查看在纽约市,优步最繁忙的时段是哪些时段。
首先,让我们在原始数据部分下方添加一个副标题:
st.subheader('Number of pickups by hour')
使用 NumPy 生成一个直方图,该直方图按照小时对取车时间进行分组统计:
hist_values = np.histogram(data[DATE_COLUMN].dt.hour, bins=24, range=(0,24))[0]
现在,让我们使用 Streamlit 的
st.bar_chart()方法来绘制这个直方图。st.bar_chart(hist_values)
保存您的脚本。这个直方图应该会立即在您的应用程序中显示出来。经过快速查看,看起来最繁忙的时间是 17:00(下午 5 点)。
为了绘制此图表,我们使用了 Streamlit 的原生 bar_chart() 方法,但需要了解的是,Streamlit 还支持诸如 Altair、Bokeh、Plotly、Matplotlib 等更复杂的图表库。有关完整列表,请参阅支持的图表库。
在地图上绘制数据
利用乌比斯公司的数据集绘制直方图,有助于我们确定乘车高峰时段,但如果我们要弄清楚整个城市中乘车地点的集中区域呢?虽然你可以用柱状图来展示这些数据,但除非你对城市中的纬度和经度坐标非常熟悉,否则很难对其进行解读。为了展示乘车集中区域,让我们使用 Streamlit 的 st.map() 函数将数据叠加在纽约市的地图上。
为该部分添加一个子标题:
st.subheader('Map of all pickups')
使用
st.map()函数来绘制数据:st.map(data)
保存您的脚本。该地图具有完全的交互性。您可以尝试通过平移或放大来查看。
绘制完直方图后,您发现优步接单最繁忙的时间段是 17 点。现在让我们重新绘制地图,以显示 17 点时的接单集中区域。
找出以下代码片段:
st.subheader('Map of all pickups')
st.map(data)
用下面的代码替换它:
hour_to_filter = 17
filtered_data = data[data[DATE_COLUMN].dt.hour == hour_to_filter]
st.subheader(f'Map of all pickups at {hour_to_filter}:00')
st.map(filtered_data)
您应该会看到数据立即更新了。
为了绘制这张地图,我们使用了内置在 Streamlit 中的 st.map 函数,但如果您想要展示复杂的地图数据,我们建议您查看 st.pydeck_chart 。
使用滑块筛选结果
在上一节中,当您绘制地图时,用于筛选结果的时间是直接硬编码到脚本中的,但如果我们要让读者能够实时动态地筛选数据呢?使用 Streamlit 的组件功能就可以做到这一点。让我们使用 st.slider() 方法在应用程序中添加一个滑块。
找到
hour_to_filter变量,并将其替换为以下代码片段:hour_to_filter = st.slider('hour', 0, 23, 17) # min: 0h, max: 23h, default: 17h
使用滑块,即可实时看到地图的更新情况。
使用按钮来切换数据
滑块只是动态改变应用程序构成的一种方式。让我们使用 st.checkbox 函数在您的应用程序中添加一个复选框。我们将使用这个复选框来显示/隐藏应用程序顶部的原始数据表。
找出这些行:
st.subheader('Raw data')
st.write(data)
将以下代码替换这些行:
if st.checkbox('Show raw data'):
st.subheader('Raw data')
st.write(data)
我们相信您肯定有自己的想法。完成本教程后,请查看 Streamlit 在其 API 参考文档中所展示的所有组件。
完整代码
使用
streamlit run [app name]运行APP。
import streamlit as st
import pandas as pd
import numpy as np
st.title('Uber pickups in NYC')
DATE_COLUMN = 'date/time'
DATA_URL = ('https://s3-us-west-2.amazonaws.com/'
'streamlit-demo-data/uber-raw-data-sep14.csv.gz')
@st.cache_data
def load_data(nrows):
data = pd.read_csv(DATA_URL, nrows=nrows)
lowercase = lambda x: str(x).lower()
data.rename(lowercase, axis='columns', inplace=True)
data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN])
return data
data_load_state = st.text('Loading data...')
data = load_data(10000)
data_load_state.text("Done! (using st.cache_data)")
if st.checkbox('Show raw data'):
st.subheader('Raw data')
st.write(data)
st.subheader('Number of pickups by hour')
hist_values = np.histogram(data[DATE_COLUMN].dt.hour, bins=24, range=(0,24))[0]
st.bar_chart(hist_values)
# Some number in the range 0-23
hour_to_filter = st.slider('hour', 0, 23, 17)
filtered_data = data[data[DATE_COLUMN].dt.hour == hour_to_filter]
st.subheader('Map of all pickups at %s:00' % hour_to_filter)
st.map(filtered_data)
分享您的应用程序
在您构建好 Streamlit 应用程序之后,是时候分享它了!要向全世界展示您的应用程序,您可以使用 Streamlit 社区云来免费部署、管理和分享您的应用程序。
它有三个简单的步骤来运作:
将您的应用程序放入公开的 GitHub 仓库中(并确保其中包含 requirements.txt 文件!)
登录至
share.streamlit.io点击“部署应用程序”,然后粘贴您的 GitHub 网址
就是这样!?? 您现在已拥有一个可公开部署的应用程序,可以与全世界分享。点击此处了解如何使用 Streamlit 社区云的相关信息。
寻求帮助
开始的部分就介绍到这里,现在您可以着手开发自己的应用程序了!如果您在此过程中遇到问题,可以尝试以下几种方法。
请访问我们的社区论坛并提出您的问题
通过命令行使用
streamlit help提供快速帮助查阅我们的知识库以获取提示、分步教程以及解答您关于创建和部署 Streamlit 应用程序疑问的文章。
阅读更多文档!具体内容包括:
创建第一个Streamlit应用的更多相关文章
- 用Kotlin创建第一个Android项目(KAD 01)
原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...
- 创建第一个 local network(II)- 每天5分钟玩转 OpenStack(81)
上一节通过 Web GUI 创建了 “first_local_net”,本节我们需要搞清楚底层网络结构有了哪些变化? 点击 “first_local_net” 链接,显示 network 的 subn ...
- 创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)
在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network. 我们将通过 Web GUI 创建第一个 local network. 首先确保 ...
- 3.创建第一个android项目
安卓开发学习笔记 1.安卓开发之环境搭建 2.SDK目录结构和adb工具及命令介绍 3.创建第一个android项目 1.打开Eclipse,选择File——>new——>others.. ...
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- access中根据一个表创建另一个
access中根据一个表创建另一个 SELECT * INTO newTableFROM zD_qlr; SELECT * into mdFROM zd IN 'E:\fz\高阳\大姚\fz\bz\b ...
- 创建第一个ArcGIS API for Silverlight应用
原文:创建第一个ArcGIS API for Silverlight应用 在完成前面的开发环境搭建以后,接下来实现我们的第一个ArcGIS API forSilverlight应用程序. 接下来我们一 ...
- 创建第一个MVC
创建第一个MVC(asp.net)和默认路由设置 Asp.net的MVC已经出到了4.0,我用的是visual studio2013,接下来努力学下MVC,学之前的话我建议大家先去学下三层(分别是DA ...
- 创建第一个UI
创建一个2D UI 制作UI时,首先要创建UI的"根".在Unity顶部NGUI菜单中选择Create,然后选择2D UI. 创建完成后,在Scene窗口中,NGUI自动生成了一个 ...
- WCF学习系列一_创建第一个WCF服务
原创作者:灰灰虫的家http://hi.baidu.com/grayworm WCF开发实战系列一:创建第一个WCF服务 在这个实战中我们将使用DataContract,ServiceContract ...
随机推荐
- 通过远程连接,docker访问获取数据表信息
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId&g ...
- BURP APP HTTPS抓包xposed+justtrustme工具篇
APP HTTPS抓包 当APP是HTTPS时,则单纯的使用Burpsuite无法抓取数据包,原因是APP启用了SSL Pinning(又叫做"SSL证书绑定"). 1.下载夜神模 ...
- Cline技术分析:基于Cline Prompt的File Tools MCP Server实现
我们将基于Cline prompt技术,构建一个基于MCP协议的文件工具服务器.我们将从任务定义开始,并在任务执行过程中探讨各个关键环节. 任务提示词定义 1. 访问[hub.gitmirror.co ...
- xshell远程连接出现WARNING! The remote SSH server rejected X11 forwarding request.
解决办法: 编辑sshd配置文件 vi /etc/ssh/sshd_config 设置 X11Forwarding yes UserLogin no //原本的注释解开 yum install -y ...
- 【BUG】.NET项目|未能加载文件或程序集“xxx”,或它的某一个依赖项。系统找不到指定的文件的通解
出错代码: MSBuildWorkspace workspace = CreateWorkspace(); Solution solution = workspace.OpenSolutionAsyn ...
- 实际工作中 Git Commit 代码提交规范是什么样的?
前言 Git 是我们日常工作中使用最为广泛的分布式版本代码控制系统,因此在我们的实际工作中,git commit 代码提交规范能够让每一次代码提交都变得有据可循,方便后续的代码审查.问题追踪和版本管理 ...
- docker中源码安装onnx / tvm
docker安装 可自行到https://tvm.apache.org/docs/install/docker.html 官网下载安装 环境: 系统: ubuntu22.04系统, docker版本: ...
- java.lang.StringIndexOutOfBoundsException: String index out of range: 1
笔者源码如下: package javaPractice; import java.util.*; public class TestScanner { public static void main ...
- JVM划重点:引用类型、垃圾回收算法和内存划分
一.Java四种引用类型 每种编程语言都有操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过"引用"(Reference).在 Java ...
- java springboot api接口使用easyexcle导出xlsx
提示 使用这种方式,会使你的项目打jar包后,体积增加20MB左右(仅为个人测试) 如果你对表格样式.格式没有要求,可以曲线救国,代码看我其他文章 添加pom依赖 <!--导出excle依赖-- ...