Python實現構建一個儀表板的示例代碼

這將為我們的團隊節省每天重復的數據處理時間……

簡介

如果你目前在一個數據或商業智能團隊工作,你的任務之一可能是制作一些每日、每周或每月的報告。

雖然獲得這些報告並不困難,但還是需要花費不少時間。我們的寶貴時間應該花在更困難的任務上,如訓練神經網絡或建立數據管道架構。

因此,對於這些平凡的重復性報告,節省我們時間的最好方法是建立一個網絡應用程序,其他團隊可以自己訪問和下載報告。

我說的不是Tableau或PowerBI這樣的付費工具(如果公司預算充足的話,你可以使用它們)。有一些高級的網絡框架,比如Flask和Django,通常用於建立一個正常運作的網站。

但是,對於一個快速的網絡儀表盤來報告指標和數字,你可以考慮使用Streamlit,這是一個相對較新的網絡框架,是為ML從業者和數據科學團隊建立的。它使用起來非常簡單和直觀。

內容

我將通過使用一個群組分析的例子來指導你如何構建部署它。

對於每個部分,我將介紹一個代碼模板(你可以在你自己的項目中重新使用)和我的代碼(用於本文中使用的隊列分析例子)。

  • 創建一個Python文件
  • 在終端上運行該文件,在本地機器上看到儀表板
  • 部署給其他團隊使用

1.創建一個Python文件

我們必須創建一個Python文件,以後我們可以從終端調用該文件,在瀏覽器上顯示結果。

你可以給這個文件取任何你想要的名字。這裡我把它叫做cohort-demo.py

代碼模板

# 這些數據可以在公眾號後臺回復【雲朵君】,聯系作者獲取。
# 1.導入必要的庫
import pandas as pd
import numpy as np
import streamlit as st

# 2.設置頁面配置
st.set_page_config(
    page_title="This is my title",  # 頁面的標題
    page_icon="📈",                  # favicon
    layout="wide",
)

# 3.定義你的項目中使用的所有函數
# 4.對於每一個函數,在其前面添加"@st.experimental_memo"。這就是
# 來記憶每個函數的執行。這將使應用程序運行得更快。
# 特別是當用戶與儀表盤上的一些元素互動時

@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
  
# 我沒有在這裡定義所有的函數,因為這將延長文章的篇幅。
# 我將在文章的最後提供完整的代碼。

現在我們建立第一個屏幕,如下所示。這將首先讓用戶上傳文件,然後運行以產生輸出。

代碼模板:你可以用任何名字替換 "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") # 來上傳文件

一旦用戶上傳瞭一個文件,下一個屏幕將看起來像這樣。

為瞭建立這個,我們需要。

  • 選擇群組的類型:這是一個單一的選擇。它可以是獨特的客戶保留率,或百分比或AOV(平均訂單價值)方面的。
  • 選擇隊列:這是多選擇。人們可以看一個特定的隊列或更多。

代碼模板

If uploaded_file is not None:# 這很重要,因為沒有這個。
                             # 當沒有上傳的文件時,會出現
                             # 一個錯誤,因為df沒有被定義....
  df = pd.read_csv(upload_file) # 讀取該文件
  df_processed = process_df(df) # 清潔數據
  
  # 儀表盤標題
  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動態標題
    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個指標

代碼模板

kpi1, kpi2, kpi3 = st.columns(3) # 創建三個占位符
if uploaded_file is not None:
    
    aov = np.mean(df['total_sales'])
    aov_goal = 95.00
    kpi1.metric(
        # 給這個指標貼上標簽
        label="AOV", 
        # 計算度量值
        value=f"$ {round(aov,2)}",
        # 計算與目標相比的變化(向上/向下箭頭)
        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.在終端上運行該文件,在本地機器上顯示

streamlit run cohort-demo.py

在右上角,你會看到一個選項,即每當你編輯cohort-demo.py時總是運行。

3.在Heroku上部署儀表板

首先在你的GitHub賬戶上創建GitHub倉庫

創建requirements.txtsetup.shProcfile

requirements.txt(這是為瞭添加你在cohort-demo.py中使用的所有必要庫。)

#隻是簡單地列出所有的庫。你也可以包括版本
pandas
numpy
streamlit
matplotlib
seaborn
datetime
plotly

setup.sh

#隻要復制和粘貼這個
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(你應該在Heroku上創建一個賬戶)。

在右上角,點擊 "Create new app"

在部署方式下,選擇GitHub

然後將GitHub賬戶連接到Heroku。然後輸入倉庫的名稱(在本例中,它是cohort_analysis_demo)。

一旦連接,在手動部署下,點擊部署分支

到這裡我們隻需要等待它的部署。然後就完成瞭!URL鏈接將被創建。

剛剛將儀表盤部署到生產中,團隊成員現在可以自己訪問和分析數據。

他們可以簡單地上傳任何符合你定義的格式的數據集。即本例中的客戶交易數據。

最終結果

總結

希望能夠幫助到大傢,僅作為一個demo參考。其實Streamlit可以做很多很酷的事情,如果你像我一樣,在不瞭解Nodejs、Flask和Django等網絡開發框架的情況下,可以使用它來快速創建一個儀表盤。

雖然如此,我仍然相信瞭解JS/HTML/CSS和軟件工程概念會更有優勢。所以我確實建議你花空閑時間學習這些技術。

到此這篇關於Python實現構建一個儀表板的示例代碼的文章就介紹到這瞭,更多相關Python構建儀表板內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: