Streamlit是第一个专门针对机器学习和数据科学团队的应用 开发框架,它是开发自定义机器学习工具的最快的方法,你可以认为 它的目标是取代 Flask 在机器学习项目中的地位,可以帮助机器学习工程师快速开发用户交互工具。Streamlit 的宗旨很明确,就是要让人只需要通过编写简单的 Python 代码,就可以完成构建应用的需求。它支持所见即所得的热更新,而且你不需要写一行 HTTP 请求代码及前端代码,你只需要一个 Python IDE 和一个浏览器,就能快速看到你自己构建的应用。
一个傻瓜式构建可视化web的程序
Streamlit库官方地址:
https://streamlit.io/
API文档地址:
https://docs.streamlit.io/
在线沙盘:
https://samdobson-streamlit-sandbox-app-za85j0.streamlit.app/?ref=blog.streamlit.io#hello-there
安装:
pip install streamlit
离线安装:
https://pypi.org/project/streamlit/#files
安装完成之后运行:
streamlit hello
可是测试是否正确安装
正确安装后,运行时,可以在CMD或者Anaconda Powershell Prompt (Anaconda)下(推荐这种方式,可设置env)运行:
streamlit run myfile.py
Streamlit库基本介绍
Streamlit是一个基于 Python 的 Web 应用程序框架,致力于以更高效、更灵活的方式可视化数据,并分析结果。它是一个开源库,可以帮助数据科学家和学者在短时间内开发机器学习 (ML) 可视化仪表板。只需几行代码,我们就可以构建并部署强大的数据应用程序。其实就是用Python语言写一个本地Web,应用场景常常是机器学习可视化(当然也可做其他的图表分析等),不需要任何Web前后端开发经验。注意我们写出的Web只有本地可以访问,要接入互联网还需要其他进阶方法!
https://docs.streamlit.io/library/cheatsheet
优点和缺点(from Claude)
Streamlit 是一个用于构建数据应用程序的开源 Python 库,有以下优点和缺点:
简单易用:Streamlit 使用 Python 语法,非常容易掌握,可以快速构建数据应用程序。
美观大方:Streamlit 拥有漂亮的 UI 组件,可以构建出色观感的应用程序。
兼容性强:Streamlit 应用程序可以部署在任何地方 - 在本地运行,嵌入到Notebook中,部署在服务器上等等。
高度交互:Streamlit 支持许多 UI 组件,可以构建高度交互的应用程序。
开源免费:Streamlit 是免费开源的,有很大的社区支持。
只适合简单应用:Streamlit 适合快速构建简单的应用程序,对于大型复杂的应用不太适用。
定制性略差:Streamlit 的 UI 组件定制性稍微差一些,样式不太方便调整。
部署依赖较多:部署 Streamlit 应用程序依赖较多,比较麻烦,不像传统 Python 应用那么简单。
社区较小:虽然 Streamlit 开源社区在增长,但相比其他 Web 框架,社区还是较小。
不支持前后端分离:Streamlit 不支持前后端分离开发,后端和前端高度耦合。
所以,总体来说,Streamlit 是一个非常适合快速开发简单数据应用的工具,但对大型复杂应用和追求高定制性的项目,Streamlit 可能不太适用。但作为快速开发和原型构建,Streamlit 是一个很好的选择。 (已编辑)
运行Streamlit的程序
CMD下运行
Another way of running Streamlit is to run it as a Python module. This can be useful when configuring an IDE like PyCharm to work with Streamlit:
Running
python -m streamlit run your_script.py
anaconda Powershell下运行
is equivalent to:
streamlit run your_script.py
You can also pass a URL to streamlit run! This is great when combined with GitHub Gists. For example:
streamlit run https://raw.githubusercontent.com/streamlit/streamlit_app.py
Step by step 学习
官方指引:
https://docs.streamlit.io/library/get-started
在线学习:
http://cw点hubwiz.com/card/c/streamlit-manual/
https://blog.streamlit.io/how-to-master-streamlit-for-data-science/
Streamlit has two easy ways to display information into your app, which should typically be the first thing you try: st.write and magic.
st.write and magic commands
魔法命令使用时,可以直接输入要输出的对象名称,不用再打st.write(),如下:
st.write()
st.write() 是一个泛型函数,根据传入对象不同采取不同的展示方式,比如传入 pandas.DataFrame 时,st.write(df) 默认调用 st.dataframe(),传入 markdown时,st.write(markdown) 默认调用 st.markdown()。可传入的对象有:
write(data_frame) : Displays the DataFrame as a table.
write(func) : Displays information about a function.
write(module) : Displays information about the module.
write(dict) : Displays dict in an interactive widget.
write(obj) : The default is to print str(obj).
write(mpl_fig) : Displays a Matplotlib figure.
write(altair) : Displays an Altair chart.
write(keras) : Displays a Keras model.
write(graphviz) : Displays a Graphviz graph.
write(plotly_fig) : Displays a Plotly figure.
write(bokeh_fig) : Displays a Bokeh figure.
write(sympy_expr) : Prints SymPy expression using LaTeX.
write(markdown): markdown text.
仅仅展示代码,而不执行,可以:
code = """
def sum_(x):
return np.sum(x)
st.code(code, language="python")
code = """
for (i i 1:10) {
print(i)
st.code(code, language="r")
st.markdown("""
```python
print("hello")
展示 Code,同时执行 Code;需要将code放入 st.echo() 内:
with st.echo():
for i in range(5):
st.write("hello")
文本原素(Text elements)
st.markdown
st.markdown('Streamlit is **_really_ cool**.')
st.markdown(”This text is :red[colored red], and this is **:blue[colored]** and bold.”)
st.markdown(":green[$\sqrt{x^2+y^2}=1$] is a Pythagorean identity. :pencil:")
st.title
st.title('This is a title')
st.title('A title with _italics_ :blue[colors] and emojis :sunglasses:')
st.header
st.subheader
st.caption
st.code
st.text
st.latex
st.divider
数据显示元素(Data display elements)
st.dataframe
st.table
st.metric
st.json
Chart elements
st.line_chart
st.area_chart
st.bar_chart
st.pyplot
st.altair_chart
st.vega_lite_chart
st.plotly_chart
st.bokeh_chart
st.pydeck_chart
st.graphviz_chart
st.map
st.button
st.experimental_data_editor
st.download_button
st.checkbox
st.radio
st.selectbox
st.multiselect
st.slider
st.select_slider
st.text_input
st.number_input
st.text_area
st.date_input
st.time_input
st.file_uploader
st.camera_input
st.color_picker
remove
st.image
st.audio
st.video
Layouts and containers
st.sidebar
st.columns
st.tabs
st.expander
st.container
st.empty
Status elements
st.progress
st.spinner
st.balloons
st.snow
st.error
st.warning
st.info
st.success
st.exception
Control flow
st.stop
st.form
st.form_submit_button
st.experimental_rerun
Utilities
st.set_page_config
st.echo
st.help
st.experimental_show
st.experimental_get_query_params
st.experimental_set_query_params
Mutate charts
State management
Performance
Personalization
Connections and databases
st.experimental_connection
SQLConnection
SnowparkConnection
Connection base class
Advanced features
Command-line options
Configuration
Theming
Caching
Add statefulness to apps
Dataframes
Widget semantics
Pre-release features
Working with timezones
Static file serving
HTTPS support
Secrets management
Components
remove
Components API
Create a Component
Publish a Component
Component gallery
open_in_new
Roadmap
open_in_new
===========================================================================
st.button 会显示一个按钮组件。
应用功能:
默认情况下输出 Goodbye
一旦按下按钮,则会变为显示 Why hello there
st.button() 语句接收了一个值为 Say hello 的 label 参数,会作为显示在按钮上的文字。
st.write 命令被用作显示文字消息,取决于按钮是否按下,显示的要么是 Why hello there,要么是 Goodbye
import streamlit as st
st.header('st.button')
if st.button('Say hello'):
st.write('Why hello there')
else:
st.write('Goodbye')
st.write
st.write 能够在 Streamlit 应用中输出文字等内容。
除了能够输出文字,st.write() 命令还能够输出...
输出字符串,类似于 st.markdown()
输出 Python 的 dict 字典对象
输出 pandas DataFrame,将数据框显示为表格
输出用 matplotlib、plotly、altair、graphviz、bokeh 等库所作的图表
以及更多!(见 API 文档中对 st.write 的描述)
以下是如何使用 st.write 的代码:
import numpy as np
import altair as alt
import pandas as pd
import streamlit as st
st.header('st.write')
# 样例 1
st.write('Hello, *World!* :sunglasses:')
# 样例 2
st.write(1234)
# 样例 3
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
st.write(df)
# 样例 4
st.write('Below is a DataFrame:', df, 'Above is a dataframe.')
# 样例 5
df2 = pd.DataFrame(
np.random.randn(200, 3),
columns=['a', 'b', 'c'])
c = alt.Chart(df2).mark_circle().encode(
x='a', y='b', size='c', color='c', tooltip=['a', 'b', 'c'])
st.write(c)
创建 Streamlit 应用时要做的第一件事就是将 streamlit 库导入为 st:import streamlit as st
然后紧跟着的是应用的标题文字:st.header('st.write')
st.write 的基本用法就是现实文字和使用 Markdown 语法的文本:
st.write('Hello, World! 😎')
前面提到,st.write 还能够输出其他数据类型,比如数字:
st.write(1234)
数据框也能够通过如下语句显示:
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
st.write(df)
你也能传入多个参数,比如:
st.write('Below is a DataFrame:', df, 'Above is a dataframe.')
最后,你也可以显示各种图表,只需传入图表对象即可:
df2 = pd.DataFrame(
np.random.randn(200, 3),
columns=['a', 'b', 'c'])
c = alt.Chart(df2).mark_circle().encode(
x='a', y='b', size='c', color='c', tooltip=['a', 'b', 'c'])
st.write(c)
# -*- coding: utf-8 -*-
# My first app
原文:https://blog.csdn.net/qq_44747847/article/details/116462041
You can now view your Streamlit app in your browser.
Local URL: http://localhost:8501
import streamlit as st
import numpy as np
import pandas as pd
st.title("This is my first app")
st.write("你好")
st.write("Here's our first attempt at using data to create a table:")
#显示dataframe
df = pd.DataFrame({
'first column': [5, 6, 7, 8],
'second column': [50, 60, 70, 80]
st.write(pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
# 其中df定义的位置,并不影响最后的输出位置!
# 可参考https://docs.streamlit.io/library/get-started/main-concepts 中的use magic
#显示折线图
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['广州', '上海', '北京'])
st.line_chart(chart_data)
#显示地图
map_data = pd.DataFrame(
np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],
columns=['lat', 'lon'])
st.map(map_data)
#发现地理位置不太满意,换成江苏南京!
smap_data = pd.DataFrame(
np.random.randn(1000, 2) / [50, 50] + [32.37, 118.4],
columns=['lat', 'lon'])
st.map(smap_data)
#显示单选框
if st.checkbox('Show dataframe'):
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])
chart_data
option = st.selectbox(
'Which number do you like best?',
df['first column'])
'You selected: ', option
#显示按钮
left_column, right_column = st.columns(2)
pressed = left_column.button('Press me?')
if pressed:
right_column.write("Woohoo!")
expander = st.expander("FAQ")
expander.write("Here you could put in some really, really long explanations...")
#添加一个时间进度条
import time
'Starting a long computation...'
# Add a placeholder
latest_iteration = st.empty()
bar = st.progress(0)
for i in range(100):
# Update the progress bar with each iteration.
latest_iteration.text(f'Iteration {i+1}')
bar.progress(i + 1)
time.sleep(0.1)
'...and now we\'re done!'
Web类型程序一定避不开安全性的问题,Streamlit不支持安全认证
即不提供用户名密码等基本的认证方式,查了官方的论坛,目前没有好的办法,官方后续有计划做,但是也是在For Team版本里面,开源版是不提供的。
解决办法:在程序前面加上一个nginx,利用nginx的basic_auth做认证,然后将请求转发给streamlit。这应该是最简单的办法了。
附上nginx的配置,有几个选项必须加,要不然会报ws错误
server {
listen 8501;
server_name 0.0.0.0;
location / {
proxy_pass http://admin-web:8501;
auth_basic "Please input password";
auth_basic_user_file /etc/nginx/conf.d/password.db;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_redirect default;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
快捷打开方法
如果觉得上述访问的方法有点小麻烦,这里提供一种一键打开——一劳永逸的方法,其实就是将上面的指令打包成bat文件~
在py的文件夹(重要!)下新建一个txt文件,文件名任意,输入以下内容:
chcp 65001
@echo off
call activate
call conda activate 环境名
streamlit run 文件名.py
Pause
第一行的作用是让中文文件名也能被识别。
然后再把后缀改成.bat文件即可,这样双击它即可打开我们的网站。退出网站的方法也和刚才类似,只是如果Ctrl+C的话要多一步确认(直接关闭cmd最快!)。
在线学习&视频
YouTube tutorials
Here’s a list of these YouTube channels about Streamlit:
Streamlit. The official Streamlit YouTube channel with official announcements of the latest features.
Data Professor. My YouTube channel with videos on data science and bioinformatics and a growing playlist of 30 videos on Streamlit.
JCharisTech. Jesse’s YouTube channel with tutorial videos on Python and Streamlit and with a playlist of almost 70 videos on Streamlit.
1littlecoder. AbdulMajed’s YouTube channel with tutorial videos on Python and Streamlit and with a playlist of almost 20 videos on Streamlit.
个人项目部署在Streamlit Cloud生成一个公网url随时访问
https://blog.csdn.net/sinat_39629323/article/details/121281071
https://extras.streamlit.app/
https://example-time-series-annotation.streamlit.app/
pypi上的streamlit相关的项目
https://pypi.org/search/?q=streamlit
Streamlit创建多页app(这怎么比我想象的要复杂?)
难度中等,较详细:https://www.jianshu.com/p/4af6dba83156
代码:https://github.com/YanAlmeida/streamlit-multipage-framework
https://pypi.org/project/multipage-streamlit/
创建多页--方法一:st-pages
pip install st-pages
https://pypi.org/project/st-pages/
https://github.com/blackary/st_pages
Basic example: https://st-pages.streamlit.app/
Example with sections: https://st-pages-sections.streamlit.app/
创建多页--方法二:定义函数,定义页面,创建导航
import streamlit as st
# 定义页面内容
def main_page():
st.title("欢迎使用目录应用程序")
st.write("这是主页。请选择一个选项以导航到其他页面。")
def page_page1():
st.title("页面1")
st.write("这是页面1的内容。")
def page_page2():
st.title("页面2")
st.write("这是页面2的内容。")
# 创建页面导航
pages = {
"主页": main_page,
"页面1": page_page1,
"页面2": page_page2
# 创建侧边栏导航菜单
st.sidebar.title("导航菜单")
selection = st.sidebar.radio("跳转到:", list(pages.keys()))
# 根据选择的选项呈现页面内容
page = pages[selection]
page()
创建多页--方法三:定义主函数,main
import streamlit as st
from pages.page_1 import func_page_1
from pages.page_2 import func_page_2
def main():
st.sidebar.subheader('Page selection')
page_selection = st.sidebar.selectbox('Please select a page',
['Main Page', 'Page 1','Page 2'])
pages_main = {
'Main Page': main_page,
'Page 1': run_page_1,
'Page 2': run_page_2
# Run selected page
pages_main[page_selection]()
def main_page():
st.title('Main Page')
def run_page_1():
func_page_1()
def run_page_2():
func_page_2()
if __name__ == '__main__':
main()
除此之外,还要创建两个函数,保存在文件里:
page_1.py:
import streamlit as st
def func_page_1():
st.title('Page 1')
page_2.py:
import streamlit as st
def func_page_2():
st.title('Page 2')
https://docs.streamlit.io/library/get-started/multipage-apps/create-a-multipage-app#run-the-multipage-app
https://www.codenong.com/e9759f1f2253f8106d78/
一个写的有点长的中文的多页面APP方法,难度一般
小图标emoji:
https://raw.githubusercontent.com/omnidan/node-emoji/master/lib/emoji.json