简介:高校教师和培训机构可以直接用来开课的Python数据分析教学资源,包含12个章节的完整PPT课件(从Python基础、NumPy、Pandas数据清洗与统计,到Matplotlib/Seaborn/pyecharts可视化、时间序列分析、SciPy科学计算、统计与机器学习、图像数据分析),每章配套可运行的Jupyter Notebook例题代码(如ch2-ch12各章.ipynb)及综合实训文件(ch6/ch7/ch9等专项实训)。所有代码基于主流库编写,内置或附带真实业务场景数据集,比如股票行情、体检报告、APP类型分布等,支持开箱即用。教学文档齐全,含电子教案、教学大纲、进度表、教材大纲,覆盖课前备课、课堂演示、课后练习、项目实训全流程。学生自学也能跟着Notebook逐行执行、即时验证结果,快速掌握数据载入、清洗、聚合、建模、绘图等核心技能。
1. 这套资料到底解决了什么真问题?——不是“又一套教程”,而是教学落地的最小可行闭环
我带过六届数据分析方向的本科课程,也给三所职业院校做过师资培训,最常被问到的问题不是“Python怎么学”,而是:“老师,我下周就要开课了,PPT还没做完,例题跑不通,学生问‘为什么报错’我得查半小时,有没有能直接打开、讲两小时、学生还能跟着敲完不卡壳的整套东西?”——这句话背后,是高校教师和培训机构真实存在的“教学交付焦虑”:课时紧、学生基础参差、环境配置千奇百怪、真实数据难找、可视化效果总不如PPT里那张图、综合项目缺业务逻辑支撑……而市面上90%的所谓“教学资源”,要么是零散代码片段堆砌,要么是脱离课堂节奏的炫技Demo,要么干脆就是把教材PDF转成PPT,连一个可运行的.ipynb文件都没有。
这套《Python数据分析与可视化》资料,恰恰踩在了这个痛点上。它不是教你怎么“学会Python”,而是帮你“开好一门课”。12章PPT不是知识罗列,而是按45分钟一节课的节奏设计:每章开头有明确的教学目标(比如第5章“Pandas数据载入与预处理”的目标是“能独立清洗含缺失值、重复记录、格式混乱的CSV/Excel原始数据,并输出结构化DataFrame供后续分析”),中间穿插3~5个阶梯式Jupyter例题(从ch5_1_load_csv.ipynb加载体检表原始数据,到ch5_4_merge_clean_report.ipynb合并多张体检单并生成清洗报告),结尾配一个综合实训(如ch5_comprehensive_cleaning.ipynb,模拟医院信息科收到12个科室导出的Excel体检数据,字段名不统一、日期格式混杂、数值单位不一致,要求学生用Pandas完成标准化清洗)。所有Notebook都经过实测:在Windows/Mac/Linux三平台+Python 3.9~3.11环境下,只要执行pip install -r requirements.txt(包里已附),就能100%运行成功,连pd.read_csv()读取路径这种细节都做了相对路径封装,避免学生因路径错误卡在第一行。
更关键的是,它的“真实数据集”不是网上随便扒的Kaggle公开数据,而是有业务上下文的轻量级场景数据:股票数据集(stock_data_2020-2023.csv)包含沪深300成分股日频行情+行业分类+市值分层标签;体检数据集(health_check_2023_q3.xlsx)含1287份匿名报告,字段包括“收缩压/舒张压”“空腹血糖”“尿酸”“B超描述文本”“医生建议”等,天然支持缺失值处理、异常值识别、文本字段提取等典型清洗任务;APP类型分析数据集(app_usage_by_age_group.csv)则按18-24、25-34、35-44、45+四个年龄段,统计了社交、购物、金融、教育、工具类APP的日均使用时长和启动次数,直接对应Seaborn的分组箱线图、pyecharts的环形图等可视化教学点。这些数据量控制在5MB以内,下载快、加载快、分析快,学生不会因为“跑一个df.describe()要等10秒”而失去耐心。
所以,如果你是高校教师,它能让你省下至少80小时备课时间——不用再花三天调试Matplotlib中文字体,不用反复重写“如何用str.extract()从体检报告文本中抽出血糖数值”的示例;如果你是培训机构讲师,它能让你的结业项目立刻有说服力——学员最后展示的不是“鸢尾花分类”,而是“基于真实体检数据的高血压风险人群画像”;如果你是自学的学生,它提供的是“可触摸的学习流”:打开ch4_2_groupby_aggregation.ipynb,输入df.groupby('性别')['空腹血糖'].agg(['mean', 'std', 'count']),回车,立刻看到分性别血糖均值对比,再改一行代码换成'年龄分段',结果实时刷新——这种即时反馈,比看10页文档管用100倍。
2. 整体设计思路拆解:为什么是这12章?为什么PPT、Notebook、数据集必须三位一体?
很多老师拿到资源第一反应是:“第12章图像数据分析是不是太超纲了?”——这恰恰是这套资料设计最值得细说的地方。它的12章结构,不是按Python语法或库文档顺序排列,而是严格遵循“认知负荷理论”和“教学法中的脚手架原则”(Scaffolding),每一章都在前一章能力基础上,只增加一个新变量,同时保留至少70%的旧技能复用。我们来拆解这个链条:
2.1 章节演进逻辑:从“会敲代码”到“能解业务问题”的渐进式跃迁
-
第1章 概述:不讲代码,讲“数据分析是什么”。用一张PPT对比“Excel做报表”和“Python做分析”的差异:前者是“人适应工具”,后者是“工具适应人”;用一个极简Notebook(
ch1_demo_simple_analysis.ipynb)演示:导入pandas→读取sales_q1.csv→df.head()→df['销售额'].sum()→df.plot.bar(x='月份', y='销售额'),全程5行代码,但让学生第一次看到“数据进来→计算→出图”的完整闭环。 -
第2章 Python基础:只聚焦数据分析必需的语法:列表推导式(替代for循环)、字典操作(用于存储配置)、函数定义(封装清洗逻辑)、异常处理(
try-except捕获FileNotFoundError)。删掉所有无关内容,比如面向对象、装饰器、生成器——这些在第11章机器学习建模前根本用不到。 -
第3章 NumPy:核心就两点:向量化运算(
arr1 + arr2替代循环)、广播机制(arr_2d + scalar)。所有例题围绕“体检数据中的BMI计算”展开:身高(m)、体重(kg)两个一维数组,用weight / (height ** 2)一行得出BMI数组,再用np.where(bmi > 24, '超重', '正常')打标签。这里刻意避开ndarray内存布局、dtype转换等底层细节,因为学生此时需要的是“快速得到结果”,不是“理解内存”。 -
第4章 Pandas统计分析:承接第3章,把NumPy数组升级为DataFrame。重点训练
groupby().agg()(分组聚合)、pivot_table()(透视表)、corr()(相关性矩阵)。例题数据是app_usage_by_age_group.csv,让学生算“25-34岁用户对社交APP的使用时长与购物APP的相关性”,结果直接输出热力图——业务意义明确,代码简洁有力。 -
第5章 Pandas数据清洗:这是全书承上启下的核心章。它把前面学的语法、NumPy向量化、Pandas索引全部调用起来。
ch5_3_handle_missing.ipynb不是简单教df.dropna(),而是设计三个清洗场景:① 体检数据中“舒张压”缺失率35%,用同年龄段均值填充;② “B超描述”字段含大量“未见明显异常”“大致正常”等文本,用str.contains()标记为“无异常”;③ “检查日期”列混有“2023/03/15”“2023-03-15”“2023年3月15日”,用pd.to_datetime()统一。每个场景都配清洗前后对比表(before_cleaning.csvvsafter_cleaning.csv),学生一眼看清效果。 -
第6章 Matplotlib基础:不讲
plt.subplot()嵌套,只练四大图表:折线图(股票价格趋势)、柱状图(各科室体检人数)、散点图(血糖vs尿酸)、直方图(血压分布)。所有代码强制使用plt.style.use('seaborn-v0_8'),解决新手最头疼的“画出来像Excel默认图”的问题。ch6_4_custom_style.ipynb专门教如何保存高清图:plt.savefig('blood_pressure_hist.png', dpi=300, bbox_inches='tight'),连bbox_inches参数的作用都用注释说明——因为学生交作业时总被要求“图片清晰”。 -
第7章 Seaborn绘图:定位是“让Matplotlib更聪明”。重点教
sns.catplot()(分类图)、sns.heatmap()(热力图)、sns.pairplot()(变量关系图)。ch7_2_health_risk_heatmap.ipynb用体检数据做示例:横轴是“年龄分段”,纵轴是“风险指标”(高血压、高血糖、高血脂),颜色深浅代表该年龄段该指标异常率,一张图说清人群健康风险分布。 -
第8章 pyecharts可视化:解决“课堂演示需要交互”的刚需。
ch8_1_stock_interactive.ipynb用pyecharts画沪深300指数K线图,鼠标悬停显示当日涨跌幅、成交量;ch8_3_app_usage_timeline.ipynb做APP使用时长随时间变化的动态折线图,支持拖拽缩放。所有代码都加了render_notebook(),确保在Jupyter里直接渲染,不用切浏览器。 -
第9章 时间序列分析:不是教ARIMA模型,而是教“如何看懂时间数据”。
ch9_2_resample_and_plot.ipynb演示:把分钟级股票数据resample('D').mean()转为日线,再用rolling(5).mean()算5日均线;ch9_3_seasonal_decompose.ipynb对APP日活数据做季节性分解,直观看到“工作日vs周末”的使用差异。所有操作都基于pd.Timestamp和pd.Timedelta,避开了datetime模块的复杂转换。 -
第10章 SciPy科学计算:只选三个最常用函数:
scipy.stats.ttest_ind()(两组体检数据均值检验)、scipy.optimize.curve_fit()(拟合血糖随年龄变化曲线)、scipy.signal.find_peaks()(从心电图模拟数据中找R波峰值)。每个函数都配业务解释:“t检验不是为了算p值,而是回答‘男性和女性空腹血糖是否有统计学差异’这个医生真正关心的问题”。 -
第11章 统计与机器学习:严格限定在“可解释、可演示”的范围内。
ch11_1_linear_regression.ipynb用体检数据预测“收缩压”,特征只选“年龄”“体重”“是否吸烟”,模型用sklearn.linear_model.LinearRegression,重点教model.coef_怎么看哪个因素影响最大;ch11_3_cluster_health_groups.ipynb用KMeans对体检指标聚类,结果用sns.scatterplot()可视化,告诉学生:“这不是黑箱,聚出来的三类人,你可以去查他们的平均血糖、平均血压,给每类起个业务名字,比如‘代谢健康型’‘血压偏高型’‘多重风险型’”。 -
第12章 图像数据分析:很多人觉得超纲,但它只做一件事:用
cv2和PIL读取、显示、简单处理体检报告中的B超图片(ultrasound_sample.jpg),然后用skimage.feature.hog()提取HOG特征,最后用PCA降维到2D可视化。目的不是教会学生做医学影像AI,而是打破“图像=深度学习”的迷思,让他们看到:传统方法也能从图像中提取结构化信息,且代码只有20行。
这个12章链条,本质是一个“教学最小闭环”:每章PPT负责讲清楚“为什么这么做”,Notebook负责“怎么做”,数据集负责“做给谁看”。三者缺一不可——没有PPT,学生不知道清洗数据的业务目标;没有Notebook,PPT只是空中楼阁;没有真实数据集,所有代码都是玩具。
2.2 工具链选择背后的硬逻辑:为什么只用Pandas/Matplotlib/Seaborn/pyecharts?
有人会问:“为什么不加入Plotly?为什么不用Dask处理大数据?”答案很实在:教学场景的第一约束永远是“稳定性”和“可预测性”。我在某985高校试讲时用过Plotly,结果30%学生笔记本显卡驱动不兼容,fig.show()直接报错;用Dask则要先解释分布式概念,学生还没搞懂df.groupby(),先被client.submit()绕晕。
Pandas胜在“心智模型简单”:DataFrame就是Excel表格的编程版,df['列名']对应点击列,df[df['年龄']>30]对应筛选,学生迁移成本最低。Matplotlib虽老,但plt.plot()的API十年没变,文档齐全,报错信息明确(比如ValueError: x and y must have same first dimension,一看就知道是数据长度不匹配);Seaborn是Matplotlib的“高级语法糖”,sns.boxplot(x='性别', y='空腹血糖', data=df)一行代码替代Matplotlib十几行,且默认配色、字体、网格都专业;pyecharts则完美补足交互短板,且中文文档友好,set_global_opts(title_opts=opts.TitleOpts(title="体检数据分布"))这种写法,学生抄一遍就能改标题。
更重要的是,这四个库的组合覆盖了95%的教学需求:Pandas处理数据,Matplotlib打底绘图,Seaborn提升表现力,pyecharts增强演示效果。它们之间没有版本冲突(pandas>=1.5,<2.0, matplotlib>=3.7, seaborn>=0.12, pyecharts>=2.0),requirements.txt里一行搞定。而像Bokeh、Altair这类库,虽然炫酷,但学习曲线陡峭,且对Jupyter内核依赖强,不适合教学稳定压倒一切的场景。
3. 核心细节解析与实操要点:那些文档里不会写的“教室现场经验”
光有结构还不够,真正决定教学成败的,是那些藏在Notebook注释里、PPT动画后、数据集命名规则中的细节。这些细节,是我带课十年踩坑换来的“教室现场经验”,也是这套资料最值钱的部分。
3.1 Notebook设计的“防呆”哲学:让学生少犯错,而不是多纠错
新手写代码最大的挫败感,来自“明明照着抄,却报错”。这套资料的每个.ipynb文件,都内置了三层“防呆”机制:
第一层:路径容错
所有数据读取代码,都不用绝对路径。比如ch5_1_load_csv.ipynb里:
# ✅ 正确:使用相对路径,且自动检测数据文件是否存在
import os
data_dir = os.path.join(os.path.dirname(os.getcwd()), 'data')
csv_path = os.path.join(data_dir, 'health_check_2023_q3.csv')
if not os.path.exists(csv_path):
raise FileNotFoundError(f"数据文件未找到,请确认目录结构:{csv_path}")
df = pd.read_csv(csv_path)
这段代码的意义在于:当学生把整个文件夹拷到桌面,路径变了,但os.path.dirname(os.getcwd())会自动定位到当前Notebook所在目录的上一级,再拼data子目录,依然能找到。而如果写成pd.read_csv('data/health_check_2023_q3.csv'),一旦Notebook不在根目录,就必然报错。
第二层:数据状态校验
每个清洗步骤后,都插入assert断言。例如ch5_2_handle_duplicates.ipynb中,在df.drop_duplicates()后:
# ✅ 清洗后立即校验:重复记录是否真的清除了?
original_count = len(df_original)
cleaned_count = len(df)
assert cleaned_count < original_count, f"警告:去重失败!原记录{original_count}条,清洗后{cleaned_count}条"
print(f"✅ 成功去除{original_count - cleaned_count}条重复记录")
学生运行到这里,如果看到AssertionError,立刻知道去重逻辑有问题,而不是等到后面画图时报KeyError才懵圈。
第三层:结果可视化锚定
所有关键步骤的结果,都强制用display()或plt.show()呈现。比如ch4_3_pivot_table.ipynb中,做完透视表后:
# ✅ 不只打印df,而是用style高亮关键值
pivot_result = df.pivot_table(
values='使用时长',
index='年龄段',
columns='APP类型',
aggfunc='mean'
)
# 高亮每列最大值,学生一眼看出哪个年龄段对哪个APP最上瘾
display(pivot_result.style.highlight_max(axis=0, color='lightgreen'))
这种设计让学生“看得见进步”:清洗前数据乱糟糟,清洗后表格整齐,最大值被绿色标出——成就感是持续学习的最大动力。
3.2 PPT课件的“教学动线”设计:每一页都在引导学生思考,而非灌输知识
这套PPT最反常识的设计是:没有一页是纯文字知识点罗列。第6章Matplotlib的第一页PPT,标题是“你见过最丑的图是什么样?”,下面贴了三张图:一张Excel默认柱状图(无坐标轴标签、字体小、颜色刺眼)、一张学生初学Matplotlib画的图(坐标轴重叠、图例遮挡数据)、一张优化后的图(字体大小适中、配色柔和、留白合理)。然后提问:“哪张图能让医生一眼看懂高血压患者分布?为什么?”——这个问题把审美、可读性、业务目标全串起来了。
再比如第5章数据清洗的PPT,不讲fillna()语法,而是放一张体检报告扫描件截图,红圈标出三处问题:“舒张压:—”(缺失值)、“B超描述:未见明显异常(请结合其他检查)”(文本噪声)、“检查日期:2023/3/15”(格式不统一)。然后逐页演示:用df['舒张压'].isna().sum()统计缺失数→用df.groupby('年龄段')['舒张压'].mean()算均值→用df['舒张压'].fillna()填充→用df['B超描述'].str.replace('(.*?)', '')清理括号文本→用pd.to_datetime()统一日期。PPT动画是逐帧出现的,就像老师在黑板上一步步写,学生跟得上节奏。
还有一个隐藏技巧:所有PPT里的代码块,都用# 注释标注了“学生最容易错的点”。比如ch7_1_catplot.ipynb对应的PPT页,代码块里有:
sns.catplot(
data=df,
x='年龄段',
y='使用时长',
hue='APP类型',
kind='box' # ⚠️ 注意:这里必须是字符串'box',不是boxplot()函数!
)
这种细节,文档里永远不会写,但学生第一次用catplot时,90%会在这里卡住。
3.3 真实数据集的“业务语境”包装:让数据自己讲故事
很多教学数据集的问题是“干净得不像真的”。这套资料的数据集,刻意保留了真实业务中的“毛边”:
-
股票数据集(
stock_data_2020-2023.csv):包含trade_date(交易日)、stock_code(股票代码)、open/high/low/close(OHLC)、volume(成交量)、industry(所属行业)、market_cap_level(市值分层:大盘/中盘/小盘)。关键设计是:trade_date是字符串格式(“20230315”),不是datetime,逼学生用pd.to_datetime(df['trade_date'], format='%Y%m%d')转换;volume列有少量负值(交易所数据录入错误),需用df[df['volume']<0]定位后修正。这教会学生:真实数据永远不完美。 -
体检数据集(
health_check_2023_q3.xlsx):1287行,42列。其中b_ultrasound_desc(B超描述)是文本列,含“肝实质回声稍增粗”“双肾形态大小正常”“前列腺钙化灶”等非结构化文本;doctor_advice(医生建议)列含“定期复查”“低盐低脂饮食”“建议内分泌科就诊”等自由文本。ch5_4_text_extraction.ipynb教学生用str.extract(r'(\d+\.\d+)mm')从描述中抽尺寸,用str.contains('钙化')标记高风险,这就是NLP的入门级实战。 -
APP数据集(
app_usage_by_age_group.csv):字段为age_group(年龄段)、app_category(APP类型)、daily_minutes(日均使用时长)、launch_times(日均启动次数)。设计亮点是:age_group值为“18-24”“25-34”等字符串,不是数字,防止学生误用groupby().mean()直接求年龄段均值;daily_minutes和launch_times存在强相关性,但app_category不同,相关系数不同——这自然引出第7章sns.heatmap()的使用场景。
这些“毛边”不是缺陷,而是教学素材。学生处理一次“从B超文本中抽出血糖数值”,比背十遍str.extract()语法印象更深。
4. 实操过程与核心环节实现:以“体检数据清洗与可视化”全流程为例
现在,我们用一个贯穿全书的真实案例——“基于2023年第三季度体检数据,分析高血压风险人群分布,并生成可视化报告”——来演示这套资料如何在实际教学中运转。这个案例横跨第5章(清洗)、第6章(Matplotlib)、第7章(Seaborn)、第8章(pyecharts),是教师最常选用的结课项目。
4.1 第一步:数据载入与初步探查(对应ch5_1_load_csv.ipynb)
打开ch5_1_load_csv.ipynb,执行:
import pandas as pd
import numpy as np
import os
# 自动定位数据目录
data_dir = os.path.join(os.path.dirname(os.getcwd()), 'data')
file_path = os.path.join(data_dir, 'health_check_2023_q3.xlsx')
# 用openpyxl引擎读取xlsx,避免xlrd弃用警告
df = pd.read_excel(file_path, engine='openpyxl')
# 探查:看前5行、数据类型、缺失值统计
print("📊 数据概览:")
display(df.head())
print(f"\n📈 数据形状:{df.shape}")
print(f"\n📋 数据类型:")
display(df.dtypes)
print(f"\n⚠️ 缺失值统计:")
display(df.isna().sum().sort_values(ascending=False))
运行结果立刻暴露问题:舒张压缺失352条(27.3%),B超描述缺失18条,医生建议缺失41条。PPT第5章第3页就强调:“缺失率>20%的字段,不能简单删除,要考虑业务含义——舒张压缺失,可能意味着该次体检未测血压,而非数据丢失”。
4.2 第二步:针对性清洗(对应ch5_3_handle_missing.ipynb与ch5_4_text_extraction.ipynb)
清洗不是一步到位,而是分场景:
场景1:数值型缺失(舒张压)
用同年龄段均值填充,而非全局均值:
# 按年龄段分组,计算舒张压均值
bp_mean_by_age = df.groupby('年龄段')['舒张压'].mean().round(1)
print("各年龄段舒张压均值:")
display(bp_mean_by_age)
# 映射填充:创建映射字典,用map()高效填充
fill_dict = bp_mean_by_age.to_dict()
df['舒张压'] = df['舒张压'].fillna(df['年龄段'].map(fill_dict))
这里用map()而非apply(),是因为map()专为Series映射设计,速度更快,且自动处理未映射到的值(返回NaN,但此处所有年龄段都有均值)。
场景2:文本型噪声(B超描述)
清理括号内冗余信息,并提取关键术语:
# 清理括号及内容
df['b_ultrasound_desc_clean'] = df['b_ultrasound_desc'].str.replace(r'(.*?)', '', regex=True)
# 提取“钙化”“增粗”“囊肿”等关键词,生成风险标记
keywords = ['钙化', '增粗', '囊肿', '结节', '斑块']
for kw in keywords:
df[f'has_{kw}'] = df['b_ultrasound_desc_clean'].str.contains(kw, na=False)
# 合并为单一风险列
df['ultrasound_risk'] = df[[f'has_{kw}' for kw in keywords]].any(axis=1)
str.contains(kw, na=False)的na=False参数至关重要——它把原始数据中的NaN(缺失B超描述)视为False,避免清洗后新增缺失值。
场景3:日期格式统一(检查日期)
原始数据中检查日期列混有“2023/03/15”“2023-03-15”“2023年3月15日”,用pd.to_datetime()智能解析:
# 尝试多种格式,用errors='coerce'将无法解析的转为NaT
df['check_date'] = pd.to_datetime(
df['检查日期'],
format='mixed', # pandas 2.0+ 新参数,自动识别混合格式
errors='coerce'
)
# 删除无法解析的记录(通常极少)
df = df.dropna(subset=['check_date'])
format='mixed'是pandas 2.0的杀手锏,比手动写多个strftime格式高效十倍。
4.3 第三步:统计分析与可视化(对应ch6_3_scatter_plot.ipynb、ch7_2_health_risk_heatmap.ipynb、ch8_2_interactive_report.ipynb)
清洗完成后,数据进入分析阶段:
Matplotlib散点图(ch6_3_scatter_plot.ipynb):
画“收缩压 vs 舒张压”散点图,用颜色区分年龄段:
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
scatter = plt.scatter(
df['收缩压'],
df['舒张压'],
c=df['年龄段'].map({'18-24': 0, '25-34': 1, '35-44': 2, '45+': 3}),
cmap='viridis',
alpha=0.6,
s=30
)
plt.xlabel('收缩压 (mmHg)')
plt.ylabel('舒张压 (mmHg)')
plt.title('血压分布散点图(按年龄段着色)')
plt.colorbar(scatter, label='年龄段编码')
plt.grid(True, alpha=0.3)
plt.show()
这里cmap='viridis'比默认jet更科学(色盲友好),alpha=0.6解决点重叠问题,s=30让点大小适中。
Seaborn热力图(ch7_2_health_risk_heatmap.ipynb):
计算各年龄段高血压(收缩压≥140或舒张压≥90)异常率:
import seaborn as sns
# 定义高血压
df['hypertension'] = ((df['收缩压'] >= 140) | (df['舒张压'] >= 90))
# 透视表:年龄段 × 高血压状态
htn_pivot = df.pivot_table(
values='hypertension',
index='年龄段',
columns='性别',
aggfunc='mean'
).round(3) * 100 # 转为百分比
# 热力图
plt.figure(figsize=(8, 5))
sns.heatmap(
htn_pivot,
annot=True,
fmt='.1f',
cmap='RdYlBu_r',
cbar_kws={'label': '高血压异常率 (%)'}
)
plt.title('各年龄段、性别高血压异常率热力图')
plt.show()
cmap='RdYlBu_r'(红黄蓝反转)让高风险(红色)在左上角,符合阅读习惯;fmt='.1f'控制小数位,避免12.345678%这种不专业的显示。
pyecharts交互报告(ch8_2_interactive_report.ipynb):
生成可交互的HTML报告:
from pyecharts import options as opts
from pyecharts.charts import Page, Bar, Line, Pie
# 创建页面
page = Page(layout=Page.SimplePageLayout)
# 柱状图:各年龄段体检人数
bar = Bar()
bar.add_xaxis(df['年龄段'].unique().tolist())
bar.add_yaxis("人数", df['年龄段'].value_counts().sort_index().tolist())
bar.set_global_opts(title_opts=opts.TitleOpts(title="各年龄段体检人数"))
# 折线图:高血压异常率趋势
line = Line()
line.add_xaxis(df['年龄段'].unique().tolist())
line.add_yaxis("高血压异常率 (%)", htn_pivot.mean(axis=1).round(2).tolist())
line.set_global_opts(title_opts=opts.TitleOpts(title="高血压异常率趋势"))
# 饼图:性别分布
pie = Pie()
pie.add("", [list(z) for z in zip(df['性别'].unique(), df['性别'].value_counts())])
pie.set_global_opts(title_opts=opts.TitleOpts(title="性别分布"))
page.add(bar, line, pie)
page.render("health_report.html") # 生成HTML文件
执行后生成health_report.html,双击即可在浏览器打开,鼠标悬停看数值,拖拽缩放图表——这才是学生能拿去给实习单位展示的成果。
4.4 第四步:综合实训与交付(对应ch5_comprehensive_cleaning.ipynb与ch7_comprehensive_viz.ipynb)
最后,ch5_comprehensive_cleaning.ipynb模拟真实工作流:给出12个Excel文件(dept_1.xlsx到dept_12.xlsx),每个是不同科室导出的体检数据,字段名五花八门(“SBP”“收缩压”“sys_bp”都指收缩压,“DBP”“舒张压”“dia_bp”都指舒张压)。学生任务是:
1. 用glob批量读取所有Excel;
2. 用字典映射统一字段名;
3. 合并所有DataFrame;
4. 执行前述清洗流程;
5. 输出清洗报告(cleaning_report.csv),含各科室缺失率、重复率、清洗后记录数。
而ch7_comprehensive_viz.ipynb则要求学生用Seaborn制作一份“体检数据洞察报告”,至少包含:
- 分科室的高血压异常率柱状图;
- 年龄×性别的BMI分布箱线图;
- B超风险关键词词云(用wordcloud库)。
这两份实训文件,就是学生结课作品的雏形。教师只需微调数据集,就能变成不同学校的定制化项目。
5. 常见问题与排查技巧实录:那些深夜调试时摔键盘换来的经验
再完美的资料,也会遇到环境、版本、操作导致的问题。以下是我在全国23所院校师资培训中,收集到的TOP 5高频问题及独家解决方案,全部来自真实教学现场。
5.1 问题速查表:从报错信息直达解决方案
| 报错信息 | 根本原因 | 一键修复方案 | 出现场景 |
|---|---|---|---|
ModuleNotFoundError: No module named 'openpyxl' | 未安装Excel读取引擎 | 在终端执行 pip install openpyxl;若用conda,执行 conda install -c conda-forge openpyxl | ch5_1_load_csv.ipynb读取.xlsx时 |
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 10 | CSV文件编码非GBK(通常是UTF-8) | 将pd.read_csv('file.csv')改为pd.read_csv('file.csv', encoding='utf-8');或用Notepad++另存为UTF-8无BOM | ch4_1_basic_read.ipynb读取股票CSV时 |
UserWarning: FixedFormatter should only be used together with FixedLocator | Matplotlib版本升级后,plt.xticks()用法变更 | 删除plt.xticks(ticks, labels),改用ax.set_xticks(ticks); ax.set_xticklabels(labels);或升级到matplotlib>=3.7 | ch6_2_bar_chart.ipynb自定义x轴标签时 |
AttributeError: 'NoneType' object has no attribute 'groupby' | 前一步df = df.dropna()后,df为None(因inplace=True未设) | 检查所有dropna()、fillna()调用,确保inplace=False(默认),或显式写df = df.dropna() | ch5_2_handle_duplicates.ipynb去重后 |
OSError: Unable to open file (unable to open file: name = 'data/health_check_2023_q3.xlsx', errno = 2, error message = 'No such file or directory') | 数据文件未解压,或目录结构错误 | 确认解压后根目录下有data文件夹,且data内有health_check_2023_q3.xlsx;用!ls -R(Linux/Mac)或dir /s(Windows)检查 | 所有涉及数据读取的Notebook |
5.2 独家避坑技巧:让教学过程丝滑如德芙
技巧1:Jupyter内核“一键重置”法
学生常因多次运行import pandas as pd导致命名空间混乱。教他们用快捷键Ctrl+M(Mac为Cmd+M)进入命令模式,然后按0两次(00),即可重启内核并清除所有变量。比手动点菜单快10倍。
技巧2:PPT动画“三秒法则”
第6章Matplotlib PPT中,所有代码块动画设置为“单击出现”,且每行代码停留3秒。理由:学生抄代码需要时间,3秒是平均书写一行的时间阈值。少于3秒,学生抄不完;多于3秒,注意力涣散。
技巧3:数据集“最小压缩包”策略
整个资源包解压后约1.2GB,但学生不需要所有数据。告诉学生:data文件夹里只保留health_check_2023_q3.xlsx、stock_data_2020-2023.csv、app_usage_by_age_group.csv这三个文件,其余可删。实测节省85%磁盘空间,且不影响任何Notebook运行。
技巧4:中文显示“终极保险”方案
Matplotlib中文字体问题,用三行代码彻底解决:
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块
这三行放在每个Notebook最开头,比修改matplotlibrc文件更可靠,且不依赖系统字体。
技巧5:教师端“静默演示”技巧
上课演示时,不要让学生看着你敲代码。正确做法是:提前在Notebook里写好所有代码(含注释),演示时只做三件事:① 讲解这行代码做什么(指向代码);② 执行(Shift+Enter);③ 解释结果(指向输出)。全程不敲键盘,避免学生分心看手指,专注理解逻辑。
6. 教学文档的隐藏价值:电子教案、大纲、进度表如何真正赋能备课
很多人只关注PPT和代码,却忽略了这套资料里最被低估的部分:《Python数据分析与可视化》电子教案.doc、教学大纲.doc、教学进度表.doc、教材大纲.docx。它们不是摆设,而是教师备课的“作战地图”。
6.1 电子教案:不是PPT讲稿,而是“课堂对话脚本”
这份电子教案,每章按“课前准备-课堂导入-核心讲解-互动练习-课后拓展”五部分编写。以第5章为例:
-
课前准备:列出教师需提前做的3件事:① 下载最新版
openpyxl;② 检查机房电脑是否装有中文输入法(因B超描述含中文);③ 准备一张“体检报告单”实物,用于课堂展示。 -
课堂导入:设计了一个10分钟情景剧:“假设你是社区医院信息科新人,今天接到任务:整理上季度1287份体检数据,明天上午要向院长汇报高血压人群分布。你会怎么做?”——这个问题把学生瞬间代入业务角色。
-
核心讲解:不是复述PPT,而是标注“此处学生易混淆点”:比如讲
fillna()时,特别提醒“method='ffill'是向前填充,适用于时间序列,但体检数据是横截面,必须用value=指定具体值,否则填错”。 -
互动练习:给出一个“半成品Notebook”(
ch5_interactive_practice.ipynb),里面只有数据加载和问题描述,要求学生现场写出清洗代码,教师巡堂指导。 -
课后拓展:推荐两个真实开源项目:① GitHub上的
medical-data-cleaner(用正则清理医疗文本);② Kaggle上的heart-disease-prediction(用清洗后数据建模)。不是布置作业,而是打开视野。
6.2 教学大纲与进度表:让课时分配有据可依
这份教学大纲,明确区分了“必讲内容”和“选讲内容”。比如第12章图像数据分析,大纲注明:“必讲:图像读取、显示、简单滤波;选讲:HOG特征提取(仅限学有余力学生)”。教师可根据学生基础灵活裁剪。
教学进度表更是精确到“第几周第几课时讲什么”。例如第6周安排:
- 第1课时:Matplotlib基础语法(折线图、柱状图);
- 第2课时:plt.subplots()布局与tight_layout();
- 第3课时:综合实训ch6_comprehensive_viz.ipynb;
- 第4课时:学生作品互评。
每课时后标注“预期达成目标”,如第1课时目标是:“90%学生能独立绘制股票价格折线图,并添加标题、坐标轴标签、网格”。
6.3 教材大纲:为未来出版或校本教材铺路
这份教材大纲,已按高等教育出版社《Python数据分析》教材体例编写,含:
- 章节标题与学时分配;
- 每节“知识目标”“能力目标”“素养目标”;
- 配套习题(选择题、判断题、编程题);
- 拓展阅读(推荐《Python for Data Analysis》第5章);
- 思政融入点(如在股票分析中,强调“理性投资,防范金融风险”)。
这意味着,教师今天用这套资料开课,明天就能直接转化为校本教材,无需二次创作。
7. 最后一点真实体会:为什么我坚持推荐这套资料给同行
我第一次见到这套资料,是在去年冬天的某职业院校教师培训会上。一位教了18年《数据库原理》的老教师,课间拿着打印出来的ch5_3_handle_missing.ipynb问我:“这个用年龄段均值填充舒张压的写法,是不是比我们以前教的全局均值更合理?”我点头,他眼睛一亮,当场掏出手机拍下代码,说:“我下午就改教案。”
这件事让我意识到,真正的好教学资源,不在于有多炫的技术,而在于它能否让一线教师产生“啊,原来可以这样教”的顿悟。这套资料的价值,正在于此:它把十年教学沉淀下来的“哪里容易错”“学生卡在哪”“怎么讲才明白”,全部转化成了可执行的代码、可播放的PPT、可触摸的数据。它不假设学生是天才,也不要求教师是全栈高手,它只做一件事:降低教学交付的熵值,让知识流动更顺畅一点,让学生离真实业务更近一点。
如果你正在为开课焦头烂额,不妨打开ch1_demo_simple_analysis.ipynb,执行那5行代码,看着图表跳出来。那一刻,你会明白:教学,本可以如此简单。
简介:高校教师和培训机构可以直接用来开课的Python数据分析教学资源,包含12个章节的完整PPT课件(从Python基础、NumPy、Pandas数据清洗与统计,到Matplotlib/Seaborn/pyecharts可视化、时间序列分析、SciPy科学计算、统计与机器学习、图像数据分析),每章配套可运行的Jupyter Notebook例题代码(如ch2-ch12各章.ipynb)及综合实训文件(ch6/ch7/ch9等专项实训)。所有代码基于主流库编写,内置或附带真实业务场景数据集,比如股票行情、体检报告、APP类型分布等,支持开箱即用。教学文档齐全,含电子教案、教学大纲、进度表、教材大纲,覆盖课前备课、课堂演示、课后练习、项目实训全流程。学生自学也能跟着Notebook逐行执行、即时验证结果,快速掌握数据载入、清洗、聚合、建模、绘图等核心技能。
215



被折叠的 条评论
为什么被折叠?



