掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
如果你目前在一個(gè)數(shù)據(jù)或商業(yè)智能團(tuán)隊(duì)工作,你的任務(wù)之一可能是制作一些每日、每周或每月的報(bào)告。

創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元金林做網(wǎng)站,已為上家服務(wù),為金林各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
雖然獲得這些報(bào)告并不困難,但還是需要花費(fèi)不少時(shí)間。我們的寶貴時(shí)間應(yīng)該花在更困難的任務(wù)上,如訓(xùn)練神經(jīng)網(wǎng)絡(luò)或建立數(shù)據(jù)管道架構(gòu)。
因此,對(duì)于這些平凡的重復(fù)性報(bào)告,節(jié)省我們時(shí)間的最好方法是建立一個(gè)網(wǎng)絡(luò)應(yīng)用程序,其他團(tuán)隊(duì)可以自己訪問和下載報(bào)告。
我說的不是Tableau或PowerBI這樣的付費(fèi)工具(如果公司預(yù)算充足的話,你可以使用它們)。有一些高級(jí)的網(wǎng)絡(luò)框架,比如Flask和Django,通常用于建立一個(gè)正常運(yùn)作的網(wǎng)站。
但是,對(duì)于一個(gè)快速的網(wǎng)絡(luò)儀表盤來報(bào)告指標(biāo)和數(shù)字,你可以考慮使用Streamlit,這是一個(gè)相對(duì)較新的網(wǎng)絡(luò)框架,是為ML從業(yè)者和數(shù)據(jù)科學(xué)團(tuán)隊(duì)建立的。它使用起來非常簡(jiǎn)單和直觀。
我將通過使用一個(gè)群組分析的例子來指導(dǎo)你如何構(gòu)建和部署它。
對(duì)于每個(gè)部分,我將介紹一個(gè)代碼模板(你可以在你自己的項(xiàng)目中重新使用)和我的代碼(用于本文中使用的隊(duì)列分析例子)。
我們必須創(chuàng)建一個(gè)Python文件,以后我們可以從終端調(diào)用該文件,在瀏覽器上顯示結(jié)果。
你可以給這個(gè)文件取任何你想要的名字。這里我把它叫做cohort-demo.py。
# 這些數(shù)據(jù)可以在公眾號(hào)后臺(tái)回復(fù)【云朵君】,聯(lián)系作者獲取。
# 1.導(dǎo)入必要的庫(kù)
import pandas as pd
import numpy as np
import streamlit as st
# 2.設(shè)置頁(yè)面配置
st.set_page_config(
page_title="This is my title", # 頁(yè)面的標(biāo)題
page_icnotallow="", # favicon
layout="wide",
)
# 3.定義你的項(xiàng)目中使用的所有函數(shù)
# 4.對(duì)于每一個(gè)函數(shù),在其前面添加"@st.experimental_memo"。這就是
# 來記憶每個(gè)函數(shù)的執(zhí)行。這將使應(yīng)用程序運(yùn)行得更快。
# 特別是當(dāng)用戶與儀表盤上的一些元素互動(dòng)時(shí)
@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_icnotallow="",
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)檫@將延長(zhǎng)文章的篇幅。
# 我將在文章的最后提供完整的代碼。
現(xiàn)在我們建立第一個(gè)屏幕,如下所示。這將首先讓用戶上傳文件,然后運(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") # 來上傳文件一旦用戶上傳了一個(gè)文件,下一個(gè)屏幕將看起來像這樣。
為了建立這個(gè),我們需要。
If uploaded_file is not None:# 這很重要,因?yàn)闆]有這個(gè)。
# 當(dāng)沒有上傳的文件時(shí),會(huì)出現(xiàn)
# 一個(gè)錯(cuò)誤,因?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動(dòng)態(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個(gè)指標(biāo)
kpi1, kpi2, kpi3 = st.columns(3) # 創(chuàng)建三個(gè)占位符
if uploaded_file is not None:
aov = np.mean(df['total_sales'])
aov_goal = 95.00
kpi1.metric(
# 給這個(gè)指標(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)}%"
)
streamlit run cohort-demo.py
在右上角,你會(huì)看到一個(gè)選項(xiàng),即每當(dāng)你編輯cohort-demo.py時(shí)總是運(yùn)行。
requirements.txt(這是為了添加你在cohort-demo.py中使用的所有必要庫(kù)。)
#只是簡(jiǎn)單地列出所有的庫(kù)。你也可以包括版本
pandas
numpy
streamlit
matplotlib
seaborn
datetime
plotly
setup.sh
#只要復(fù)制和粘貼這個(gè)
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
在右上角,點(diǎn)擊 "Create new app"
在部署方式下,選擇GitHub
然后將GitHub賬戶連接到Heroku。然后輸入倉(cāng)庫(kù)的名稱(在本例中,它是cohort_analysis_demo)。
一旦連接,在手動(dòng)部署下,點(diǎn)擊部署分支
到這里我們只需要等待它的部署。然后就完成了!URL鏈接將被創(chuàng)建。
剛剛將儀表盤部署到生產(chǎn)中,團(tuán)隊(duì)成員現(xiàn)在可以自己訪問和分析數(shù)據(jù)。
他們可以簡(jiǎn)單地上傳任何符合你定義的格式的數(shù)據(jù)集。即本例中的客戶交易數(shù)據(jù)。
希望能夠幫助到大家,僅作為一個(gè)demo參考。其實(shí)Streamlit可以做很多很酷的事情,如果你像我一樣,在不了解Nodejs、Flask和Django等網(wǎng)絡(luò)開發(fā)框架的情況下,可以使用它來快速創(chuàng)建一個(gè)儀表盤。
雖然如此,我仍然相信了解JS/HTML/CSS和軟件工程概念會(huì)更有優(yōu)勢(shì)。所以我確實(shí)建議你花空閑時(shí)間學(xué)習(xí)這些技術(shù)。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流