最小工作流是:项目文件夹中放数据、代码和输出;从项目根目录运行;脚本按顺序读入、处理、分析、保存。
不要把 C:\Users\某人 这样的绝对路径写死。相对路径与统一目录结构让队友可以复现。
建议目录:data/raw、data/clean、src、output/figures、output/tables。脚本入口记录版本、参数和随机种子。
开赛先建立共享项目骨架和 README。README 只需写环境版本、运行入口、输入文件和输出位置。
环境、路径、脚本与输出
同一段代码在队友电脑报“找不到文件”,最常见原因是模型错了吗?
最小工作流是:项目文件夹中放数据、代码和输出;从项目根目录运行;脚本按顺序读入、处理、分析、保存。
不要把 C:\Users\某人 这样的绝对路径写死。相对路径与统一目录结构让队友可以复现。
建议目录:data/raw、data/clean、src、output/figures、output/tables。脚本入口记录版本、参数和随机种子。
开赛先建立共享项目骨架和 README。README 只需写环境版本、运行入口、输入文件和输出位置。
比较三种文件组织。
作者勉强能找,队友几乎无法运行。
项目根目录下 data/raw/sales.xlsx。
Python:pd.read_excel('data/raw/sales.xlsx')。
MATLAB:readtable('data/raw/sales.xlsx')。
把清洗结果写入 data/clean,而不是覆盖原文件。
队友复制整个项目文件夹后,无需修改用户名和盘符即可运行。
答案默认隐藏。聚焦题卡后按 ↓ 或 Space,一次只揭晓一道。
换电脑后仍应成立。
data/raw/data.xlsx。它是相对项目根目录的路径,不依赖个人用户名和盘符。
Raw 是不可替换的证据。
错误。原始数据应保留,清洗结果另存,才能追溯和重做。
让队友不用问作者就能运行。
环境/版本、运行入口、输入文件位置、输出结果位置;也可写依赖安装和参数说明。
随机性需要被固定。
随机种子。相同算法、数据和随机种子才能复现随机过程。
先看形状,再写公式
两个都叫“长度 5”的数组,为什么相乘会报错或得到意外结果?
向量和矩阵是建模计算的基本容器。写任何运算前先看 shape/size:有多少行、多少列,每一维代表什么。
MATLAB 索引从 1 开始;Python/NumPy 从 0 开始。逐元素乘法与矩阵乘法含义不同。
NumPy:* 是逐元素,@ 是矩阵乘;MATLAB:.* 是逐元素,* 是矩阵乘。矩阵 A(m×n) 与 B(n×p) 才能做 AB。
每个关键数组旁写注释:行=样本、列=指标。报错先打印形状,不要盲目加转置。
比较三种排错习惯。
错误可能消失,但语义可能已经错。
3 个方案、4 个指标的矩阵 X,权重 w 有 4 个。
X 形状为 3×4。
w 作为 4×1 列向量。
Xw 得到 3×1,每个方案一个得分。
若 w 写成 1×4 行向量,矩阵乘法维度不匹配;应确认语义后改变形状。
答案默认隐藏。聚焦题卡后按 ↓ 或 Space,一次只揭晓一道。
矩阵乘法:(10×3)(3×1)。
10×1。内维 3 匹配,保留外维 10 与 1。
两种语言最常见差异之一。
错误。Python/NumPy 从 0 开始,MATLAB 从 1 开始。
区分 element-wise 与 matrix multiplication。
@。* 通常是逐元素相乘。
能跑不等于算对。
转置可能让计算形式可运行,却改变行列语义;应先确认每一维代表什么,再决定是否转置。
先看表,再开始算
read_excel 没报错,为什么后面的均值仍可能全是空值?
读入成功只说明文件打开了,不说明数据类型、缺失值和列名正确。
第一轮检查应包括行列数、前几行、列名、数据类型、缺失数和唯一值。
Python 常用:head、shape、dtypes、isna().sum、describe;MATLAB 常用:head、size、summary、ismissing。
把数据概况自动导出为一张 quality_report 表,论文的数据预处理章节可直接引用关键发现。
观察从“能打开”到“可信数据”的距离。
类型和缺失问题会潜伏到后续。
金额列含“1,200元”“—”“ 850 ”。
去掉逗号、单位和首尾空格。
将“—”定义为缺失,而不是 0。
转换为数值并统计转换失败的记录。
清洗后金额为数值列;转换失败数必须被记录,不能静默丢失。
答案默认隐藏。聚焦题卡后按 ↓ 或 Space,一次只揭晓一道。
先验证输入。
行列数、列名、类型和缺失。它们决定后续计算是否可信。
未知不等于没有。
错误。缺失表示未知,0 表示真实零金额,含义不同;填补方法必须基于业务。
想想为什么无法求和或按时间排序。
数字被读成文本;日期被读成普通字符串;分类编码混入异常字符等。
任何数据损失都应有记录。
记录数量和位置,再根据规则处理。可追溯比静默消失重要。
改变数据量和单次运算复杂度,比较逐项循环与批量数组运算的估算成本。
调整左侧参数,观察模型输出怎样变化。
向量化更快是否意味着任何循环都应删除?写出至少一个仍适合保留循环的场景。
先正确,再复用,再提速
一段代码复制了 6 次,只改列名,最可能埋下什么风险?
函数把一项清楚任务封装成输入—处理—输出,可减少重复并方便测试。
向量化让数组一次参与运算,代码更接近数学公式,通常也更快;但逻辑复杂时,清楚的循环仍然合理。
先用小数据写出正确版本;再封装函数;最后用数组运算替换无必要的逐项循环。优化前后必须核对结果一致。
为关键函数准备 2–3 个小测试:正常、边界、异常。比赛中改一处后立刻运行测试,避免影响整条流水线。
比较复制、函数与测试。
改规则时容易漏掉一段。
多列指标需要按 max−x 转换。
写函数接受一列数值并返回 max(x)−x。
用小数组 [2,5,8] 验证结果 [6,3,0]。
对指定列批量调用,不复制三段代码。
规则只维护一处;若改为区间型指标,只替换函数实现。
答案默认隐藏。聚焦题卡后按 ↓ 或 Space,一次只揭晓一道。
函数代表可重复的小任务。
一项逻辑重复使用且输入输出明确。
清晰性也要考虑。
错误。简单数值运算通常更清晰,但复杂状态更新或早停逻辑可能用循环更直观。
每个元素从最大值中减。
max=8,所以 y=[6,3,0]。原值越小,转换后越大。
速度不能以正确性为代价。
提速或改写可能改变索引、广播、精度或边界行为;一致性检查证明优化没有改变模型含义。
数据—图形—结论一致
绘图函数运行成功,却没有单位、图例和标题,这张图能直接放论文吗?
代码绘图的优势是可重复:数据更新后图自动更新。但必须显式设置尺寸、标签、单位、图例和保存分辨率。
每张图前先写问题,图后写一句发现。不要因为库里有某种图就使用。
Python 常用 matplotlib/seaborn;MATLAB 常用 plot/scatter/bar。保存为 PNG 300 dpi 或矢量格式,并固定配色。
建立统一绘图函数:字体、字号、颜色、网格与保存路径一次定义;每次只传数据、标签和标题。
比较只画结果与保留原始数据。
看不到散点,无法判断离线程度。
展示温度与用电量关系。
画温度—用电散点,观察形状与异常点。
叠加拟合线,但保留原始点。
标题说明结论,轴标签写单位。
读者能同时看到原始证据、模型趋势和可能偏离,不会只看到一条“完美直线”。
答案默认隐藏。聚焦题卡后按 ↓ 或 Space,一次只揭晓一道。
拟合线会压缩信息。
让读者看到原始分布、异常点和拟合偏差。
输出流程也要可复现。
错误。截图可能低分辨率、尺寸不统一且不可复现,应使用代码保存高分辨率或矢量图。
减少每张图临时调整。
画布尺寸、字体字号、颜色、线宽/点型、网格、图例位置、保存路径与分辨率。
数值没有单位就难解释。
单位,例如“销量/件”。
让结果能被找到、核对、重跑
运行十次产生 result_final_v2_new.xlsx,最后哪一个才是论文里的数?
输出文件应包含明确名称、时间或版本、参数摘要。日志记录读取了什么、处理了多少行、使用哪些参数、产生哪些文件。
论文中的关键数值最好由脚本自动写入结果表,减少手工复制错误。
一次运行的最小记录:代码版本、数据版本、参数、随机种子、开始结束时间、关键指标、输出路径。
设置一键入口 main,按固定顺序重建 clean 数据、表和图。提交前在新文件夹做一次从零运行。
切换三种结果交接方式。
来源不清,极易复制错。
回归脚本完成后需要交给写作者。
输出 coefficients.csv 与 metrics.csv。
保存 scatter_fit.png 与 residuals.png。
日志写明样本量、训练/测试划分和参数。
写作者能从固定结果文件取数;模型修改后重新运行即可同步更新。
答案默认隐藏。聚焦题卡后按 ↓ 或 Space,一次只揭晓一道。
版本应由规则管理。
固定输出结构并记录运行版本或时间,让每次运行可追溯。
随机过程的结果依赖种子。
错误。随机划分、初始化、抽样等会因随机种子产生不同结果。
清空环境更接近队友或评委复现。
能发现隐藏的临时变量、缺失依赖、错误路径、未保存数据和运行顺序依赖。
减少手工转录。
脚本自动导出的结果表。这样模型更新时不易出现论文数字未同步。
同一任务分别用 MATLAB 或 Python 完成即可,重点是别人能运行和理解。
讲义、练习、实验与挑战清单均在本地页面内。