新零售智能销售数据可视化教案:从数据到经营决策

发布时间:2026/10/12 0:25:14
新零售智能销售数据可视化教案:从数据到经营决策 简介一份面向大数据技术类专业的《Python数据可视化实战》第七章教案以新零售智能销售数据为实战案例完整覆盖工程背景、数据读取、清洗与规约、基于pyecharts绘制销售分析图/库存分析图/用户分析图以及撰写工程分析报告的全流程。整份资源共1个PDF文件大小约120KB内容为排版清晰的教案文本便于直接阅读或打印。已有3537人学习下载。教案除主体教学过程外还整理了材料清单、教学目标与基本要求、引导性/探究性/拓展性问题、主要知识点、重点难点、理论及实验教学设计并列出教材与参考资料。教师可据此快速组织课堂或实训学生也能借助其中的问题链与实操步骤梳理数据分析思路从数据清洗到图表呈现逐步进阶理解如何将新零售业务数据转化为可视化洞察与决策建议。1. 新零售智能销售数据可视化教案讲好第7章的切入点培训机构或企业内部技能训练里最常看到的现象是讲师拿到“Python数据可视化实战 第7章 新零售智能销售数据可视化实战 教案”打开文档发现里面大多是代码截图和图形效果照着讲一遍学生只记住了函数名回到工位还是不知道怎么分析销售数据。这一章真正的教学目标不是多讲几个绘图 API而是让学生理解“新零售销售数据应该分析什么、为什么选这张图、结论怎么落到经营动作上”。这篇笔记写给三类人准备给学生或业务团队讲课的讲师、想把销售可视化引入日常工作的数据岗位新人以及需要把内部培训方案落地成教案的负责人。下面按备课顺序把数据准备、课程结构、可复现代码和课堂常见问题完整拆开。2. 教案备课先定数据新零售销售分析的维度、口径与造数脚本拿到教案先别急着翻图先把数据定下来。很多第7章课件翻车不是图不会画而是后面要用到的字段和口径在讲课当场对不上。一节90分钟的课在这上面纠缠20分钟教学节奏就断了。所以我会先花一小时把分析维度、表结构、口径三件事想清楚再进入课程设计。数据不稳后面每张图都是空中楼阁。2.1 人货场三个维度决定本章要画哪些图新零售销售可视化的分析框架我习惯用“人货场”来拆。人对应客流、客单价、复购率这些指标要看的是销售是否增长、增长来自更多人还是更多人花钱货对应品类结构、新品占比、折扣深度要看的是卖得好不好、结构是否健康场对应门店、区域、时段要看的是不同物理位置的产出差异。三个维度落到图表上人看折线图、箱线图和双轴图货看堆叠柱状图和帕累托图场看热力图、散点图和地图。把“智能”两个字放进教案不是要引入机器学习算法而是让图表带出对比和预警日销售额与7天移动平均对比异常尖峰一眼可见门店坪效和客单价做相关分析找出高客流低产出的店。这样讲学生看到的不再是一堆孤立图形而是一套会自己“说话”的经营分析仪表盘。课堂上的定位是教学可视化和常见的企业级数据可视化大屏有区别大屏强调实时刷新、动效和轮播课堂强调的是编码映射关系——哪一列数据映射到X轴、哪一列映射到颜色学生能看清才能复现。这个定位在第7章教案开头必须写明白否则学生容易把“炫酷”当成“有效”。教案里我还习惯加一张总览表把“人货场”和图表类型对应起来方便学生按图索骥。这张表不需要讲放在教案前面的“课程地图”里即可。它的作用是告诉学生本章的每一张图都不是随便选的背后有一个分析目标在支撑。这样到了作业阶段学生要自选图表时也有据可依而不是凭感觉挑一个“看起来好看的”。2.2 适合教案的数据集选型与三表造数脚本教案数据集有三种常见选择。第一种是公开数据集优点是真实、免费缺点是脏数据多、口径不明确学生会在清洗上消耗大量课时不适合90分钟的章节第二种是企业脱敏数据业务真实感强但往往要签保密协议而且真实数据的异常情况对新手不友好第三种是自己造数这也是我一般会采用的方案用一段固定随机种子的脚本生成半年销售数据老师可以控制数据里的“彩蛋”比如在7月埋一个促销尖峰、在某个门店埋一个客单价异常点课堂讲解时随时可抛问题。造数分三张表门店表store_area、订单表orders、品类表category_info。订单表是事实表包含订单日期、门店编号、品类、销售额、订单量、成本。门店表包含门店编号、门店名称、区域、营业面积。品类信息表包含品类编号和品类名称。用三张表而不是一张大宽表是为了让学生在课堂上练习一次merge理解业务系统里的数据到分析表的流转。如果直接把一张处理好的宽表发给学生练习就只剩画图了第7章会被降级成第6章的复习。生成脚本固定为下方这样关键点是随机种子和日期范围。种子固定学生和老师在任何机器上跑出来的数据完全一致日期范围建议选最近6个月既覆盖工作日和周末的周期性又能容纳一个促销尖峰折线图的课堂效果最好。门店我压到5家品类压到10个既有对比空间又不会让图例爆炸。import pandas as pd import numpy as np np.random.seed(42) # 固定随机种子保证课堂数据可复现 dates pd.date_range(2024-01-01, 2024-06-30, freqD) store_ids [S001, S002, S003, S004, S005] categories [fC{i:02d} for i in range(1, 11)] store_area pd.DataFrame({ store_id: store_ids, region: [华东, 华北, 华南, 西南, 华中], area_sqm: [120, 95, 150, 80, 110], }) records [] for d in dates: for s in store_ids: for c in np.random.choice(categories, size8, replaceFalse): order_cnt int(np.random.poisson(lam30)) unit_price round(np.random.uniform(20, 120), 2) sales_amount round(order_cnt * unit_price * np.random.uniform(0.8, 1.2), 2) cost round(sales_amount * np.random.uniform(0.55, 0.75), 2) records.append([d, s, c, order_cnt, sales_amount, cost]) orders pd.DataFrame(records, columns[ order_date, store_id, category_id, order_cnt, sales_amount, cost ]) orders.to_csv(orders.csv, indexFalse, encodingutf-8-sig) store_area.to_csv(store_area.csv, indexFalse, encodingutf-8-sig)代码里的三个参数最影响课堂效果lam30决定每个门店、每个品类每天的订单量基线数值越大折线图越平滑日期范围6个月折线图能呈现明显的周末周期同时给移动平均留出窗口sales_amount乘以0.8到1.2的随机系数是为了让日销售额有真实波动但不会出现量级离谱的离群点。如果学生基础偏弱可以把品类从10个减到6个堆叠柱状图的图例压力会小很多。有了这三张表第7章所有图表都能从订单表派生出来不需要额外采集数据。造完数之后我还建议顺手把数据文件放在一个叫data的子目录里和教案、作业.pdf分开。这样学生在写代码时只需要记住相对路径不会因为桌面文件混乱而找不到数据。课堂演示时老师也可以直接指定这个目录避免不同机器上路径不一致带来的环境纠纷。2.3 在教案里先写清数据口径避免课堂跑偏新零售销售分析里几个高频口径必须提前钉死。销售额是含税还是不含税直接决定同比是否可比订单量按支付订单算还是下单订单算退货订单会不会产生负值坪效的分母是营业面积还是建筑面积不同定义下同一个门店的坪效能差30%。我一般会把口径整理成一张表放在教案正文之前课堂上再讲结论时学生随时可以回看。字段/指标教案采用口径备注销售额支付成功订单的实付金额含税退款单单独处理不直接扣减订单量支付订单数不含已退款订单统计粒度到日客单价销售额 / 订单量按门店聚合时用总销售额除以总订单量坪效销售额 / 营业面积面积字段来自门店表品类一级品类共10个教案里只用一级品类不展开细分类目这个表格看起来简单但能挡住课堂上一半的争论。很多零售企业把促销费用和优惠券分摊逻辑改过好几轮假如学生拿企业里的真实数据来问教案里至少有一个明确基准。课时紧张时不需要解释每个口径的来龙去脉只需要说一句话“本教案所有图表按这个口径计算作业也按这个口径验收。”语气要肯定不要给学生留下“好像两种算法都可以”的模糊空间。数据口径还会影响图表里的结论措辞。比如销售额含税时节假日尖峰可能包含税率调整因素坪效用营业面积计算时门店仓库占比高的店会被低估。这些问题不一定要在课堂上展开但2.3这一节的内容应该原样写进教案的附录作为老师备课时的尺子。口径确定后就可以放心设计课程结构了。3. 教案主体结构设计三节递进练习与业务提问的衔接数据准备好下一步就是设计90分钟课时。教案最忌讳从头到尾按图形类型过一遍折线图、柱状图、饼图、散点图……每张图换一批数据学生记不住任何业务结论。第7章应改为按业务问题组织单元三个递进练习对应三层分析目标看趋势、看结构、看关系。这样课程结束学生能带走一个完整的分析逻辑而不只是几个函数名。3.1 三节课的切分趋势图→对比图→看板组合课程我按三个单元切分每个单元完成一张主图和一组配套参数。第一单元“日销售额与订单量趋势”教学目标是掌握时间序列折线图、7日移动平均、双Y轴核心结论是识别促销尖峰和季度走势。第二单元“品类销售结构与门店产出对比”教学目标是掌握堆叠柱状图、热力图和散点图核心结论是判断哪些品类撑起大盘、哪家店效率高。第三单元“组合成一张经营看板”把前两个单元的三图两表拼成一页教学目标落到分析结论和管理建议上。时间分配上每单元按25分钟讲原理、35分钟动手、20分钟讲评。原理部分不重复函数文档只讲“为什么这张图适合这个问题”动手部分让学生照着教案代码改参数讲评时抽两三个学生展示重点不是图好不好看而是问“从这个图里你得到一个什么经营判断”。90分钟的三个单元如果压缩到45分钟我会砍掉第三单元的看板组合把前两单元做扎实。教案在写这一节时我建议按“教学目标—数据表—核心代码—提问—作业”五段式组织而不是把代码截图堆在一起。这也是 .docx 教案和 PDF 讲义最常见的区别docx 会给老师留批注和修改空间PDF 更适合印给学生当参考。无论最终交付哪种格式五段式结构都要先固定下来。每一段之间用空行隔开老师翻阅时能快速定位到自己要讲的部分而不是在一大段代码里找结论。以90分钟为例我的时间表大致是这样前8分钟用最终看板效果图引入让学生知道这节课的终点长什么样8到33分钟做第一单元讲完折线图后立刻让学生跑通代码并标出异常日期33到58分钟做第二单元热力图和散点图一起讲因为它们都依赖pivot_table代码结构相似58到83分钟做第三单元不写新代码只调整现有图形的尺寸和图例拼成一页看板最后7分钟集中讲评作业要求。这个节奏下学生每个单元都动手不会出现“老师讲了50分钟代码”的疲惫期。3.2 从画图命令过渡到业务结论的课堂提问模板学生画完图最容易进入“画完就完”的状态。我常用的做法是给每个练习配一个三列表格第一列是图表第二列是视觉编码对应的字段第三列是必须回答的业务问题。这张表既是讲义的填空区也是课堂提问的题库。学生画完图不是结束而是要从第三列里选一个问题用图上的现象回答出来。图表类型视觉编码映射课堂必须回答的问题时间序列折线图X日期Y销售额颜色指标类型哪一天是异常尖峰促销是否有效堆叠柱状图X月份Y销售额颜色品类哪两个品类贡献最大结构变化趋势如何门店热力图X门店Y营业时段颜色坪效晚高峰出现在几点哪家门店低峰期过长散点图X客单价Y坪效颜色区域高客单门店一定高效吗有没有反例表格里的每个问题都对应一个管理动作异常尖峰引导到促销复盘品类结构引导到选品调整热力图引导到排班和营业时间散点图引导到门店分级运营。课堂上我会让学生先独立写出判断再同桌互讲最后全班集中点评。这样即使代码写得慢的学生也能从别人的图上学会读图课程参与度明显提高。如果某个学生答不上来不要直接给答案而是反问他“如果你是店长看到这张图后明天会做什么改变”把提问从“看图说话”升级成“决策模拟”。3.3 这一章和上一章的区别别把第7章讲成复习课如果教案前面第6章已经系统讲过matplotlib第7章的开头就不能再花大量时间解释plot和bar的参数否则学生会觉得第7章只是换了数据再来一遍。我在设计时会先展示一张“最终看板效果图”再反推拆解要做出这张看板需要哪些字段、哪些图形、哪些参数。这种“先看到结果、再补知识缺口”的安排比按图形顺序讲更容易抓住注意力。另一个区分点是分析深度。第6章的问题是“怎么画”第7章的问题是“画什么、为什么画、画完怎么用”。所以在教案里每一张图都要求配一段“读图结论”不接受只有图形没有结论的作业。这个要求会倒逼学生把图表当成分析工具而不是交付物本身。同样的数据默认折线图和定制的双轴图放在一起对比展示学生一眼能看到可视化的增益在哪里。作业布置也需要改。第7章的作业不要再用“用某某函数画出某某图”这种句式而是给业务场景“华东区S002店6月销售额下滑请用数据可视化找出原因并给出三条建议。”学生必须自己决定画什么图、用什么字段、怎么对比。验收时我只看两件事图能不能支持结论结论能不能对应到管理动作。至于用了seaborn还是matplotlib、用了哪种样式的图例都不重要。这样教出来的学生换一份数据也能上手。4. 用 Python 把第7章的课堂案例跑通代码、参数与改法下面把三张表读入按教案里的三节课分别落到代码每段都可以直接拷进 Jupyter Notebook 跑。参数设置我按课堂演示习惯来图比较大、字体明确、颜色少而可区分。实际教学中不需要让学生背参数而是要让他们知道每个参数改大改小有什么影响。参数是可视化里最容易“改着改着就翻车”的环节所以我会在每段代码后单独说一遍。4.1 日销售额折线图与移动平均两个必调参数第一单元的代码目标是把订单明细聚合到日画出销售额折线和7日移动平均同时用双Y轴叠加订单量。这里的两个必调参数是rolling窗口和twinx的透明度它们直接决定折线图是“能看清趋势”还是“糊成一团”。import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, PingFang SC] plt.rcParams[axes.unicode_minus] False orders pd.read_csv(orders.csv, parse_dates[order_date]) daily ( orders.groupby(order_date) .agg(sales(sales_amount, sum), order_cnt(order_cnt, sum)) .resample(D) .sum() ) daily[sales_ma7] daily[sales].rolling(7, min_periods3).mean() fig, ax1 plt.subplots(figsize(12, 5)) ax1.plot(daily.index, daily[sales], color#2E86AB, label日销售额) ax1.plot(daily.index, daily[sales_ma7], color#D64933, linestyle--, label7日移动平均) ax2 ax1.twinx() ax2.bar(daily.index, daily[order_cnt], color#999999, alpha0.2, label订单量) ax1.set_title(日销售额与订单量趋势6个月, fontsize14) ax1.set_xlabel(日期) ax1.set_ylabel(销售额元) ax2.set_ylabel(订单量单) lines1, labels1 ax1.get_legend_handles_labels() lines2, labels2 ax2.get_legend_handles_labels() ax1.legend(lines1 lines2, labels1 labels2, locupper left) plt.tight_layout() plt.show()逻辑说明主体是groupby之后的resample把订单明细聚合到日再按日求和。rolling(7)生成周移动平均min_periods3让数据开头几天也画出曲线而不是出现空段。twinx生成右侧Y轴订单量用同一根时间轴的低透明度柱作背景避免与销售额折线抢视觉权重。参数说明窗口取7是因为零售行业天然以周为周期工作日与周末交替如果业务粒度是小时可以改成24如果数据跨度是一年可以把窗口改成30看月度平滑曲线。颜色选择上主线和移动平均线选高对比蓝红背景柱用灰色这三色同时出现在一张图里也不会让色盲学生无法区分。图例合并使用get_legend_handles_labels单独调用plt.legend容易只显示第一个轴的图例这是新手最常忽略的点。4.2 品类结构堆叠柱状图Top N截断与图例排布第二单元的第一张图是月度品类销售结构。很多学生直接拿10个品类去画结果图例占掉半张图。这里要教给他们一个重要的可视化习惯先截断再聚合把贡献小的品类合进“其他”让图形信息密度可控。monthly_cat orders.pivot_table( indexorders[order_date].dt.to_period(M), columnscategory_id, valuessales_amount, aggfuncsum ) top5 monthly_cat.sum().sort_values(ascendingFalse).head(5).index monthly_cat[其他] monthly_cat.drop(columnstop5).sum(axis1) monthly_cat monthly_cat[list(top5) [其他]] ax monthly_cat.plot.bar( stackedTrue, figsize(12, 5), colormapviridis, width0.8 ) ax.legend(ncol3, fontsize9, locupper center, bbox_to_anchor(0.5, -0.15)) ax.set_title(月度品类销售额结构, fontsize14) ax.set_xlabel(月份) ax.set_ylabel(销售额元) plt.xticks(rotation0) plt.tight_layout() plt.show()逻辑说明pivot_table把数据转成“月份×品类”的二维结构行是月列是品类值是销售额。top5先去重排序取前5个品类剩下的品类加总成“其他”这一步能让柱状图保持在6个色块以内。drop(columnstop5)把前5列从原表去掉再对行求和正好是剩余品类的月度合计。参数说明colormap取viridis而不是默认tab10因为viridis在黑白打印时仍有明显区分度width控制柱子间的间隙0.8时柱间留出可读间隔改成0.5会显得紧密。legend的bbox_to_anchor把图例挪到图外底部避免图内色块说明挤压柱体。如果品类特别多head(5)可以改成head(8)但颜色会开始接近建议宁可多压一个“其他”桶也不要让图例超过7项。4.3 门店×时段坪效热力图先转换成二维透视热力图是学生接受度最高的一张图因为颜色深浅比看数字快得多。它的前置步骤是pivot_table转二维矩阵这一步卡住过不少人。我讲的时候会强调热力图本质是“表格的画法”而不是“坐标图的画法”所以先要把长表转成宽表。import seaborn as sns orders[hour] orders[order_date].dt.hour store_hour orders.pivot_table( indexhour, columnsstore_id, valuessales_amount, aggfuncsum ) store_area pd.read_csv(store_area.csv) store_hour store_hour.div(store_area.set_index(store_id)[area_sqm], axis1) fig, ax plt.subplots(figsize(10, 6)) sns.heatmap( store_hour, annotTrue, fmt.0f, cmapYlOrRd, linewidths0.5, linecolor#FFFFFF, axax ) ax.set_title(门店分时段坪效元/平方米, fontsize14) ax.set_xlabel(门店) ax.set_ylabel(营业时段小时) plt.tight_layout() plt.show()逻辑说明先抽出小时字段pivot_table生成“小时×门店”的二维矩阵此时每个单元格是某门店某小时的销售额还没有消除门店面积差异。用div方法按列除以门店面积整张表就变成坪效。heatmap里的annotTrue把数值直接印在格子里fmt.0f控制只保留整数课堂演示时学生一眼能看到高峰时段对应的门店编号。参数说明cmap选YlOrRd颜色从浅黄到深红适合表达“低到高”和销售额这类数值的直觉一致想表达“偏离平均值”时应换用RdBu_r让低于基准显示蓝色、高于基准显示红色。linewidths和linecolor是描边门店数多时给白描边能避免色块边界粘连。如果门店数超过10家annotTrue会让格子拥挤这时关掉annot只靠颜色深浅判断高低。4.4 客单价与坪效散点图叠加趋势线的拟合方式散点图放在最后因为它需要学生对业务有更多理解客单价高不一定坪效高两张图叠在一起才能看出门店效率的分化。这段代码里最值得讲的是numpy的多项式拟合它能帮学生回答“这两个指标到底有没有关系”。import numpy as np store_stat orders.groupby(store_id).agg( sales(sales_amount, sum), order_cnt(order_cnt, sum) ) store_stat[avg_price] store_stat[sales] / store_stat[order_cnt] store_stat store_stat.reset_index().merge( store_area[[store_id, area_sqm, region]], onstore_id, howleft ) store_stat[pingxiao] store_stat[sales] / store_stat[area_sqm] coef np.polyfit(store_stat[avg_price], store_stat[pingxiao], 1) trend np.poly1d(coef) fig, ax plt.subplots(figsize(9, 6)) ax.scatter( store_stat[avg_price], store_stat[pingxiao], s80, cstore_stat[region].astype(category).cat.codes, cmapSet2 ) x_smooth np.linspace( store_stat[avg_price].min(), store_stat[avg_price].max(), 50 ) ax.plot(x_smooth, trend(x_smooth), --, color#333333, label线性趋势) for _, row in store_stat.iterrows(): ax.annotate( row[store_id], (row[avg_price], row[pingxiao]), xytext(5, 5), textcoordsoffset points, fontsize9 ) ax.set_title(客单价与坪效散点图, fontsize14) ax.set_xlabel(客单价元) ax.set_ylabel(坪效元/平方米) ax.legend() plt.tight_layout() plt.show()逻辑说明先按门店聚合销售和订单量算出客单价再merge门店表拿面积算出坪效。np.polyfit用1次多项式拟合返回斜率和截距np.poly1d把系数包装成可调用的函数用linspace生成一条平滑直线而不是把五个月亮点直接连线是为了表达整体趋势。区域用category编码成颜色能看出同区域门店是否聚在一起。参数说明s控制散点大小80在五六个门店时刚好门店超过20个要减到30否则点会重叠polyfit的degree1就是线性相关想看非线性关系可改成2或3但课堂演示不建议学生容易误读拐点。annotate的xytext(5,5)让标签从点向右上偏移5个像素防止文字压住散点门店名如果重复或区域太近可以去掉annotation只保留颜色分组。5. 教案演示的常见问题5条踩坑记录与解决步骤下面五条是我在真实课堂上踩过或见过的常见问题按出现频率排序。每条按现象、原因、解决三部分写它们大多不是代码语法错误而是环境、字体和数据结构在“多人多机”场景下才暴露出来的问题。第7章是实战章学生会带着各自的电脑来上课这些问题避不开只能提前预防。5.1 中文标签在演示机器上变成方块现象教案代码在自己电脑上运行正常换到教室投影的教师机图表标题和坐标轴的中文全部变成方块。原因matplotlib默认字体列表里没有中文字体之前代码设置的SimHei在目标机器上不存在或者axes.unicode_minus未处理导致负号也乱码。很多老师习惯在某一张图前临时设置字体第一张图正常换一段代码后又失效。解决在教案notebook的第一个单元格做一次全局设置并列出候选字体import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, PingFang SC] plt.rcParams[axes.unicode_minus] FalseSimHei对应Windows系统、Microsoft YaHei对应Win10及以上、PingFang SC对应macOS。Linux还缺字体时用fc-list查系统里有没有中文字体没有就装fonts-wqy-microhei。教案文档里也要加一句提醒让老师到教室先跑这个单元格而不是等画图时才排查。5.2 横坐标日期过密整张图糊成一条黑线现象日粒度数据直接调用plt.plotX轴日期全部显示90天的图缩成一片标签互相重叠变成黑色块。网上搜“python画图横坐标太密集”大多是这个场景。原因matplotlib默认对日期的刻度策略在跨度长、点密集时不适用每个日期都想标一个标签。解决用日期定位器和格式化器控制显示密度import matplotlib.dates as mdates ax.xaxis.set_major_locator(mdates.DayLocator(interval7)) ax.xaxis.set_major_formatter(mdates.DateFormatter(%m-%d)) plt.setp(ax.get_xticklabels(), rotation45, haright)DayLocator(interval7)让刻度每7天出现一个DateFormatter把格式改成“月-日”rotation45解决长标签互相压住。跨度是半年interval取7合适跨度一年以上时改用MonthLocator每月标一个即可。这个参数组合也能直接用在4.1的折线图上不改其他代码。5.3 品类太多堆叠柱状图的图例挤成一团现象10个品类全部画进堆叠柱状图图例占掉半张图颜色接近的品类难以区分。原因默认颜色循环对超过7个系列区分度严重下降图例又没有排布策略。解决先做Top N截断把剩余品类合并成“其他”。代码中取top5后drop累加即可前面4.2的写法可以直接复用。图例排布用ncol3并把位置放到图外底部。如果必须保留全品类用matplotlib.cm按等间隔取色不要用默认循环import matplotlib.cm as cm colors [cm.viridis(i / 12) for i in range(10)]把colors传给plot.bar(colorcolors)可以保证相邻品类色相分布均匀。这个做法同样适用于饼图和面积图。课堂上我会直接演示“10个品类默认画法”和“Top5其他画法”的对比学生看完就明白为什么要截断。5.4 学生机运行报 ModuleNotFoundError教师机却正常现象课堂上学生复制教案代码运行提示ModuleNotFoundError: No module named seaborn或openpyxl教师机完全正常。这类问题最像玄学但根因几乎都是环境不一致或路径不对。原因教学镜像环境不一致学生自己在终端里pip install的包没有进当前内核或者读文件路径不对导致报错被误以为是缺包。解决教案开头给一个requirements.txt里面固定pandas、matplotlib、seaborn、pyecharts版本第一节课统一装好。读文件不要用相对裸路径改用相对脚本路径from pathlib import Path DATA_DIR Path(__file__).resolve().parent / data orders pd.read_csv(DATA_DIR / orders.csv, ...)在Jupyter Notebook里__file__不可用可改用os.getcwd()拼接当前目录。这行代码看起来简单却能挡住一半以上“环境问题”因为工作目录不对时学生第一反应是代码有问题实际上数据文件根本没读到。教案里我会直接在第一章就放这个路径设置而不是等报错后再补。5.5 销售额 join 门店信息后翻倍坪效出现离奇值现象学生用merge把订单表和门店表连接后按门店汇总的销售额比原始数据大好几倍坪效动辄上万。原因门店表store_id不唯一或连接键选错一对多连接让订单记录重复还有一种情况是store_area读入后索引没有对齐div按索引除时错位。解决合并之前先做唯一性检查print(store_area[store_id].duplicated().sum()) store_area store_area.drop_duplicates(subsetstore_id)再确认orders里的store_id没有缺失值。我更推荐在教案里把这个错误设计成一个课堂陷阱先让学生跑出离谱结果再引导他们检查重复值和连接键学生对“join前先查唯一性”的记忆会深刻得多。6. 进阶把第7章的静态图升级成可交互看板并导出 HTML6.1 用 pyecharts 快速复刻折线图与柱状图课堂画完静态图后我习惯再花10分钟演示一次pyecharts。原因是企业里真正给业务方看的销售看板底层大多是echarts这一套交互组件学生如果能用Python导出交互HTML就提前接上了企业级数据可视化的门槛。复刻4.1的折线图只需要接着用daily这个DataFramefrom pyecharts import options as opts from pyecharts.charts import Line line ( Line() .add_xaxis([d.strftime(%m-%d) for d in daily.index]) .add_yaxis(日销售额, daily[sales].round(0).tolist(), is_smoothTrue) .set_global_opts( title_optsopts.TitleOpts(title日销售额趋势6个月), datazoom_opts[opts.DataZoomOpts()], xaxis_optsopts.AxisOpts( axislabel_optsopts.LabelOpts(rotate45, intervalauto) ), ) ) line.render(daily_sales.html)datazoom组件是这里最值得讲的新东西它让用户拖拽缩放时间范围matplotlib里要做滑块控件才能实现pyecharts只需要一行配置。滚动查看长周期趋势时这种交互比静态图更适合演示。HTML用浏览器打开就能用完全不依赖Python环境。如果想组合多张图pyecharts的Tab或Page组件可以把折线图和柱状图放在同一个文件里适合交给业务方自己点选查看。6.2 交付业务方时优先导出 HTMLflaskecharts 留到下一步常见做法是用flaskecharts把数据接口和页面包成一个小型dashboard但教案验收阶段和课堂演示阶段我不建议直接上服务。服务一跑就要面对端口占用、环境变量、进程管理这些额外问题和本章主题无关。先用line.render()输出静态HTML在浏览器里达到同样的交互效果后期确有实时刷新需求再包一层Flask定时读表。数据文件更新时重新生成一次HTML也完全够用对新手更友好。以pyecharts的set_global_opts为教学重点还有一个好处学生能在这里直观理解“配置项”和“参数”的区别。matplotlib里改的是函数参数pyecharts里改的是配置对象这种概念迁移对后续学任何前端图表库都有帮助。我现在的习惯是教案里每个案例都导出一份HTML放在课程资料里学生课后自己打开拖动数据范围比盯着PDF讲稿复盘有效得多。教案如果以PDF交付我会在相应章节截取看板效果图如果以docx交付会把HTML链接附在课后阅读部分。这个习惯帮我省掉了大量课后答疑也希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询