據(jù)看板)
任務1看板需求分析與版面設計本次選擇學生成績統(tǒng)計作為業(yè)務場景??窗迥繕酥庇^展示各班學生成績分布、平均分、及格與優(yōu)秀占比等信息。劃分4個模塊1. 數(shù)據(jù)概覽區(qū)核心指標卡片總記錄數(shù)、平均分、及格率、優(yōu)秀率?2. 維度統(tǒng)計區(qū)各班平均分柱狀對比圖?3. 趨勢分析區(qū)不同學期平均分折線趨勢圖?4. 明細數(shù)據(jù)區(qū)原始成績明細表格配色方案主色 #165DFF藍色輔助色 #FF7D00橙色、#00B42A綠色背景為白色。版面布局第一行放置指標卡片第二行左右分布柱狀圖、折線圖第三行左右分布明細表、環(huán)形占比圖。任務2實驗數(shù)據(jù)準備與預處理采用代碼自動生成模擬學生成績數(shù)據(jù)集包含字段學號、班級、科目、學期、分數(shù)。數(shù)據(jù)預處理操作1. 校驗分數(shù)剔除0~100以外的異常分數(shù)?2. 新增派生字段“分數(shù)段”自動劃分不及格(60)、良好(60~79)、優(yōu)秀(80~100)?3. 整理維度分類維度班級、分數(shù)段、科目時間維度學期數(shù)值維度分數(shù)清洗后數(shù)據(jù)可直接用于可視化。任務3基礎可視化圖表搭建基于清洗完成的數(shù)據(jù)一共實現(xiàn)4類可視化1. 指標卡片st.metric展示總記錄條數(shù)、整體平均分、及格率、優(yōu)秀率?2. 柱狀圖X軸為班級Y軸為平均分用于對比計科1班、計科2班、軟工1班成績差異?3. 折線圖X軸為學期Y軸為平均分展示成績隨學期變化趨勢?4. 環(huán)形圖餅圖展示不及格、良好、優(yōu)秀三個等級的人數(shù)占比結構。任務4靜態(tài)數(shù)據(jù)看板整合實現(xiàn)使用Streamlit完成頁面整合把標題、指標卡片、4張圖表、明細數(shù)據(jù)表放在同一個頁面。利用 st.columns() 做多列分欄排版對圖表配色統(tǒng)一設置保持視覺風格一致。調整頁面為寬屏布局合理分配組件間距頁面層級清晰最終生成完整靜態(tài)數(shù)據(jù)看板在瀏覽器中預覽展示效果。代碼import streamlit as stimport pandas as pdimport plotly.express as pximport numpy as np# ---------- 頁面基礎配置 ----------st.set_page_config(page_title學生成績看板, layoutwide)st.markdown(h1 stylecolor:#165DFF;學生成績數(shù)據(jù)統(tǒng)計看板/h1, unsafe_allow_htmlTrue)# ---------- 生成模擬數(shù)據(jù) ----------np.random.seed(2025)n 120student_id [fS{i:04d} for i in range(1, n1)]class_list np.random.choice([計科1班, 計科2班, 軟工1班], sizen)subject_list np.random.choice([高數(shù), Python, 英語], sizen)term_list np.random.choice([第1學期, 第2學期, 第3學期], sizen)score np.random.randint(40, 98, sizen)df_raw pd.DataFrame({學號: student_id,班級: class_list,科目: subject_list,學期: term_list,分數(shù): score})# ---------- 數(shù)據(jù)預處理 ----------# 剔除異常值df df_raw[(df_raw[分數(shù)] 0) (df_raw[分數(shù)] 100)].copy()# 新增分數(shù)段def get_level(s):if s 60:return 不及格(60)elif s 80:return 良好(60~79)else:return 優(yōu)秀(80~100)df[分數(shù)段] df[分數(shù)].apply(get_level)# ---------- 計算核心指標指標卡片 ----------total_cnt len(df)avg_score round(df[分數(shù)].mean(), 2)pass_rate round(len(df[df[分數(shù)]60]) / total_cnt * 100, 2)excellent_rate round(len(df[df[分數(shù)]80]) / total_cnt * 100, 2)# 卡片布局col1, col2, col3, col4 st.columns(4)with col1:st.metric(總學生記錄數(shù), valuetotal_cnt)with col2:st.metric(平均分, valueavg_score)with col3:st.metric(及格率(%), valuepass_rate)with col4:st.metric(優(yōu)秀率(%), valueexcellent_rate)st.markdown(---)# ---------- 圖表區(qū)域 ----------c_left, c_right st.columns(2)with c_left:st.subheader(各班平均分對比)class_avg df.groupby(班級)[分數(shù)].mean().reset_index()fig_bar px.bar(class_avg, x班級, y分數(shù), color班級,color_discrete_sequence[#165DFF,#FF7D00,#00B42A])st.plotly_chart(fig_bar)with c_right:st.subheader(各學期平均分趨勢)term_avg df.groupby(學期)[分數(shù)].mean().reset_index()fig_line px.line(term_avg, x學期, y分數(shù), markersTrue,color_discrete_sequence[#165DFF])st.plotly_chart(fig_line)c2_left, c2_right st.columns(2)with c2_left:st.subheader(明細數(shù)據(jù)表)st.dataframe(df)with c2_right:st.subheader(分數(shù)段占比環(huán)形圖)level_cnt df[分數(shù)段].value_counts().reset_index(name數(shù)量)fig_pie px.pie(level_cnt, namesindex, values數(shù)量, hole0.4,color_discrete_sequence[#165DFF,#FF7D00,#00B42A])st.plotly_chart(fig_pie)任務5實驗結果驗證與總結本次基于Streamlit、Pandas、Plotly完成學生成績可視化看板實驗過程中遇到多處環(huán)境與代碼問題。1. 編碼報錯Windows中文CMD默認GBK編碼安裝庫時出現(xiàn) UnicodeEncodeError 。解決設置 PYTHONUTF81 強制使用UTF-8編碼。?2. 多Python環(huán)境不一致庫安裝在Anaconda環(huán)境但使用系統(tǒng)自帶IDLE運行提示 ModuleNotFoundError 。解決使用Anaconda Prompt或在VS Code切換解釋器為Anaconda環(huán)境在對應環(huán)境執(zhí)行啟動命令。?3. 依賴版本兼容問題numpy版本過高引發(fā)導入失敗。解決卸載numpy2.x安裝 numpy2 的兼容版本。?4. 代碼API版本不兼容舊版Streamlit不支持 st.divider() 和 use_container_width 參數(shù)運行時報屬性錯誤。解決 st.divider() 替換為 st.markdown(---) 刪除 use_container_widthTrue 參數(shù)。?5. Plotly環(huán)形圖列名匹配錯誤 value_counts 統(tǒng)計生成的列名和代碼不一致觸發(fā) ValueError 。解決將餅圖 names 參數(shù)改為 index values 指定為 數(shù)量 。?6. Python縮進報錯復制代碼引入多余空格出現(xiàn) IndentationError 。解決對齊代碼刪除行首多余空格保證縮進規(guī)范。最終修改后看板成功運行包含指標卡片、柱狀圖、折線圖、環(huán)形圖與明細表格實現(xiàn)預定可視化需求。