Streamlit 是第一個專門針對機器學(xué)習(xí)和數(shù)據(jù)科學(xué)團隊的應(yīng)用 開發(fā)框架,它是開發(fā)自定義機器學(xué)習(xí)工具的最快的方法,你可以認(rèn)為 它的目標(biāo)是取代 Flask 在機器學(xué)習(xí)項目中的地位,可以幫助機器學(xué)習(xí)工程師快速開發(fā)用戶交互工具。Streamlit 的宗旨很明確,就是要讓人只需要通過編寫簡單的 Python 代碼,就可以完成構(gòu)建應(yīng)用的需求。它支持所見即所得的熱更新,而且你不需要寫一行 HTTP 請求代碼及前端代碼,你只需要一個 Python IDE 和一個瀏覽器,就能快速看到你自己構(gòu)建的應(yīng)用。Streamlit 的上手特別簡單,并且支持諸如 Tensorflow,Keras,PyTorch,Pandas,Seaborn 等主流的機器學(xué)習(xí),深度學(xué)習(xí),數(shù)據(jù)分析,數(shù)據(jù)可視化框架。隨便創(chuàng)建一個 hello.py
文件,然后只需要寫幾行代碼,就能完成一個簡單的功能。
安裝很簡單(確保是 Python3.6~3.8),使用 PyPI 安裝:
pip install streamlit
# 啟動測試
streamlit hello
接著,便使用你的默認(rèn)瀏覽器打開一個標(biāo)簽頁,載入官方案例:
創(chuàng)建自定義的 App,僅僅需要三步:
- 在你的 Python 腳本中載入
streamlit
,并寫一些代碼 - 使用
streamlit run [filename]
運行代碼文件 - 點擊 Streamlit 菜單欄的 ‘Deploy’ 按鈕,便可以 分享你的應(yīng)用給全世界!
1 創(chuàng)建你的第一個 App
本教程使用 vscode 進行代碼的編寫。創(chuàng)建一個名為 first_app.py
的文件,并寫入如下代碼用于載入一些模塊:
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īng)用。新的標(biāo)簽頁將在您的默認(rèn)瀏覽器中打開。目前為空白,沒關(guān)系,下面我們會添加一些東西。運行 Streamlit 應(yīng)用程序與任何其他 Python 腳本沒有什么不同。每當(dāng)您需要查看應(yīng)用程序時,都可以使用此命令。
Tips: 您知道嗎,您還可以將 URL 傳遞給 streamlit run? 當(dāng)與 Github Gists 結(jié)合使用時,這很棒。 例如:
$ streamlit run https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/app.py
Ctrl + c
可以中止 streamlit run。
很棒!你完成了一個 App 的創(chuàng)建,雖然,它什么功能也沒有,但也是一個 App。
2 添加文本和數(shù)據(jù)
Streamlit 有多種向應(yīng)用程序添加文本的方法。 查看 API reference 以獲取完整列表。
- 添加一個標(biāo)題
st.title('My first app')
- 編寫 Markdown 可以使用
st.write()
,比如:
x = 5
# 使用 Markdown 格式輸出 x^4
st.write(f'${x}^4$ is', x ** 4)
可以看看效果:
這里的公式是使用 Markdown 的語法,你也可以使用 latex:
st.latex("\sum_{i=1}^{n}")
更多的使用如下:
st.title("st.title")
st.header("st.header")
st.subheader("st.subheader")
st.markdown("# markdown一級標(biāo)題")
st.markdown("## markdown二級標(biāo)題")
st.markdown("### markdown三級標(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()
是一個泛型函數(shù),根據(jù)傳入對象不同采取不同的展示方式,比如傳入 pandas.DataFrame
時,st.write(df)
默認(rèn)調(diào)用 st.dataframe()
,傳入 markdown
時,st.write(markdown)
默認(rèn)調(diào)用 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):
僅僅展示代碼,而不執(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,同時執(zhí)行 Code;需要將code放入 st.echo()
內(nèi):
with st.echo():
for i in range(5):
st.write("hello")
3 寫入 data frame
st.write()
與 magic commands 一起構(gòu)成了 Streamlit 的“瑞士軍刀”。幾乎可以將任何內(nèi)容傳遞給 st.write()
: 文本,數(shù)據(jù),Matplotlib圖形,Altair圖表等等。不用擔(dān)心,Streamlit 會弄清楚并以正確的方式呈現(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 使用魔法命令
您也可以編寫應(yīng)用程序而無需調(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 上看到變量或文字值時,它將使用 自動將其寫 st.write()
入您的應(yīng)用程序。有關(guān)更多信息,請參閱 magic commands。
5 繪制圖表和地圖
Streamlit 支持多種流行的數(shù)據(jù)圖表庫,例如 Matplotlib, Altair, deck.gl, and more 等。在本部分中,您將向您的應(yīng)用添加條形圖,折線圖和地圖。
5.1 畫折線圖
您可以使用 st.line_chart()
輕松將折線圖添加到您的應(yīng)用中。我們將使用 Numpy 生成一個隨機樣本,然后將其繪制成圖表。
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])
st.line_chart(chart_data)
效果:
5.2 畫地圖
使用 st.map()
可以在地圖上顯示數(shù)據(jù)點。讓我們使用 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ù)選框顯示/隱藏數(shù)據(jù)
復(fù)選框的一個用例是隱藏或顯示應(yīng)用程序中的特定圖表或部分。st.checkbox()
采用單個參數(shù),即小部件標(biāo)簽。在此示例中,該復(fù)選框用于切換條件語句。
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 使用選擇框進行選擇
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
從序列中進行選擇。您可以編寫所需的選項,也可以通過數(shù)組或數(shù)據(jù)框列。讓我們使用之前創(chuàng)建的 df
數(shù)據(jù)框。
option = st.selectbox(
'您最喜歡哪個數(shù)字?',
df['first column'])
'You selected: ', option
效果:
7 布局您的應(yīng)用
為了使外觀更整潔,可以將小部件移動到側(cè)邊欄(sidebar)中。這將您的應(yīng)用保持在中心位置,而小部件固定在左側(cè)。讓我們來看看如何在應(yīng)用中使用 st.sidebar
。
option = st.sidebar.selectbox(
'您最喜歡哪個數(shù)字?',
df['first column'])
'You selected:', option
效果:
您可以使用以下語法將大部分可放入應(yīng)用程序中的元素放入側(cè)邊欄中:st.sidebar.[element_name]()
。以下是一些顯示其用法的示例:st.sidebar.markdown()
, st.sidebar.slider()
, st.sidebar.line_chart()
。
您還可以使用 st.beta_columns
并排布置小部件,或使用 st.beta_expander
通過隱藏大量內(nè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
。不過請放心,目前也在努力為這些產(chǎn)品增加支持!
8 顯示進度
將長時間運行的計算添加到應(yīng)用程序時,可以使用 st.progress()
實時顯示狀態(tài)。
首先,讓我們導(dǎo)入time
。 然后使用 time.sleep()
方法來模擬長時間運行的計算:
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 免費部署,管理和共享您的應(yīng)用程序。目前,Streamlit 共享僅接受邀請,因此,請 request an invite,我們將盡快與您聯(lián)系!
它可以通過 3 個簡單的步驟工作:
- 將您的應(yīng)用放入公開的 Github 存儲庫中(并確保其具有
requirements.txt
!) - 登錄到 share.streamlit.io
- 點擊 ‘Deploy an app’,然后粘貼您的 GitHub URL
您現(xiàn)在有了一個公開部署的應(yīng)用程序,可以與世界分享。單擊以了解有關(guān) how to use Streamlit sharing 的更多信息。如果您要為團隊尋求私人共享,請查看 Streamlit for Teams。
10 得到幫助
如果您遇到困難,可以:
- 查看 community forum 并發(fā)布問題
- 使用
$ streamlit --help
從命令行快速獲得幫助 - 閱讀更多文檔! 查看:
- Streamlit Cookbook for things like caching and inserting elements out of order
- API reference for examples of every Streamlit command
11 其他
Streamlit 提供即時模式的編程環(huán)境。當(dāng) Streamlit 檢測出源文件變更時,只需點擊 Always rerun 即可。
緩存簡化計算流程。一連串緩存函數(shù)自動創(chuàng)建出高效的計算流程!你可以嘗試以下代碼:https://gist.github.com/treuill...
基本上,該流程涉及加載元數(shù)據(jù)到創(chuàng)建摘要等步驟(load_metadata → create_summary)。該腳本每次運行時,Streamlit 僅需重新計算該流程的子集即可。
Streamlit 適用于 GPU。Streamlit 可以直接訪問機器級原語(如 TensorFlow、PyTorch),并對這些庫進行補充。例如,以下 demo 中,Streamlit 的緩存存儲了整個英偉達 PGGAN。該方法可使用戶在更新左側(cè)滑塊時,app 執(zhí)行近乎即時的推斷。
可使用戶在更新左側(cè)滑塊時,app 執(zhí)行近乎即時的推斷。
Streamlit 是免費開源庫,而非私有 web app。你可以本地部署 Streamlit app,不用提前聯(lián)系我們。你甚至可以在不聯(lián)網(wǎng)的情況下在筆記本電腦上本地運行 Streamlit。此外,現(xiàn)有項目也可以漸進地使用 Streamlit。
以上只是 Streamlit 功能的冰山一角而已。它最令人興奮的一點是,這些原語可以輕松組成復(fù)雜 app,但看起來卻只是簡單腳本。這就要涉及架構(gòu)運作原理和功能了,本文暫不談及。