返回课程总览

实验 05 · 阶段检查

Python 阶段性小作业:数据总结与可视化

完成一个多文件 Python 数据总结项目,生成 results.txt 和 matplotlib 可视化,并记录 OpenCode 取舍。

完整讲义

实验 5:Python 阶段性小作业:数据总结与可视化

目标

在进入 MATLAB 之前,完成一个小型 Python 项目。这是第一次阶段性检查, 要求你把 PowerShell、VS Code、OpenCode、Python 文件、实验笔记、输出文件、 matplotlib 图像和人工数学检查组合起来使用。

这次不再逐步解释 OpenCode 的每个界面元素,但仍要复用 Lab 4 的完整闭环:确认模型, 在 Plan 模式做只读检查,切换到 Build 模式实现,运行程序,在 PowerShell 中查看 git diff,最后根据数学结果接受或拒绝建议。

开始前复用 Lab 4 的 Git 检查点流程:用 git status 确认工作区干净;完成全部人工检查后, 按相同方法提交 Lab 5 检查点。这里不再重复 Git 命令块。

数学问题

程序如何总结一个小数据集,并用图像检查这些总结在数学上是否合理?

使用数据集:

[2, 4, 5, 7, 11, 13]

完成后的项目必须计算:

  • 个数;
  • 总和;
  • 平均值;
  • 最小值和最大值;
  • 中心化后的值,即每个值减去平均值;
  • 平方偏差;
  • 平方偏差和;
  • 平均平方偏差。

同时生成一张可复现的图像,帮助检查原始数据、中心化值和平方偏差之间的关系。

目录结构

创建如下目录结构:

labs/lab05/
  README.md
  main.py
  analysis_helpers.py
  plot_helpers.py
  prompts.md
  results.txt
  figures/
    data-summary.png
小知识:为什么项目要拆成多个文件?

拆分的目的不是让项目看起来更大,而是建立清楚边界:analysis_helpers.py 负责数值计算, plot_helpers.py 负责画图,main.py 负责组织流程。这样修改图像时不必同时触碰数学函数, 也能分别检查各部分。拆得过细同样会增加来回寻找文件的成本,因此合理标准是“一个文件有 一个清楚职责”,而不是规定每个文件必须有多少行。

多文件 Python 如何协作

本项目由一个入口文件和两个职责明确的模块组成:

main.py
  ├─ 从 analysis_helpers.py 取得数值计算函数
  ├─ 从 plot_helpers.py 取得绘图函数
  └─ 把文本结果和图像写入约定位置

main.py 是入口文件,负责定义数据并组织执行顺序。analysis_helpers.py 只接收数据并返回 计算结果,plot_helpers.py 只根据已有结果生成图。import 不会把另一个文件的文字复制进 当前文件,而是让 Python 加载模块,并使其中定义的函数可以被当前程序调用。

Starter 末尾的结构:

if __name__ == "__main__":
    main()

表示只有直接运行 main.py 时才执行完整流程;其他文件导入其中的函数时不会自动重跑项目。 __file__ 表示当前 Python 文件本身的位置。用它确定 results.txtfigures/,可以让输出 位置相对于项目文件保持稳定,而不依赖 PowerShell 当时位于哪个目录。

第三方包与可视化

pathlib 等标准库随 Python 一起安装;matplotlib 是第三方包,需要单独安装。 命令 python -m pip install matplotlib 表示让当前 python 对应的解释器运行包管理模块 pip,从而降低“安装到了另一个 Python 版本”的可能性。

本项目中的三组量不适合强行共用一个纵轴:原始数据和中心化值使用原数据单位,平方偏差使用 平方单位,而且数值范围不同。图像应使用三个上下排列的分面图,共用数据点编号作为横轴, 但每个子图使用自己的纵轴和标签:

子图 展示内容 人工检查
原始数据 [2, 4, 5, 7, 11, 13] 顺序与数据集一致
中心化值 每个值减去平均值 同时出现正值、负值和零
平方偏差 中心化值的平方 全部非负,单位变为平方单位

分面不是为了装饰,而是避免不同含义和尺度的量相互遮盖。三个子图仍使用相同的数据点编号, 所以读者可以纵向比较同一个数据点的三个阶段。

设置

  1. starters/lab05/ 中的所有文件复制到 labs/lab05/
  2. notes/lab05-notes.md 中记录实验过程。
  3. 运行 starter 项目:
python labs\lab05\main.py

OpenCode 工作流

从课程根目录启动 OpenCode:

opencode

输入 /models,确认提供商是 OpenCode Go,模型是 DeepSeek V4 Pro,完整模型标识为 opencode-go/deepseek-v4-pro。把这三项和 opencode --version 的结果记录到 prompts.md

Tab 切换到 Plan 模式,先进行只读检查,并把提示词保存到 prompts.md

先查看 labs/lab05 中已有的文件,不要修改任何文件。
说明 main.py、analysis_helpers.py 和 prompts.md 当前分别负责什么,
再列出完成数据总结、结果文件和可视化还缺少哪些内容。

确认 OpenCode 没有修改文件,并检查计划是否只涉及 labs/lab05/。再按 Tab 切换到 Build 模式,输入并记录实现提示词:

我具备基础 Python 知识。请在 labs/lab05 中扩展这个入门项目。
为中心化值、平方偏差、平方偏差和以及平均平方偏差添加辅助函数。
更新 main.py,让它输出计算结果,并把结果写入 results.txt。
添加适合初学者阅读的 plot_helpers.py,使用 matplotlib 将图像保存到
figures/data-summary.png。使用三个上下排列的分面图展示原始数据、中心化值和平方偏差;
三个子图共用数据点编号,但每个子图使用自己的纵轴和标签。
保持代码简单易读,不要使用类、pandas 或 numpy。
完成条件:results.txt 必须包含个数 6、最小值 2、最大值 13 和平方偏差和 90,
并包含其他要求的统计量;图像文件必须由 main.py 重新生成。
完成后说明修改了什么,以及我应该如何手算检查结果。

实现完成后保留 OpenCode 会话,在 VS Code 的第二个 PowerShell 终端运行:

git status
git diff -- labs\lab05

逐项检查修改是否只发生在 labs/lab05/,数据集和计算定义是否保持不变。还要检查 main.py 是否只组织流程、计算函数是否留在 analysis_helpers.py、绘图函数是否留在 plot_helpers.py,以及所有输出路径是否由脚本位置确定。把一项接受的修改和一项被你修改 或拒绝的建议写入 prompts.md,并写明判断依据。

再问一个解释类提示词:

请逐行解释 labs/lab05/main.py、labs/lab05/analysis_helpers.py 和
labs/lab05/plot_helpers.py。重点说明代码对应的数学含义,
并指出哪些部分需要我自己验证。

如果 matplotlib 没有安装,先在 PowerShell 中运行:

python -m pip install matplotlib

然后重新运行项目:

python labs\lab05\main.py

人工检查

对于数据集 [2, 4, 5, 7, 11, 13],手算检查:

  • 个数是 6
  • 总和是 42
  • 平均值是 7
  • 最小值是 2
  • 最大值是 13
  • 中心化后的值是 [-5, -3, -2, 0, 4, 6]
  • 中心化后的值相加为 0
  • 平方偏差是 [25, 9, 4, 0, 16, 36]
  • 平方偏差和是 90
  • 平均平方偏差是 15

再检查图像:

  • 原始数据图应该显示数据整体上升,但不是等间距上升;
  • 中心化值图应该围绕 0 上下分布;
  • 平方偏差图应该全部非负,并且离平均值越远的点越高;
  • 三组量使用三个分面图,每个子图有自己的纵轴标签;
  • 图像文件应该保存为 labs/lab05/figures/data-summary.png

README 要求

labs/lab05/README.md 中写清楚:

  • 使用了什么数据集;
  • 程序计算了哪些总结值;
  • results.txt 是否明确记录个数 6、最小值 2、最大值 13 和平方偏差和 90
  • 图像展示了哪些量;
  • 图像是否支持你的数值检查;
  • 如何从 PowerShell 运行项目;
  • 一个你手动检查的结果;
  • 一个你接受的 OpenCode 建议;
  • 一个你修改或拒绝的 OpenCode 建议。

完成内容

  • labs/lab05/main.py
  • labs/lab05/analysis_helpers.py
  • labs/lab05/plot_helpers.py
  • labs/lab05/README.md
  • labs/lab05/prompts.md
  • labs/lab05/results.txt
  • labs/lab05/figures/data-summary.png
  • notes/lab05-notes.md
  • PowerShell 输出截图

Checkpoint

完成后确认:

  • python labs\lab05\main.py 可以从课程根目录运行;
  • results.txt 被创建或更新;
  • results.txt 中的个数是 6、最小值是 2、最大值是 13、平方偏差和是 90
  • figures/data-summary.png 被创建或更新;
  • 你能解释为什么中心化后的值相加为零;
  • 你能解释为什么平方偏差图中所有柱子都不低于零;
  • 你能解释入口文件、两个模块和 import 之间的关系;
  • 你能解释为什么平方偏差不与原始数据强制共用同一个纵轴;
  • 提示词记录中至少包含一个接受的 OpenCode 建议和一个被修改或拒绝的建议。
  • prompts.md 记录了 OpenCode 版本、OpenCode Go、DeepSeek V4 Pro、只读检查、实现提示词

和一次 git diff 检查。

  • git status 在提交 Lab 5 检查点后再次显示工作区干净。

下一实验使用同一数据集、同一组手算答案和同一种三分面图,在 MATLAB 中重新实现完整流程。 数学问题保持不变,因此可以把注意力集中在新语言的脚本、索引和数组运算上。