基于 Streamlit 的数据分析与机器学习实验平台设计与实现
·
一、项目背景与意义
在数据科学与机器学习的学习过程中,理论知识与实践操作往往存在一定的脱节。为了帮助学习者更好地掌握数据处理、分析和建模的核心技能,我设计并开发了一个基于 Streamlit 的数据分析与机器学习实验平台。该平台整合了数据处理、特征工程和机器学习等多个领域的核心实验,通过可视化界面让学习者能够直观地理解各种算法的实现过程和运行效果。
二、技术栈选择
本项目主要采用以下技术栈:
- Streamlit:用于构建交互式 Web 应用,简化了 Python 代码到 Web 界面的转换过程
- Pandas:提供数据结构和数据分析工具,是整个平台的数据处理核心
- NumPy:用于数值计算,支持高效的数组操作
- Scikit-learn:提供多种机器学习算法和数据预处理工具
import streamlit as st
import pandas as pd
import numpy as np
import os
from sklearn.metrics import accuracy_score
import warnings
选择这些技术的原因是它们在数据科学领域被广泛应用,且具有良好的兼容性和丰富的功能,可以满足实验平台的各项需求。
三、平台架构设计
平台采用模块化设计,主要包含以下几个核心部分:
- 实验配置模块:定义了所有实验的元数据,包括章节、分类、标题、代码路径等信息
- 导航模块:实现按章节或分类筛选实验的功能
- 代码展示模块:负责读取并展示实验代码
- 结果展示模块:提供预期结果和实际执行结果的对比展示
- 代码执行模块:实现动态执行实验代码并返回结果的功能
这种架构设计使得平台具有良好的可扩展性,新增实验只需在配置中添加相应条目并准备好代码文件即可。
四、核心功能实现
1. 实验配置系统
实验配置是整个平台的基础,采用字典结构存储所有实验信息:
EXPERIMENT_CONFIG = {
# 第3章 数据读取与基础操作
"3-1": {
"chapter": "第3章 数据处理",
"category": "数据读取与基础结构",
"title": "第1关 序列和数据框",
"code_file": "3. 第三章 数据处理/第1关 序列和数据框.py",
"description": "学习pandas序列和数据框的基础构造,掌握列表、元组到数据框的转换方法",
"function": lambda: pd.DataFrame({
"数据框A(默认索引)": ["列名: a,b,c,d", "4行4列", "混合数据类型"],
"数据框B(自定义索引)": ["索引: a,b,c,d", "列名: L1,L2,T1,T2", "4行4列"],
"数据类型": ["int, float, string混合", "支持多种数据类型", "灵活的数据结构"]
})
},
"3-2": {
"chapter": "第3章 数据处理",
"category": "数据读取与基础结构",
"title": "第2关 外部数据文件读取",
"code_file": "3. 第三章 数据处理/第2关 外部数据文件读取.py",
"description": "掌握不同格式外部数据的读取方法,包括Excel、TXT、CSV文件,重点学习CSV分块读取技巧",
"function": lambda: pd.DataFrame({
"数据读取方式": ["Excel读取", "TXT读取", "CSV分块读取"],
"函数": ["pd.read_excel()", "pd.read_table()", "pd.read_csv(chunksize=20000)"],
"特点": ["带表头数据读取", "无表头数据读取", "大规模数据分批处理"],
"输出格式": ["DataFrame", "DataFrame(无表头)", "分批DataFrame + 控制台输出"]
})
},
"3-3": {
"chapter": "第3章 数据处理",
"category": "数据处理与计算",
"title": "第3关 逻辑索引、切片与分组计算",
"code_file": "3. 第三章 数据处理/第3关 逻辑索引、切片方法,groupby 分组计算函数应用.py",
"description": "学习逻辑索引、数据切片、groupby分组计算等核心数据处理技术,结合时间筛选实现特定时段数据分析",
"function": lambda: pd.DataFrame({
"核心操作": ["逻辑索引筛选", "groupby分组", "时间筛选", "聚合计算"],
"实现代码": ["A.iloc[:, 0].drop_duplicates()", "groupby(['站点编号','日期'])", "dt.month == 10 & dt.day.between(1,7)", "sum()求和"],
"输出结果": ["站点编号列表", "每日客流统计", "国庆客流统计", "汇总统计数据"],
"数据结构": ["列表", "DataFrame", "DataFrame", "DataFrame"]
})
},
"3-4": {
"chapter": "第3章 数据处理",
"category": "数据处理与计算",
"title": "第4关 数据框关联操作",
"code_file": "3. 第三章 数据处理/第4关 数据框关联操作.py",
"description": "学习数据框的三种核心关联操作:内连接、左连接、右连接,掌握多表合并技巧",
"function": lambda: pd.DataFrame({
"连接类型": ["内连接(inner)", "左连接(left)", "右连接(right)"],
"实现代码": ["how='inner'", "how='left'", "how='right'"],
"结果特点": ["只保留匹配记录", "保留左表全部记录", "保留右表全部记录"],
"记录数": [6, 8, 6],
"应用场景": ["完全匹配分析", "主从表分析", "补充缺失信息"]
})
},
"3-5": {
"chapter": "第3章 数据处理",
"category": "数据处理与计算",
"title": "第5关 数据框合并操作",
"code_file": "3. 第三章 数据处理/第5关 数据框合并操作.py",
"description": "学习数据框的水平合并和垂直合并操作,掌握concat()函数的使用方法",
"function": lambda: pd.DataFrame({
"合并操作": ["水平合并(axis=1)", "垂直合并(axis=0)", "合并方向"],
"函数调用": ["pd.concat([df1, df2], axis=1)", "pd.concat([df3, df4], axis=0)", "axis参数控制方向"],
"结果特点": ["增加列维度", "增加行维度", "索引重置"],
"数据形状": ["4行5列", "6行5列", "保持列一致性"]
})
},
"3-6": {
"chapter": "第3章 数据处理",
"category": "数据处理与计算",
"title": "第6关 序列移动计算方法应用",
"code_file": "3. 第三章 数据处理/第6关 序列移动计算方法应用.py",
"description": "学习序列的移动计算方法,包括移动求和、移动均值、移动最大值和移动最小值",
"function": lambda: pd.DataFrame({
"原始序列": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
"移动求和(窗口=10)": [np.nan]*9 + [55,65,75,85,95,105],
"移动均值(窗口=10)": [np.nan]*9 + [5.5,6.5,7.5,8.5,9.5,10.5],
"移动最大值(窗口=10)": [np.nan]*9 + [10,11,12,13,14,15],
"移动最小值(窗口=10)": [np.nan]*9 + [1,2,3,4,5,6]
})
},
"3-7": {
"chapter": "第3章 数据处理",
"category": "数据处理与计算",
"title": "第7关 数据框切片(iloc、loc)方法",
"code_file": "3. 第三章 数据处理/第7关 数据框切片(iloc、loc)方法.py",
"description": "学习数据框的两种切片方法:iloc基于位置索引、loc基于标签索引,实现数据精准提取",
"function": lambda: pd.DataFrame({
"切片方法": ["iloc(位置索引)", "loc(标签索引)", "核心区别"],
"实现方式": ["D.iloc[行条件, 列位置]", "D.loc[行条件, 列标签]", "索引方式不同"],
"条件设置": ["基于列位置值", "基于列标签值", "逻辑条件相同"],
"适用场景": ["已知列位置", "已知列标签名", "根据需求选择"]
})
},
"3-8": {
"chapter": "第3章 数据处理",
"category": "数据处理与计算",
"title": "第8关 数据框排序",
"code_file": "3. 第三章 数据处理/第8关 数据框排序.py",
"description": "学习数据框的单列排序和多列排序方法,掌握sort_values()函数的应用",
"function": lambda: pd.DataFrame({
"排序类型": ["单列排序", "多列排序", "排序方向"],
"实现代码": ["sort_values(by='交易日期')", "sort_values(by=['代码','交易日期'])", "ascending参数控制"],
"排序结果": ["单一条件排序", "主次条件排序", "升序/降序可选"],
"应用场景": ["简单排序需求", "复杂排序需求", "数据组织分析"]
})
},
"3-9": {
"chapter": "第3章 数据处理",
"category": "数据处理与计算",
"title": "第9关 数据框综合应用案例",
"code_file": "3. 第三章 数据处理/第9关 数据框综合应用案例.py",
"description": "综合应用数据框的各种操作,实现复杂的数据统计计算任务,处理地铁客流数据分析",
"function": lambda: pd.DataFrame({
"数据处理步骤": ["数据读取", "时间筛选", "站点遍历", "时刻遍历", "客流统计", "结果汇总"],
"实现方法": ["pd.read_excel()", "df['日期']过滤", "unique()获取站点", "unique()获取时刻", "条件求和", "DataFrame构建"],
"输出结果": ["原始数据", "国庆后数据", "站点列表", "时刻列表", "站点时刻客流量", "汇总数据框"],
"数据结构": ["多行多列", "过滤后数据", "数组", "数组", "数值", "DataFrame"]
})
},
"3-10": {
"chapter": "第3章 数据处理",
"category": "数据处理与计算",
"title": "第10关 序列及简单随机抽样",
"code_file": "3. 第三章 数据处理/第10关 序列及简单随机抽样.py",
"description": "学习序列的创建和简单随机抽样方法,掌握random.sample()和pandas.Series()的应用",
"function": lambda: pd.DataFrame({
"抽样类型": ["简单随机抽样", "抽样方法", "结果展示"],
"实现代码": ["random.sample(code, 30)", "pd.Series(A, index=code)", "索引为原编号"],
"抽样特点": ["无放回抽样", "完全随机", "等概率"],
"应用场景": ["实验分组", "数据抽样", "随机分配"]
})
},
"3-11": {
"chapter": "第3章 数据处理",
"category": "数据处理与计算",
"title": "第11关 序列及较复杂抽样",
"code_file": "3. 第三章 数据处理/第11关 序列及较复杂抽样.py",
"description": "学习较复杂的随机抽样方法,为40位同学生成5种题型的随机抽签结果",
"function": lambda: pd.DataFrame({
"抽样任务": ["学生抽签系统", "题型数量", "随机范围", "数据结构"],
"实现方法": ["random.randint(1, 10)", "循环生成", "5种题型", "DataFrame存储"],
"抽样特点": ["独立随机", "均匀分布", "整数结果", "矩阵形式"],
"应用场景": ["考试抽题", "随机分组", "实验设计", "模拟抽样"]
})
},
# 第5章 数据预处理与特征工程
"5-1": {
"chapter": "第5章 数据预处理与特征工程",
"category": "数据预处理与清洗",
"title": "第1关 数据关联与分组计算",
"code_file": "5.第五章 数据预处理与特征工程/第1关 数据关联与分组计算.py",
"description": "学习针对不同类型变量的缺失值处理策略,数值变量用均值填充,名义变量用最频繁值填充",
"function": lambda: pd.DataFrame({
"变量类型": ["数值变量(x1~x6)", "名义变量(x7~x15)"],
"填充策略": ["均值填充", "最频繁值填充"],
"处理函数": ["fillna(A1.mean())", "fillna(A2.mode().iloc[0])"]
})
},
"5-2": {
"chapter": "第5章 数据预处理与特征工程",
"category": "数据预处理与清洗",
"title": "第2关 数据映射、离散化、去重、样本均值",
"code_file": "5.第五章 数据预处理与特征工程/第2关 数据映射、离散化、去重、样本均衡与特征选择.py",
"description": "学习均值-方差标准化方法,仅对数值变量进行处理,保留名义变量原始特征",
"function": lambda: pd.DataFrame({
"处理步骤": ["分离变量类型", "计算均值和标准差", "标准化转换", "合并结果"],
"公式/操作": ["数值变量x1~x6/名义变量x7~x15", "mean = np.mean(numerical, axis=0)", "(x-mean)/std", "np.concatenate()"],
"目的": ["区分处理对象", "获取标准化参数", "消除量纲影响", "保留完整数据结构"]
})
},
# 第6章 机器学习与实现
"6-1": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第1关 缺失值填充",
"code_file": "6. 第六章 机器学习与实现/第1关 缺失值填充.py",
"description": "学习数据缺失值填充方法,为后续建模准备完整数据",
"function": lambda: pd.DataFrame({
"处理技术": ["均值填充", "中位数填充", "最频繁值填充", "插值法"],
"适用场景": ["正态分布数据", "偏态分布数据", "分类数据", "时间序列数据"],
"工具": ["pandas fillna", "sklearn SimpleImputer", "自定义函数", "插值函数"]
})
},
"6-2": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第2关 数据标准化",
"code_file": "6. 第六章 机器学习与实现/第2关 数据标准化.py",
"description": "学习数据标准化方法,消除量纲影响,提升模型性能",
"function": lambda: pd.DataFrame({
"标准化方法": ["Z-score标准化", "Min-Max标准化", "Robust标准化", "小数定标标准化"],
"公式": ["(x-μ)/σ", "(x-min)/(max-min)", "(x-median)/IQR", "x/10^k"],
"特点": ["均值0方差1", "范围[0,1]", "抗异常值", "移动小数点"]
})
},
"6-3": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第3关 支持向量机分类模型及其应用",
"code_file": "6. 第六章 机器学习与实现/第3关 支持向量机分类模型及其应用.py",
"description": "学习支持向量机分类模型原理与应用,掌握超参数调优技巧",
"function": lambda: pd.DataFrame({
"SVM类型": ["线性SVM", "非线性SVM", "软间隔SVM", "多分类SVM"],
"核函数": ["线性核", "多项式核", "RBF核", "Sigmoid核"],
"参数": ["C(正则化)", "gamma(核系数)", "degree(多项式次数)", "coef0(核常数)"],
"应用场景": ["线性可分", "非线性可分", "存在噪声", "多类别分类"]
})
},
"6-4": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第4关 逻辑回归模型及其应用",
"code_file": "6. 第六章 机器学习与实现/第4关 逻辑回归模型及其应用.py",
"description": "学习逻辑回归模型原理与应用,掌握分类概率预测方法",
"function": lambda: pd.DataFrame({
"模型特点": ["线性分类器", "概率输出", "可解释性强", "计算效率高"],
"损失函数": ["对数损失", "交叉熵损失", "正则化损失", "自定义损失"],
"优化算法": ["梯度下降", "牛顿法", "拟牛顿法", "坐标下降"],
"评估指标": ["准确率", "精确率", "召回率", "AUC-ROC"]
})
},
"6-5": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第5关 神经网络分类模型及其应用",
"code_file": "6. 第六章 机器学习与实现/第5关 神经网络分类模型及其应用.py",
"description": "学习神经网络分类模型原理与应用,掌握深度学习基础",
"function": lambda: pd.DataFrame({
"网络结构": ["输入层", "隐藏层", "输出层", "激活函数"],
"激活函数": ["Sigmoid", "ReLU", "Tanh", "Softmax"],
"优化器": ["SGD", "Adam", "RMSprop", "Adagrad"],
"正则化": ["Dropout", "L1/L2", "BatchNorm", "EarlyStopping"]
})
},
"6-6": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第6关 线性回归模型及其应用",
"code_file": "6. 第六章 机器学习与实现/第6关 线性回归模型及其应用.py",
"description": "学习线性回归模型原理与应用,掌握回归分析基本方法",
"function": lambda: pd.DataFrame({
"回归分析": ["简单线性回归", "多元线性回归", "回归系数", "拟合优度"],
"统计指标": ["R²判定系数", "调整R²", "F统计量", "t检验"],
"应用场景": ["预测分析", "相关性分析", "趋势分析", "因果推断"],
"数据要求": ["线性关系", "无多重共线性", "残差正态性", "同方差性"]
})
},
"6-7": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第7关 神经网络回归模型及其应用",
"code_file": "6. 第六章 机器学习与实现/第7关 神经网络回归模型及其应用.py",
"description": "学习神经网络回归模型原理与应用,掌握连续值预测方法",
"function": lambda: pd.DataFrame({
"回归类型": ["线性回归", "多项式回归", "深度回归", "时间序列预测"],
"损失函数": ["均方误差", "平均绝对误差", "Huber损失", "分位数损失"],
"网络架构": ["MLP", "CNN回归", "RNN回归", "Transformer回归"],
"应用领域": ["房价预测", "销量预测", "股价预测", "气象预测"]
})
},
"6-8": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第8关 支持向量机回归模型及其应用",
"code_file": "6. 第六章 机器学习与实现/第8关 支持向量机回归模型及其应用.py",
"description": "学习支持向量机回归模型原理与应用,掌握回归预测技巧",
"function": lambda: pd.DataFrame({
"SVR类型": ["ε-SVR", "ν-SVR", "线性SVR", "非线性SVR"],
"损失函数": ["ε-不敏感损失", "二次损失", "Huber损失", "自定义损失"],
"核技巧": ["线性核", "RBF核", "多项式核", "自定义核"],
"应用场景": ["小样本回归", "非线性回归", "高维回归", "时间序列预测"]
})
},
"6-9": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第9关 基于主成分分析的综合评价",
"code_file": "6. 第六章 机器学习与实现/第9关 基于主成分分析的综合评价.py",
"description": "学习主成分分析原理与应用,掌握数据降维与综合评价方法",
"function": lambda: pd.DataFrame({
"PCA步骤": ["数据中心化", "计算协方差", "特征值分解", "选取主成分"],
"评估指标": ["方差贡献率", "累积贡献率", "特征值", "特征向量"],
"应用领域": ["数据降维", "特征提取", "数据可视化", "综合评价"],
"注意事项": ["数据标准化", "线性假设", "方差最大化", "正交变换"]
})
},
"6-10": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第10关 K均值聚类算法及其应用",
"code_file": "6. 第六章 机器学习与实现/第10关 K均值聚类算法及其应用.py",
"description": "学习K均值聚类算法原理与应用,掌握无监督学习方法",
"function": lambda: pd.DataFrame({
"算法步骤": ["初始化中心", "分配样本", "更新中心", "收敛判断"],
"距离度量": ["欧氏距离", "曼哈顿距离", "余弦相似度", "马氏距离"],
"评估指标": ["轮廓系数", "Calinski指数", "DB指数", "SSE"],
"应用场景": ["客户分群", "图像分割", "异常检测", "市场细分"]
})
},
"6-11": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第11关 布尔数据集构建",
"code_file": "6. 第六章 机器学习与实现/第11关 布尔数据集构建.py",
"description": "学习布尔数据集构建方法,为关联规则挖掘准备数据",
"function": lambda: pd.DataFrame({
"数据类型": ["事务数据", "布尔矩阵", "稀疏矩阵", "稠密矩阵"],
"转换方法": ["One-Hot编码", "二进制转换", "离散化编码", "特征哈希"],
"存储格式": ["CSV文件", "NPY文件", "稀疏矩阵格式", "数据库表"],
"应用场景": ["购物篮分析", "推荐系统", "模式挖掘", "关联规则"]
})
},
"6-12": {
"chapter": "第6章 机器学习与实现",
"category": "挖掘建模及应用",
"title": "第12关 基于布尔数据集的一对一和多对多分析",
"code_file": "6. 第六章 机器学习与实现/第12关 基于布尔数据集的一对一和多对一关联规则挖掘.py",
"description": "学习基于布尔数据集的关联规则挖掘,掌握Apriori算法应用",
"function": lambda: pd.DataFrame({
"规则类型": ["一对一规则", "多对多规则", "序列规则", "层次规则"],
"评估指标": ["支持度", "置信度", "提升度", "确信度"],
"算法": ["Apriori", "FP-Growth", "Eclat", "PrefixSpan"],
"应用领域": ["市场营销", "交叉销售", "推荐系统", "医疗诊断"]
})
}
}
这种设计的优点是结构清晰,便于维护和扩展,同时可以灵活地根据章节或分类组织实验。
2. 双维度导航系统
平台实现了按章节和按分类两种导航方式,满足不同的查找习惯:
# 构建双维度索引
chapters = {}
for exp_id, exp in EXPERIMENT_CONFIG.items():
chapter = exp["chapter"]
if chapter not in chapters:
chapters[chapter] = []
chapters[chapter].append((exp_id, exp["title"]))
# 侧边栏导航实现
filter_type = st.sidebar.radio("筛选方式", ["按章节选择", "按实验分类选择"])
# 根据选择的筛选方式显示不同的导航选项

这种双维度导航设计让用户可以快速定位到感兴趣的实验内容。
3. 代码展示与执行系统
平台不仅能展示代码,还能动态执行代码并展示结果:
# 代码展示
code_file_path = current_exp["code_file"]
try:
with open(code_file_path, 'r', encoding='utf-8') as f:
code_content = f.read()
st.code(code_content, language='python')
except FileNotFoundError:
st.error(f"❌ 代码文件未找到: {code_file_path}")
# 代码执行
if st.button("▶️ 运行此代码", type="primary"):
with st.spinner("正在执行代码..."):
try:
exec_namespace = {'pd': pd, 'np': np} # 提供执行环境
exec(code_content, exec_namespace)
# 处理并展示执行结果
except Exception as e:
st.error(f"❌ 执行代码时出错: {e}")

这个功能可以直接在平台上运行代码,观察实际效果,加深对知识点的理解。
4. 结果对比展示
平台采用选项卡的形式展示预期结果和实际执行结果,方便对比学习:
tab1, tab2 = st.tabs(["预期结果", "实际执行"])
with tab1:
st.markdown("**预期实验结果(演示)**")
result_df = current_exp["function"]()
st.dataframe(result_df)
with tab2:
st.markdown("**实际执行实验结果**")
# 实际执行代码并展示结果

这种设计能帮助理解代码的预期输出,当实际结果与预期不符时,也能更好地排查问题。
五、平台内容体系
平台包含三个主要模块的实验内容:
- 数据处理:涵盖数据读取、序列和数据框操作、逻辑索引、数据切片、分组计算、数据关联与合并等基础操作
- 数据预处理与特征工程:包括缺失值处理、数据标准化、数据映射与离散化等特征工程技术
- 机器学习与实现:包含多种经典机器学习算法的实现,如支持向量机、逻辑回归、神经网络、线性回归、K 均值聚类等
每个实验都提供详细的描述、完整的代码和预期结果,形成了一套完整的学习体系。
六、总结与展望
本平台通过整合数据科学领域的核心实验,为学习者提供了一个直观、互动的学习环境。相比传统的学习方式,该平台具有以下优势:
- 理论与实践相结合,提高学习效率
- 代码可直接运行,便于调试和理解
- 结构化的实验体系,覆盖核心知识点
- 直观的结果展示,便于对比分析
未来可以从以下几个方面进行改进:
- 增加更多的实验内容,覆盖更广泛的知识点
- 添加代码解释功能,逐行解析代码含义
- 实现用户进度跟踪,记录学习历程
- 增加交互式练习,让用户可以动手实践
附:网页操作过程
数据挖掘技术与应用可视化学习系统
更多推荐
所有评论(0)