Streamlit 是第一個(gè)專(zhuān)門(mén)針對(duì)機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)團(tuán)隊(duì)的應(yīng)用 開(kāi)發(fā)框架法褥,它是開(kāi)發(fā)自定義機(jī)器學(xué)習(xí)工具的最快的方法子檀,你可以認(rèn)為 它的目標(biāo)是取代 Flask 在機(jī)器學(xué)習(xí)項(xiàng)目中的地位爷怀,可以幫助機(jī)器學(xué)習(xí)工程師快速開(kāi)發(fā)用戶(hù)交互工具麦牺。Streamlit 的宗旨很明確稀并,就是要讓人只需要通過(guò)編寫(xiě)簡(jiǎn)單的 Python 代碼其障,就可以完成構(gòu)建應(yīng)用的需求银室。它支持所見(jiàn)即所得的熱更新,而且你不需要寫(xiě)一行 HTTP 請(qǐng)求代碼及前端代碼励翼,你只需要一個(gè) Python IDE 和一個(gè)瀏覽器蜈敢,就能快速看到你自己構(gòu)建的應(yīng)用。Streamlit 的上手特別簡(jiǎn)單汽抚,并且支持諸如 Tensorflow抓狭,Keras,PyTorch造烁,Pandas否过,Seaborn 等主流的機(jī)器學(xué)習(xí),深度學(xué)習(xí)惭蟋,數(shù)據(jù)分析苗桂,數(shù)據(jù)可視化框架。隨便創(chuàng)建一個(gè) hello.py
文件告组,然后只需要寫(xiě)幾行代碼煤伟,就能完成一個(gè)簡(jiǎn)單的功能。
安裝很簡(jiǎn)單(確保是 Python3.6~3.8),使用 PyPI 安裝:
pip install streamlit
# 啟動(dòng)測(cè)試
streamlit hello
接著便锨,便使用你的默認(rèn)瀏覽器打開(kāi)一個(gè)標(biāo)簽頁(yè)围辙,載入官方案例:
創(chuàng)建自定義的 App,僅僅需要三步:
- 在你的 Python 腳本中載入
streamlit
放案,并寫(xiě)一些代碼 - 使用
streamlit run [filename]
運(yùn)行代碼文件 - 點(diǎn)擊 Streamlit 菜單欄的 ‘Deploy’ 按鈕姚建,便可以 分享你的應(yīng)用給全世界!
1 創(chuàng)建你的第一個(gè) App
本教程使用 vscode 進(jìn)行代碼的編寫(xiě)。創(chuàng)建一個(gè)名為 first_app.py
的文件吱殉,并寫(xiě)入如下代碼用于載入一些模塊:
import streamlit as st
# To make things easier later, we're also importing numpy and pandas for
# working with sample data.
import numpy as np
import pandas as pd
在終端輸入 streamlit run first_app.py
運(yùn)行您的應(yīng)用掸冤。新的標(biāo)簽頁(yè)將在您的默認(rèn)瀏覽器中打開(kāi)。目前為空白友雳,沒(méi)關(guān)系贩虾,下面我們會(huì)添加一些東西。運(yùn)行 Streamlit 應(yīng)用程序與任何其他 Python 腳本沒(méi)有什么不同沥阱。每當(dāng)您需要查看應(yīng)用程序時(shí)缎罢,都可以使用此命令。
Tips: 您知道嗎考杉,您還可以將 URL 傳遞給 streamlit run策精? 當(dāng)與 Github Gists 結(jié)合使用時(shí),這很棒崇棠。 例如:
$ streamlit run https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/app.py
Ctrl + c
可以中止 streamlit run咽袜。
很棒!你完成了一個(gè) App 的創(chuàng)建枕稀,雖然询刹,它什么功能也沒(méi)有,但也是一個(gè) App萎坷。
2 添加文本和數(shù)據(jù)
Streamlit 有多種向應(yīng)用程序添加文本的方法凹联。 查看 API reference 以獲取完整列表。
- 添加一個(gè)標(biāo)題
st.title('My first app')
- 編寫(xiě) Markdown 可以使用
st.write()
哆档,比如:
x = 5
# 使用 Markdown 格式輸出 x^4
st.write(f'${x}^4$ is', x ** 4)
可以看看效果:
這里的公式是使用 Markdown 的語(yǔ)法蔽挠,你也可以使用 latex:
st.latex("\sum_{i=1}^{n}")
更多的使用如下:
st.title("st.title")
st.header("st.header")
st.subheader("st.subheader")
st.markdown("# markdown一級(jí)標(biāo)題")
st.markdown("## markdown二級(jí)標(biāo)題")
st.markdown("### markdown三級(jí)標(biāo)題")
# ------------------------------------
st.write("st.write")
st.markdown("markdown普通文字")
st.text("st.text")
# ------------------------------------
st.markdown("""
Markdown列表:
- hello
- world
- China
""")
st.markdown("***markdown粗斜體***")
# ------------------------------------
st.latex("\sum_{i=1}^{n}")
# ------------------------------------
st.write(1234)
st.write("1234")
st.write("1 + 1 = ", 2)
效果:
st.write()
是一個(gè)泛型函數(shù),根據(jù)傳入對(duì)象不同采取不同的展示方式瓜浸,比如傳入 pandas.DataFrame
時(shí)澳淑,st.write(df)
默認(rèn)調(diào)用 st.dataframe()
,傳入 markdown
時(shí)插佛,st.write(markdown)
默認(rèn)調(diào)用 st.markdown()
杠巡。可傳入的對(duì)象有:
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):
僅僅展示代碼雇寇,而不執(zhí)行氢拥,可以:
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绑改,同時(shí)執(zhí)行 Code;需要將code放入 st.echo()
內(nèi):
with st.echo():
for i in range(5):
st.write("hello")
3 寫(xiě)入 data frame
st.write()
與 magic commands 一起構(gòu)成了 Streamlit 的“瑞士軍刀”兄一。幾乎可以將任何內(nèi)容傳遞給 st.write()
: 文本,數(shù)據(jù)识腿,Matplotlib圖形出革,Altair圖表等等。不用擔(dān)心渡讼,Streamlit 會(huì)弄清楚并以正確的方式呈現(xiàn)事物骂束。
st.write("這是我們使用數(shù)據(jù)創(chuàng)建表的首次嘗試:")
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
st.write(df)
效果:
還有其他一些特定于數(shù)據(jù)的函數(shù),例如 st.dataframe()
和 st.table()
也可以用于顯示數(shù)據(jù)成箫。
4 使用魔法命令
您也可以編寫(xiě)應(yīng)用程序而無(wú)需調(diào)用任何 Streamlit 方法展箱。Streamlit支持“magic commands”,這意味著您根本不必使用 st.write()
蹬昌! 嘗試使用以下代碼片段替換上面的代碼:
"""
# My first app
Here's our first attempt at using data to create a table:
"""
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
df
每當(dāng) Streamlit 在自己的 line 上看到變量或文字值時(shí)混驰,它將使用 自動(dòng)將其寫(xiě) st.write()
入您的應(yīng)用程序。有關(guān)更多信息皂贩,請(qǐng)參閱 magic commands栖榨。
5 繪制圖表和地圖
Streamlit 支持多種流行的數(shù)據(jù)圖表庫(kù),例如 Matplotlib, Altair, deck.gl, and more 等明刷。在本部分中婴栽,您將向您的應(yīng)用添加條形圖,折線圖和地圖辈末。
5.1 畫(huà)折線圖
您可以使用 st.line_chart()
輕松將折線圖添加到您的應(yīng)用中愚争。我們將使用 Numpy 生成一個(gè)隨機(jī)樣本,然后將其繪制成圖表挤聘。
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])
st.line_chart(chart_data)
效果:
5.2 畫(huà)地圖
使用 st.map()
可以在地圖上顯示數(shù)據(jù)點(diǎn)轰枝。讓我們使用 Numpy 生成一些示例數(shù)據(jù)并將其繪制在舊金山地圖上。
map_data = pd.DataFrame(
np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],
columns=['lat', 'lon'])
st.map(map_data)
6 添加可交互的小部件
借助小部件组去,Streamlit 允許您使用復(fù)選框狸膏,按鈕,滑塊等將交互性直接烘焙到應(yīng)用程序中添怔。查看 API reference 以獲取交互式窗口小部件的完整列表湾戳。
6.1 使用復(fù)選框顯示/隱藏?cái)?shù)據(jù)
復(fù)選框的一個(gè)用例是隱藏或顯示應(yīng)用程序中的特定圖表或部分。st.checkbox()
采用單個(gè)參數(shù)广料,即小部件標(biāo)簽砾脑。在此示例中,該復(fù)選框用于切換條件語(yǔ)句艾杏。
if st.checkbox('Show dataframe'):
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])
st.line_chart(chart_data)
效果:
6.2 使用選擇框進(jìn)行選擇
Use st.selectbox
to choose from a series. You can write in the options you want, or pass through an array or data frame column.
Let’s use the df
data frame we created earlier.
使用 st.selectbox
從序列中進(jìn)行選擇韧衣。您可以編寫(xiě)所需的選項(xiàng),也可以通過(guò)數(shù)組或數(shù)據(jù)框列。讓我們使用之前創(chuàng)建的 df
數(shù)據(jù)框畅铭。
option = st.selectbox(
'您最喜歡哪個(gè)數(shù)字氏淑?',
df['first column'])
'You selected: ', option
效果:
7 布局您的應(yīng)用
為了使外觀更整潔,可以將小部件移動(dòng)到側(cè)邊欄(sidebar)中硕噩。這將您的應(yīng)用保持在中心位置假残,而小部件固定在左側(cè)。讓我們來(lái)看看如何在應(yīng)用中使用 st.sidebar
炉擅。
option = st.sidebar.selectbox(
'您最喜歡哪個(gè)數(shù)字辉懒?',
df['first column'])
'You selected:', option
效果:
您可以使用以下語(yǔ)法將大部分可放入應(yīng)用程序中的元素放入側(cè)邊欄中:st.sidebar.[element_name]()
。以下是一些顯示其用法的示例:st.sidebar.markdown()
, st.sidebar.slider()
, st.sidebar.line_chart()
谍失。
您還可以使用 st.beta_columns
并排布置小部件眶俩,或使用 st.beta_expander
通過(guò)隱藏大量?jī)?nèi)容來(lái)節(jié)省空間。
left_column, right_column = st.beta_columns(2)
pressed = left_column.button('Press me?')
if pressed:
right_column.write("Woohoo!")
expander = st.beta_expander("FAQ")
expander.write("Here you could put in some really, really long explanations...")
效果:
現(xiàn)在唯一的例外是 st.echo
和 st.spinner
快鱼。不過(guò)請(qǐng)放心颠印,目前也在努力為這些產(chǎn)品增加支持!
8 顯示進(jìn)度
將長(zhǎng)時(shí)間運(yùn)行的計(jì)算添加到應(yīng)用程序時(shí)抹竹,可以使用 st.progress()
實(shí)時(shí)顯示狀態(tài)嗽仪。
首先,讓我們導(dǎo)入time
柒莉。 然后使用 time.sleep()
方法來(lái)模擬長(zhǎng)時(shí)間運(yùn)行的計(jì)算:
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!'
效果:
9 分享您的應(yīng)用
構(gòu)建 Streamlit 應(yīng)用程序后闻坚,就該共享它了!要將其展示給全世界兢孝,您可以使用 Streamlit sharing 免費(fèi)部署窿凤,管理和共享您的應(yīng)用程序。目前跨蟹,Streamlit 共享僅接受邀請(qǐng)雳殊,因此,請(qǐng) request an invite窗轩,我們將盡快與您聯(lián)系夯秃!
它可以通過(guò) 3 個(gè)簡(jiǎn)單的步驟工作:
- 將您的應(yīng)用放入公開(kāi)的 Github 存儲(chǔ)庫(kù)中(并確保其具有
requirements.txt
!) - 登錄到 share.streamlit.io
- 點(diǎn)擊 ‘Deploy an app’痢艺,然后粘貼您的 GitHub URL
您現(xiàn)在有了一個(gè)公開(kāi)部署的應(yīng)用程序仓洼,可以與世界分享。單擊以了解有關(guān) how to use Streamlit sharing 的更多信息堤舒。如果您要為團(tuán)隊(duì)尋求私人共享色建,請(qǐng)查看 Streamlit for Teams。
10 得到幫助
如果您遇到困難舌缤,可以:
- 查看 community forum 并發(fā)布問(wèn)題
- 使用
$ streamlit --help
從命令行快速獲得幫助 - 閱讀更多文檔箕戳! 查看:
- Streamlit Cookbook for things like caching and inserting elements out of order
- API reference for examples of every Streamlit command
11 其他
Streamlit 提供即時(shí)模式的編程環(huán)境某残。當(dāng) Streamlit 檢測(cè)出源文件變更時(shí),只需點(diǎn)擊 Always rerun 即可陵吸。
緩存簡(jiǎn)化計(jì)算流程玻墅。一連串緩存函數(shù)自動(dòng)創(chuàng)建出高效的計(jì)算流程!你可以嘗試以下代碼:https://gist.github.com/treuill...
基本上壮虫,該流程涉及加載元數(shù)據(jù)到創(chuàng)建摘要等步驟(load_metadata → create_summary)澳厢。該腳本每次運(yùn)行時(shí),Streamlit 僅需重新計(jì)算該流程的子集即可旨指。
Streamlit 適用于 GPU。Streamlit 可以直接訪問(wèn)機(jī)器級(jí)原語(yǔ)(如 TensorFlow喳整、PyTorch)谆构,并對(duì)這些庫(kù)進(jìn)行補(bǔ)充。例如框都,以下 demo 中搬素,Streamlit 的緩存存儲(chǔ)了整個(gè)英偉達(dá) PGGAN。該方法可使用戶(hù)在更新左側(cè)滑塊時(shí)魏保,app 執(zhí)行近乎即時(shí)的推斷熬尺。
可使用戶(hù)在更新左側(cè)滑塊時(shí),app 執(zhí)行近乎即時(shí)的推斷谓罗。
Streamlit 是免費(fèi)開(kāi)源庫(kù)粱哼,而非私有 web app。你可以本地部署 Streamlit app檩咱,不用提前聯(lián)系我們揭措。你甚至可以在不聯(lián)網(wǎng)的情況下在筆記本電腦上本地運(yùn)行 Streamlit。此外刻蚯,現(xiàn)有項(xiàng)目也可以漸進(jìn)地使用 Streamlit绊含。
以上只是 Streamlit 功能的冰山一角而已。它最令人興奮的一點(diǎn)是炊汹,這些原語(yǔ)可以輕松組成復(fù)雜 app躬充,但看起來(lái)卻只是簡(jiǎn)單腳本。這就要涉及架構(gòu)運(yùn)作原理和功能了讨便,本文暫不談及充甚。