
任务1看板需求分析与版面设计本次选择学生成绩统计作为业务场景。看板目标直观展示各班学生成绩分布、平均分、及格与优秀占比等信息。划分4个模块1. 数据概览区核心指标卡片总记录数、平均分、及格率、优秀率2. 维度统计区各班平均分柱状对比图3. 趋势分析区不同学期平均分折线趋势图4. 明细数据区原始成绩明细表格配色方案主色 #165DFF蓝色辅助色 #FF7D00橙色、#00B42A绿色背景为白色。版面布局第一行放置指标卡片第二行左右分布柱状图、折线图第三行左右分布明细表、环形占比图。任务2实验数据准备与预处理采用代码自动生成模拟学生成绩数据集包含字段学号、班级、科目、学期、分数。数据预处理操作1. 校验分数剔除0~100以外的异常分数2. 新增派生字段“分数段”自动划分不及格(60)、良好(60~79)、优秀(80~100)3. 整理维度分类维度班级、分数段、科目时间维度学期数值维度分数清洗后数据可直接用于可视化。任务3基础可视化图表搭建基于清洗完成的数据一共实现4类可视化1. 指标卡片st.metric展示总记录条数、整体平均分、及格率、优秀率2. 柱状图X轴为班级Y轴为平均分用于对比计科1班、计科2班、软工1班成绩差异3. 折线图X轴为学期Y轴为平均分展示成绩随学期变化趋势4. 环形图饼图展示不及格、良好、优秀三个等级的人数占比结构。任务4静态数据看板整合实现使用Streamlit完成页面整合把标题、指标卡片、4张图表、明细数据表放在同一个页面。利用 st.columns() 做多列分栏排版对图表配色统一设置保持视觉风格一致。调整页面为宽屏布局合理分配组件间距页面层级清晰最终生成完整静态数据看板在浏览器中预览展示效果。代码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;学生成绩数据统计看板/h1, unsafe_allow_htmlTrue)# ---------- 生成模拟数据 ----------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([高数, 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,分数: score})# ---------- 数据预处理 ----------# 剔除异常值df df_raw[(df_raw[分数] 0) (df_raw[分数] 100)].copy()# 新增分数段def get_level(s):if s 60:return 不及格(60)elif s 80:return 良好(60~79)else:return 优秀(80~100)df[分数段] df[分数].apply(get_level)# ---------- 计算核心指标指标卡片 ----------total_cnt len(df)avg_score round(df[分数].mean(), 2)pass_rate round(len(df[df[分数]60]) / total_cnt * 100, 2)excellent_rate round(len(df[df[分数]80]) / total_cnt * 100, 2)# 卡片布局col1, col2, col3, col4 st.columns(4)with col1:st.metric(总学生记录数, valuetotal_cnt)with col2:st.metric(平均分, valueavg_score)with col3:st.metric(及格率(%), valuepass_rate)with col4:st.metric(优秀率(%), valueexcellent_rate)st.markdown(---)# ---------- 图表区域 ----------c_left, c_right st.columns(2)with c_left:st.subheader(各班平均分对比)class_avg df.groupby(班级)[分数].mean().reset_index()fig_bar px.bar(class_avg, x班级, y分数, color班级,color_discrete_sequence[#165DFF,#FF7D00,#00B42A])st.plotly_chart(fig_bar)with c_right:st.subheader(各学期平均分趋势)term_avg df.groupby(学期)[分数].mean().reset_index()fig_line px.line(term_avg, x学期, y分数, markersTrue,color_discrete_sequence[#165DFF])st.plotly_chart(fig_line)c2_left, c2_right st.columns(2)with c2_left:st.subheader(明细数据表)st.dataframe(df)with c2_right:st.subheader(分数段占比环形图)level_cnt df[分数段].value_counts().reset_index(name数量)fig_pie px.pie(level_cnt, namesindex, values数量, hole0.4,color_discrete_sequence[#165DFF,#FF7D00,#00B42A])st.plotly_chart(fig_pie)任务5实验结果验证与总结本次基于Streamlit、Pandas、Plotly完成学生成绩可视化看板实验过程中遇到多处环境与代码问题。1. 编码报错Windows中文CMD默认GBK编码安装库时出现 UnicodeEncodeError 。解决设置 PYTHONUTF81 强制使用UTF-8编码。2. 多Python环境不一致库安装在Anaconda环境但使用系统自带IDLE运行提示 ModuleNotFoundError 。解决使用Anaconda Prompt或在VS Code切换解释器为Anaconda环境在对应环境执行启动命令。3. 依赖版本兼容问题numpy版本过高引发导入失败。解决卸载numpy2.x安装 numpy2 的兼容版本。4. 代码API版本不兼容旧版Streamlit不支持 st.divider() 和 use_container_width 参数运行时报属性错误。解决 st.divider() 替换为 st.markdown(---) 删除 use_container_widthTrue 参数。5. Plotly环形图列名匹配错误 value_counts 统计生成的列名和代码不一致触发 ValueError 。解决将饼图 names 参数改为 index values 指定为 数量 。6. Python缩进报错复制代码引入多余空格出现 IndentationError 。解决对齐代码删除行首多余空格保证缩进规范。最终修改后看板成功运行包含指标卡片、柱状图、折线图、环形图与明细表格实现预定可视化需求。