Python實(shí)現(xiàn)構(gòu)建一個儀表板的示例代碼
這將為我們的團(tuán)隊(duì)節(jié)省每天重復(fù)的數(shù)據(jù)處理時間......
簡介
如果你目前在一個數(shù)據(jù)或商業(yè)智能團(tuán)隊(duì)工作,你的任務(wù)之一可能是制作一些每日、每周或每月的報告。
雖然獲得這些報告并不困難,但還是需要花費(fèi)不少時間。我們的寶貴時間應(yīng)該花在更困難的任務(wù)上,如訓(xùn)練神經(jīng)網(wǎng)絡(luò)或建立數(shù)據(jù)管道架構(gòu)。
因此,對于這些平凡的重復(fù)性報告,節(jié)省我們時間的最好方法是建立一個網(wǎng)絡(luò)應(yīng)用程序,其他團(tuán)隊(duì)可以自己訪問和下載報告。
我說的不是Tableau或PowerBI這樣的付費(fèi)工具(如果公司預(yù)算充足的話,你可以使用它們)。有一些高級的網(wǎng)絡(luò)框架,比如Flask和Django,通常用于建立一個正常運(yùn)作的網(wǎng)站。
但是,對于一個快速的網(wǎng)絡(luò)儀表盤來報告指標(biāo)和數(shù)字,你可以考慮使用Streamlit,這是一個相對較新的網(wǎng)絡(luò)框架,是為ML從業(yè)者和數(shù)據(jù)科學(xué)團(tuán)隊(duì)建立的。它使用起來非常簡單和直觀。
內(nèi)容
我將通過使用一個群組分析的例子來指導(dǎo)你如何構(gòu)建和部署它。
對于每個部分,我將介紹一個代碼模板(你可以在你自己的項(xiàng)目中重新使用)和我的代碼(用于本文中使用的隊(duì)列分析例子)。
- 創(chuàng)建一個Python文件
- 在終端上運(yùn)行該文件,在本地機(jī)器上看到儀表板
- 部署給其他團(tuán)隊(duì)使用
1.創(chuàng)建一個Python文件
我們必須創(chuàng)建一個Python文件,以后我們可以從終端調(diào)用該文件,在瀏覽器上顯示結(jié)果。
你可以給這個文件取任何你想要的名字。這里我把它叫做cohort-demo.py
。
代碼模板
#?這些數(shù)據(jù)可以在公眾號后臺回復(fù)【云朵君】,聯(lián)系作者獲取。 #?1.導(dǎo)入必要的庫 import?pandas?as?pd import?numpy?as?np import?streamlit?as?st #?2.設(shè)置頁面配置 st.set_page_config( ????page_title="This?is?my?title",??#?頁面的標(biāo)題 ????page_icon="??",??????????????????#?favicon ????layout="wide", ) #?3.定義你的項(xiàng)目中使用的所有函數(shù) # 4.對于每一個函數(shù),在其前面添加"@st.experimental_memo"。這就是 #?來記憶每個函數(shù)的執(zhí)行。這將使應(yīng)用程序運(yùn)行得更快。 #?特別是當(dāng)用戶與儀表盤上的一些元素互動時 @st.experimental_memo def?function(x): ????return?y
組群分析
import?pandas?as?pd import?numpy?as?np? import?matplotlib.pyplot?as?plt? import?seaborn?as?sns import?matplotlib?as?mpl? from?datetime?import?date,?datetime import?streamlit?as?st?? st.set_page_config( ????page_title="Cohorts?Dashboard", ????page_icon="??", ????layout="wide", ) @st.experimental_memo def?purchase_rate(customer_id): ????purchase_rate?=?[1] ????counter?=?1 ????for?i?in?range(1,len(customer_id)): ????????if?customer_id[i]?!=?customer_id[i-1]: ????????????purchase_rate.append(1) ????????????counter?=?1 ????????else: ????????????counter?+=?1 ????????????purchase_rate.append(counter) ????return?purchase_rate @st.experimental_memo def?join_date(date,?purchase_rate): ????join_date?=?list(range(len(date))) ????for?i?in?range(len(purchase_rate)): ????????if?purchase_rate[i]?==?1: ????????????join_date[i]?=?date[i] ????????else: ????????????join_date[i]?=?join_date[i-1] ????return?join_date ?? #?我沒有在這里定義所有的函數(shù),因?yàn)檫@將延長文章的篇幅。 #?我將在文章的最后提供完整的代碼。
現(xiàn)在我們建立第一個屏幕,如下所示。這將首先讓用戶上傳文件,然后運(yùn)行以產(chǎn)生輸出。
代碼模板:你可以用任何名字替換 "my_company
"。
st.title("Cohort?Interactive?Dashboard?Demo") st.markdown(""" This?webapp?performs?cohort?analysis?of?my_company?data! *?**Python?libraries?used:**?base64,?pandas,?streamlit,?numpy,?matplotlib,?seaborn *?**Data?source:**?[Shopify](https://company_name.myshopify.com/admin) *?You?need?to?select?the?data?file?first?to?proceed. """) uploaded_file?=?st.file_uploader("Choose?a?file")?#?來上傳文件
一旦用戶上傳了一個文件,下一個屏幕將看起來像這樣。
為了建立這個,我們需要。
- 選擇群組的類型:這是一個單一的選擇。它可以是獨(dú)特的客戶保留率,或百分比或AOV(平均訂單價值)方面的。
- 選擇隊(duì)列:這是多選擇。人們可以看一個特定的隊(duì)列或更多。
代碼模板
If?uploaded_file?is?not?None:#?這很重要,因?yàn)闆]有這個。 ?????????????????????????????#?當(dāng)沒有上傳的文件時,會出現(xiàn) ?????????????????????????????#?一個錯誤,因?yàn)閐f沒有被定義.... ??df?=?pd.read_csv(upload_file)?#?讀取該文件 ??df_processed?=?process_df(df)?#?清潔數(shù)據(jù) ?? ??#?儀表盤標(biāo)題 ??st.header("Live?Dashboard") ??#?過濾器 ??first_filter?=?st.selectbox('Select?first?filter',['Option?1',?'Option?2',?'Option?3]) ????second_filter?=?st.multiselect('Select?second?filter',?['Option?1','Option?2','Option?3','Option?4']) ????output?=?display_function(data_input,first_filter,second_filter) ????st.dataframe(output) ????st.download_button(label='Download?csv',?data=output.to_csv(),?mime='text/csv')?#?來下載該文件
組群分析
if?uploaded_file?is?not?None: ????df?=?pd.read_csv(uploaded_file) ????df_processed?=?process_df(df) ????df_cohorts?=?cohort_numbers(df_processed) ????cohorts?=?cohort_percent(df_cohorts) ???? ????#?通過使用f-strings動態(tài)標(biāo)題 ????st.header(f"Live?{cohorts.index[0]}?to?{cohorts.index[-1]}?Cohort?Dashboard") ???? ????#?過濾器 ????first_filter=?st.selectbox('Select?type?of?cohort',['By?unique?customers',?'By?percentage',?'By?AOV']) ????second_filter?=?st.multiselect('Select?cohort',?list(cohorts.index)) ????output?=?select_which_table_to_draw(df_processed,first_filter,second_filter) ????st.dataframe(output) ????st.download_button(label='Download?csv',?data=output.to_csv(),?mime='text/csv')
最后建立3個指標(biāo)
代碼模板
kpi1,?kpi2,?kpi3?=?st.columns(3)?#?創(chuàng)建三個占位符 if?uploaded_file?is?not?None: ???? ????aov?=?np.mean(df['total_sales']) ????aov_goal?=?95.00 ????kpi1.metric( ????????#?給這個指標(biāo)貼上標(biāo)簽 ????????label="AOV",? ????????#?計(jì)算度量值 ????????value=f"$?{round(aov,2)}", ????????#?計(jì)算與目標(biāo)相比的變化(向上/向下箭頭) ????????delta=f"-${round(aov_goal-aov,2)}"?if?aov_goal>aov?else?f"${round(aov-aov_goal,2)}", ????) ????nc?=?np.mean(df.loc[df['customer_type']=='First-time'].groupby(['day']).count()['customer_id']) ????nc_goal?=?30 ????kpi2.metric( ????????label="New?customers/day", ????????value=int(nc), ????????delta=f"-{round((nc_goal-nc)/nc_goal*100,2)}%"?if?nc_goal>nc?else?f"{round((nc?-?nc_goal)/nc_goal*100,0)}%", ????) ????rc?=?np.mean(df.loc[df['customer_type']=='Returning'].groupby(['day']).count()['customer_id']) ????rc_goal?=?250 ????kpi3.metric( ????????label="Returning?customers/day", ????????value=?int(rc), ????????delta=f"-{round((rc_goal?-?rc)/rc_goal*100,2)}%"?if?rc_goal>rc?else?f"{round((rc-rc_goal)/rc_goal*100,2)}%" ????)
2.在終端上運(yùn)行該文件,在本地機(jī)器上顯示
streamlit?run?cohort-demo.py
在右上角,你會看到一個選項(xiàng),即每當(dāng)你編輯cohort-demo.py時總是運(yùn)行。
3.在Heroku上部署儀表板
首先在你的GitHub賬戶上創(chuàng)建GitHub倉庫
創(chuàng)建requirements.txt、setup.sh和Procfile
requirements.txt(這是為了添加你在cohort-demo.py中使用的所有必要庫。)
#只是簡單地列出所有的庫。你也可以包括版本
pandas
numpy
streamlit
matplotlib
seaborn
datetime
plotly
setup.sh
#只要復(fù)制和粘貼這個 mkdir?-p?~/.streamlit/ echo?"\ [server]\n\ headless?=?true\n\ port?=?$PORT\n enableCORS?=?false\n \n\ "?>?~/.streamlit/config.toml
Procfile
web: sh setup.sh && streamlit run cohort-demo.py
- 將
cohort-demo.py
上傳至資源庫 - 打開Heroku(你應(yīng)該在Heroku上創(chuàng)建一個賬戶)。
在右上角,點(diǎn)擊 "Create new app
"
在部署方式下,選擇GitHub
然后將GitHub賬戶連接到Heroku。然后輸入倉庫的名稱(在本例中,它是cohort_analysis_demo)。
一旦連接,在手動部署下,點(diǎn)擊部署分支
到這里我們只需要等待它的部署。然后就完成了!URL鏈接將被創(chuàng)建。
剛剛將儀表盤部署到生產(chǎn)中,團(tuán)隊(duì)成員現(xiàn)在可以自己訪問和分析數(shù)據(jù)。
他們可以簡單地上傳任何符合你定義的格式的數(shù)據(jù)集。即本例中的客戶交易數(shù)據(jù)。
最終結(jié)果
總結(jié)
希望能夠幫助到大家,僅作為一個demo參考。其實(shí)Streamlit可以做很多很酷的事情,如果你像我一樣,在不了解Nodejs、Flask和Django等網(wǎng)絡(luò)開發(fā)框架的情況下,可以使用它來快速創(chuàng)建一個儀表盤。
雖然如此,我仍然相信了解JS/HTML/CSS和軟件工程概念會更有優(yōu)勢。所以我確實(shí)建議你花空閑時間學(xué)習(xí)這些技術(shù)。
到此這篇關(guān)于Python實(shí)現(xiàn)構(gòu)建一個儀表板的示例代碼的文章就介紹到這了,更多相關(guān)Python構(gòu)建儀表板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談在JupyterNotebook下導(dǎo)入自己的模塊的問題
這篇文章主要介紹了淺談在JupyterNotebook下導(dǎo)入自己的模塊的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04python實(shí)現(xiàn)快速文件格式批量轉(zhuǎn)換的方法
這篇文章主要介紹了python實(shí)現(xiàn)快速文件格式批量轉(zhuǎn)換的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10tensorflow入門之訓(xùn)練簡單的神經(jīng)網(wǎng)絡(luò)方法
本篇文章主要介紹了tensorflow入門之訓(xùn)練簡單的神經(jīng)網(wǎng)絡(luò)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02Python sqlparse 解析庫的基礎(chǔ)使用過程解析
sqlparse 是一個 Python 庫,是一個用于 Python 的非驗(yàn)證 SQL 解析器, 用于解析 SQL 語句并提供一個簡單的 API 來訪問解析后的 SQL 結(jié)構(gòu),這篇文章主要介紹了Python sqlparse 解析庫的基礎(chǔ)使用,需要的朋友可以參考下2024-08-08keras小技巧——獲取某一個網(wǎng)絡(luò)層的輸出方式
這篇文章主要介紹了keras小技巧——獲取某一個網(wǎng)絡(luò)層的輸出方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05python 輸入字符串生成所有有效的IP地址(LeetCode 93號題)
這篇文章主要介紹了python 生成所有有效的IP地址的方法,幫助大家解答題目,學(xué)習(xí)python,感興趣的朋友可以了解下2020-10-10