首頁>技術>

當你做了一個機器學習模型, 你想讓人們不用啟動Jupyter筆記本就能使用它,你應該怎麼做?你可以使用Flask來為你的模型服務。Flask是很好的輕量級網路框架,但它需要了解路由和其他網路事物。Django是一個全方位服務的框架,但學習曲線比flask更陡峭。如果你只是想盡快的為一個模型提供服務,那你應該使用什麼呢?

讓Streamlit來拯救你! 有了Streamlit,你可以在幾分鐘內服務一個機器學習模型,而無需學習Javascript框架。

Streamlit是一個新的開源庫,它使用Python,並與常見的資料科學庫進行了很好的整合。它能很好地處理互動性和視覺化。

STREAMLIT

用聯合創始人Adrien Treuille的話來說,Streamlit應用是Python指令碼,它將widgets視為變數,可以重用資料和計算,並且可以在實時編碼環境中開發。Streamlit非常適合快速開發!快速入門。

開始使用Streamlit就像這樣簡單。

1. 在你的Python虛擬環境中 pip install -U streamlit pandas.

2. 在你的文字編輯器中輸入以下內容,並將檔案儲存為my_app.py。

import streamlit as st

import pandas as pd

df = pd.DataFrame(dict(a=[1, 2, 4], b=[3, 1, 7]))

st.line_chart(df)

3. 在終端中執行 streamlit run my_app.py。

編寫程式碼然後實時看到輸出結果

Wow!你已經建立了一個使用者可以互動和下載的圖表。你已經建立了一個使用者可以互動和下載的圖表!

折線圖

讓我們深入了解一下什麼是Streamlit,什麼不是Streamlit。

深受使用者喜愛年輕人有觀點快速開始使用純Python環境是視覺化的理想選擇良好的互動性

深受使用者喜愛

我這裡只是有一些軼事,但是通過閱讀Streamlit社群論壇上的評論和GitHub上的問題,你會發現使用者對Streamlit真的很興奮。它解決了資料科學家的一個痛點。

年輕

Streamlit於2019年秋季正式推出,並快速迭代。該文庫由一家矽谷風投創業公司支援,在推出時募集了600萬美元的種子資金。

有觀點

Streamlit會給你一個單頁應用,並提供一個可選的側欄。你可以垂直地新增一個又一個元素。

Streamlit伺服器每次都會從上到下重新執行你的指令碼。沒有回撥。Streamlit允許你快取函式,這樣你只需在必要時重新執行程式碼和重新載入資料。

快速開始使用

如上所述,Streamlit附帶電池。它能很好地與Python資料科學堆疊:pandas、NumPy、scikit-learn、TensorFlow和PyTorch配合使用。

純Python環境

如果Javascript框架和模型-檢視-控制器正規化(MVC)不是你的菜,Streamlit可以幫你解決。你只需要Python函式、控制流和裝飾器。如果你想調整格式,還可以加入一些Markdown和HTML/CSS。

是視覺化的理想選擇

Streamlit預設使用了Altair的繪圖方式,它可以很容易地改變其他視覺化選項,如Matplotlib、Plotly、Bokeh、Holoviews、Graphviz和deck.gl.互動性好"。它可以很容易地改變到其他視覺化選項,如Matplotlib、Plotly、Bokeh、Holoviews、Graphviz和deck.gl。

適合互動性

內建的Streamlit功能使其很容易新增複選框、下拉選單、文字框和其他互動式功能。Streamlit將這些小元件視為變數,你稍後就會看到。

現在你已經看到了Streamlit是什麼,讓我們看看它不是什麼。

Streamlit不是什麼(截至v0.60.0)一個完整的web框架。理想的造型控制有利於管理會話狀態易於部署不是一個完整的網路框架

Streamlit不是一個功能齊全的Web框架

沒有路由器,所以你不能有多個頁面。沒有認證。你不能新增javascript,所以彈出視窗不會發生。

不是理想的風格控制

改變CSS並不直接。現在,一些CSS和Javascript定製是黑客,有些是不可能的。並排元素還不能使用。

不利於管理會話狀態

管理會話狀態是可能的--但不容易。Streamlit正在研究一個解決方案。這是一個原型。不需要考慮狀態的好處是,構建一個不需要儲存狀態的應用很容易。缺點是,構建一個需要狀態的應用很麻煩。☹️

不易部署

要部署你的Streamlit應用並不簡單。使用Docker和Kubernetes是可行的,但許多資料科學家並不熟悉這些技術(我寫了一本關於Docker入門的書,試圖在這裡提供幫助,Kubernetes的介紹在這裡)。

未來

好訊息是,所有這些方面的改進都在進行中! 這是2020年的路線圖。請注意,一鍵部署是Streamlit公司賺錢計劃的一個關鍵部分。

好了,現在你有了鋪墊,讓我們來看看如何使用Streamlit吧! ⚡️

使用流光

要執行下面的程式碼,將Streamlit安裝到一個有Python、pandas、NumPy和Plotly的虛擬環境中。在寫這篇文章的時候,Streamlit只在PyPI上,所以你需要用pip安裝它。

我建議你把你的網路瀏覽器和你的程式碼編輯器並排設定,以獲得最佳的開發體驗。

你可能需要重新整理你的網頁,或者偶爾重啟你的Streamlit伺服器,如果電線真的被扭曲了,但是一般來說,應該可以正常工作。

如果你被卡住了,Streamlit的文件是非常清楚的。這裡是社群論壇。

讓我們來看看Streamlit的10個關鍵功能。

10 關鍵功能

標題案文Markdown資料框架視覺化化互動小部件CSS的修改媒介快取雜項特徵

我們先來看看標題。

標題

在安裝了Streamilt和Streamlit伺服器服務於你的檔案(streamlit run my_app.py)後,在你的文字編輯器中輸入下面的程式碼,然後在你的網路瀏覽器中觀看魔法的發生。

import streamlit as st

st.title("The Title for my App")

st.header("A Header")

st.subheader("A Subheader")

如果你沒有看到任何東西,從終端複製網路URL到網頁瀏覽器視窗。或者如果你的Streamlit伺服器已經在執行,點選瀏覽器視窗頂部的Rerun按鈕。

三級標題= h1, h2, h3

使用瀏覽器檢查工具,你可以驗證這些函式是否分別建立了 h1、h2 和 h3 HTML 標籤。如果你需要HTML入門,我建議你去W3學校看看。

文字

用st.write()輸出文字。

st.write("Some text to output")

如果你不需要特殊的功能,也可以跳過st.write(),只單獨輸入字串。

"Some text to output"

和Jupyter筆記本一樣,一個值或一個變數名本身就會輸出到螢幕上。與Jupyter筆記本不同,方法呼叫的結果不會輸出任何東西。你必須將返回值儲存為變數才能顯示。

例如,以下內容不會顯示任何內容。

("Some text to output").upper()

而這樣就可以:

my_uppercased_string = ("Some text to output").upper()

my_uppercased_string

需要重複的是,每次你做出改變時,Streamlit都會從上到下重新執行你的程式碼。當你探索Streamlit的時候,你會發現你不希望所有的程式碼都顯示出來。對程式碼塊進行註釋以節省時間和螢幕空間。

Markdown

你可以使用Markdown來格式化你的文字,並新增像這樣的表情符號。

st.markdown("_This_ __is__ *__markdown__*. ")

顯示出來是這樣的:

你也可以使用Markdown來新增連結,像這樣:

st.markdown('Learn Python [here](https://memorablepython.com)')

哇!一個連結出現了。

我們稍後將探索其他的Markdown使用案例。

DataFrames

Streamlit是以資料科學家為中心構建的。你可以像這樣直接輸出pandas DataFrame的內容。

df = pd.DataFrame(dict(a=[1, 2, 4], b=[3, 1, 7]))

df

列是可以由使用者自動排序的。

如果你想增強風格,請明確使用st.dataframe()。例如,你可以像這樣突出顯示每列中的最小值。

st.dataframe(df.style.highlight_min(axis=0))

另外,你也可以使用st.write()來實現同樣的結果,就像這樣:

st.write(df.style.highlight_min(axis=0))

st.write()檢測傳遞給它的物件型別,並進行相應的調整。

現在讓我們來看看Streamlit可以用plots做什麼。

視覺化

Streamlit使視覺化變得輕而易舉。

它為互動式的線圖、區域圖和條形圖提供了預設的函式,你在上面看到了st.line_chart()。你已經看到了上面的st.line_chart(),st.bar_chart()和st.area_chart()也是如此。它們都使用了Altair繪相簿。

還有一些其他的頂層函式可以包裹繪相簿,比如Matplotlib的st.pyplot()和Mapbox GL的st.map()。下面是建立地圖的程式碼,採用的是文件中的程式碼。

map_data = pd.DataFrame(

np.random.randn(1000, 2) / [50, 50] + [38.9, -77],

columns=['lat', 'lon']

)

st.map(map_data)

這是輸出的結果:

st.map()的輸出結果

另外,你也可以使用你喜歡的Python繪相簿。例如,這裡有一個從Plotly文件中採用的地理視覺化。

with st.spinner("Component is loading"):

fig = px.scatter_geo(

df_geo, # just making it take some time load

title='Gapminder Data',

locations="iso_alpha",

color="continent",

hover_name="country",

size="pop",

animation_frame="year",

projection="robinson",

)

fig

請注意,我們添加了一個st.spinner()上下文塊,以便在內容載入時顯示一條訊息。

Streamlit的繪圖是非常酷的

現在讓我們來看看Streamlit互動式 widgets的核心的互動式功能。

Streamlit使用預定義的函式來建立互動式widget。

下面是一個選擇部件的例子。

選擇widget的輸出結果

建立widget和變數的程式碼只有一行!

transport = st.selectbox(label=”Select Transportation”, options=[“car”, “bike”, “walk”])

這裡有七個Streamlit函式,你可以用來讓使用者選擇一些東西。我包含了所需的引數和每個widget的描述。

radio(label='Choose', options=['rock', 'classical', 'jazz']) — 單選按鈕

checkbox(label='Check the box') — 切換一個複選框

selectbox(label='Choose one', options=['walk', 'bike']) — 從下拉選單中選擇一個選項

multiselect(label='Choose as many as you like', options=['walk', 'bike']) — 從下拉選單中選擇多個選項

slider(label='Slide the bar') — 從滑動條中選擇一個值

beta_color_picker(label='Pick a color') — 選擇一個顏色

這裡有六個功能,供使用者完成輸入和上傳:

number_input(label='Input a number') — 輸入一個數字

text_input(label='Enter text') — 輸入文字

text_area(label='Write an essay') — 輸入多行文字

date_input(label='Input a date') — 輸入一個日期

time_input(label='Input a time') — 輸入一個時間

file_uploader(label='Upload a .jpg file') — 上傳一個文件

只要給互動式函式傳遞一個使用者會看到的標籤。將返回值儲存為一個變數,然後用它做一些事情。就這麼簡單

讓我們來看看如何使用這些widget。

使用widget

widget是可定製的,並帶有合理的預設值。例如,這裡是st.date_input()小元件的程式碼。

date = st.date_input(label='Input a date')

date

結果是:

你可以傳遞date_input一個預設值,一個最小值,或者一個最大值。現在,date_input的預設值分別是今天、2001年1月1日和今天加10年。

請注意,不允許有重複的小元件。每個小元件必須通過你傳遞給它的引數來區分,否則你會得到一個錯誤。如果需要,你可以傳遞一個關鍵引數來確保唯一性。

我不會在這裡演示所有的小元件型別,但讓我們看看一些常見的模式。

你經常會使用一個帶有if語句的複選框。下面是如何根據使用者是否選中了一個框來顯示或隱藏DataFrame。

display_df = st.checkbox(label='Want to see the data?')

if display_df:

df

輸出結果是這樣的:

帶有控制流程的複選框,可顯示資料框

像這樣用st.sidebar新增任何一個widget到側邊欄:

st.sidebar.radio(

label="Choose wisely",

options=["Laser Tag", "Ax Throwing", "Trampoline Park"]

)

現在,一個可擴充套件的側欄將容納widget。

雖然大多數小工具已經存在了一段時間,但顏色選擇器小工具還處於測試階段,可能會發生變化。下面是程式碼。

user_color = st.beta_color_picker("Pick a color")

user_color

Streamlit widgets是使該庫如此強大的一個重要部分。我鼓勵你玩玩它們,看看它們有多酷。

CSS修改

在Streamlit中修改CSS是可能的,但並不優雅。你可以通過使用st.markdown("<style> some css goes here </style>")來修改CSS。

這裡有一個基本的例子來改變頁面中某一部分文字的顏色。

st.markdown(

'''

<span style="color:blue">

Print it in blue. <br />

Please.

</span>

''',

unsafe_allow_html=True

)

注意多行CSS使用三引號。

改變文字顏色

你必須使用st.markdown()和關鍵字引數unsafe_allow_html=True來訪問底層CSS。

互動式CSS

讓我們看看顏色選擇器小部件如何讓使用者改變頁面的背景。下面是程式碼:

user_color = st.beta_color_picker("Pick a color")

user_color

if user_color != "#000000":

st.markdown(

f"<style> body{{ background-color: {user_color};}}</style>",

unsafe_allow_html=True

)

請注意,由於字串插值的原因,需要用雙大括號{{ }}來轉義。下面是顏色選擇器的工作原理。

Bootstrap

Streamlit使用Bootstrap進行樣式設計,所以你可以訪問Bootstrap類,如按鈕和警告。例如,下面是如何顯示一個成功的badge:

用Bootstrap生成的Badge

你可以嘗試用Bootstrap做一個網格佈局,但是Streamlit小部件不會尊重佈局,所以這不是一個好的選擇。

hide_st_style = """

<style>

#MainMenu {visibility: hidden;}

footer {visibility: hidden;}

</style>

"""

st.markdown(hide_st_style, unsafe_allow_html=True)

媒體

讓我們看看如何在你的Streamlit應用中顯示圖片、視訊和音訊檔案。

圖片

你需要匯入PIL庫,用st.image()來顯示圖片。這裡的程式碼可以用來從使用者那裡獲取圖片並顯示它。

from PIL import Image

img = []

img = st.file_uploader(label='input', type=['png', 'jpg'])

if img:

image = Image.open(img)

st.image(image, caption='Your Image')

如果需要,您可以指定寬度和BGR頻道。

視訊

用st.video()播放一個視訊。你可以播放你自己的視訊或YouTube上的視訊。下面是你如何播放一個45秒開始的YouTube視訊。

st.video(

'https://www.youtube.com/watch?v=AqAJLh9wuZ0',

start_time=45

)

預設的視訊格式是mp4,但你可以指定其他格式。

音訊格式

用st.audio()播放一個音訊檔案。你可以指定除預設wav檔案型別以外的其他型別,並傳遞一個開始時間。

快取可以為您的應用使用者在第二次載入您的應用時節省時間。快取允許您的應用程式避免重新載入相同的檔案和重做相同的計算。

使用@st.cache裝飾器來新增快取。這裡是對Streamlit快取工作原理的基本解釋。

Streamlit會檢查以下四件事情:

你呼叫函式時的輸入引數

函式中使用的任何外部變數的值。

職能的主體

快取函式內部使用的任何函式的主體。

如果這是Streamlit第一次看到這四個元件的確切值,並且是以這個確切的組合和順序,它就會執行這個函式,並將結果儲存在本地快取中。然後,下次呼叫快取函式時,如果這些元件都沒有改變,Streamlit將完全跳過執行函式,而是返回之前儲存在快取中的輸出。

快取可以幫助加快你的應用程式的感覺,但它也可能是棘手的,有時會出現意想不到的行為。

雜項功能

Streamlit使使用者可以很容易地從漢堡包選單中建立一個螢幕錄製。錄製螢幕廣播選項為使用者提供了一系列的螢幕選項來錄製。這對協作很有幫助。

你可以輕鬆地顯示你的Streamlit應用背後的程式碼。只要把你想顯示的程式碼放在st.echo()上下文塊中,就像這樣。

with st.echo():

def my_function():

return None

輸出的是格式很好的程式碼,在使用者的螢幕上看起來是這樣的:

或者,如果你想顯示格式化的程式碼,但不執行它,使用st.code(),像這樣:

st.code(

"""

my_var = f"testing my code {1 + 2} times"

"""

)

應用沒有執行的程式碼

結論

Streamlit可以讓你快速將機器學習模型變成一個基本的應用。它充滿了有用的功能,並有一個路線圖來克服它目前的許多限制。我認為它將成為資料科學家工具箱中一個受歡迎的自助服務工具。

我希望你覺得這篇關於Streamlit的介紹對你有幫助。如果你覺得有用,請把它分享出去,這樣其他人也能找到它。

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 《前端會客廳》對話winter和尤雨溪,深度探尋Vue3設計思想(上)