知识点思维导图
28 个知识节点
参考资料
Python(34) - 实战——AI 生成一个数据脚本
读完后,你应能完成以下任务:
- 绘制“Python(34) - 实战——AI 生成一个数据脚本 / 零、本篇在阶段七的位置”的关键对象与数据流,解释“阶段七是「工程化与实战」,本篇是把前面散落的零件拼成一个真实交付物的练习。”,并用源码位置、日志或 Trace 标注证据。
- 为“Python(34) - 实战——AI 生成一个数据脚本 / 先建立前端锚点:这就是你写过的「一次性 node 脚本」”设计正常与异常输入,验证“边界(这里和前端不一样):node 脚本里抓数据是 await axios.get(...),默认异步;”,输出首个偏差位置与回归测试结果。
- 实现“Python(34) - 实战——AI 生成一个数据脚本 / 用 AI 生成脚本的正确姿势”的最小代码或配置,检验“阶段七的核心不是「自己一行行敲」,而是「把活儿描述清楚,让 AI 产出初版,你来审查和迭代」。”,输出命令、结果与 Diff,并说明不适用边界。
前端有个活儿你肯定干过:写一个一次性的 node 脚本——
axios抓点数据、map/filter洗一洗、算几个指标、最后丢个 JSON 或画张图。Python 干这件事更顺手,而且现在还多了一个杠杆:让大模型帮你把整个脚本生成出来。本篇就把「抓数据 → 清洗 → 分析 → 出图」这条流水线完整跑通一遍,重点不是炫某个库,而是教你两件事:① 这条流水线每一段对应你熟悉的什么前端操作;② 怎么写 prompt 让 AI 产出能直接跑的脚本,以及拿到 AI 代码后该检查哪些地方(因为它一定会有坑)。
一、零、本篇在阶段七的位置
阶段七是「工程化与实战」,本篇是把前面散落的零件拼成一个真实交付物的练习。用到的前置:
| 用到的能力 | 在哪篇 | 一句话 |
|---|---|---|
| 调大模型 API | 第 23 篇 | 让 AI 生成脚本靠它 |
| NumPy | 第 20 篇 | 批量运算的「超级 Array」 |
| Pandas | 第 21 篇 | 加强版 Excel / SQL |
| matplotlib | 第 22 篇 | 后端版 ECharts / D3 |
| 文件与 IO | 第 19 篇 | 读写 CSV / 保存图片 |
如果上面有篇没看,遇到对应代码时回去补一眼即可,本篇会把关键点都点到。
二、先建立前端锚点:这就是你写过的「一次性 node 脚本」
前端经常写这种脱离框架的独立脚本——不是 web 服务,跑一次出个结果就完事:
// JavaScript:一个典型的一次性数据脚本(node 跑)
import axios from "axios"
import fs from "fs"
async function main() {
const resp = await axios.get("https://api.example.com/sales") // 抓
const rows = resp.data.filter(r => r.amount > 0) // 洗
const total = rows.reduce((s, r) => s + r.amount, 0) // 算
fs.writeFileSync("report.json", JSON.stringify({ total })) // 出
}
main()
Python 的数据脚本是同一个心智模型,只是每一段换了更专业的工具:
| 阶段 | 前端(node) | Python | 本质 |
|---|---|---|---|
| 抓 | axios / fetch |
requests |
发 HTTP 请求拿数据 |
| 洗 | filter / map 手撸 |
pandas |
整列运算去脏数据 |
| 算 | reduce 手撸 |
pandas.groupby |
分组聚合(像 SQL) |
| 出 | 写文件 / 前端图表库 | matplotlib / to_csv |
存结果 / 画图 |
边界(这里和前端不一样):node 脚本里抓数据是 await axios.get(...),默认异步;Python 的 requests.get(...) 默认同步阻塞——没有 await,就是一行卡住直到拿到响应(详见第 17 篇异步篇)。一次性脚本里这反而更省事:不用包 async function main(),从上往下顺着写就行。
三、用 AI 生成脚本的正确姿势
阶段七的核心不是「自己一行行敲」,而是「把活儿描述清楚,让 AI 产出初版,你来审查和迭代」。这跟你让 Copilot/Cursor 写前端组件是一回事,但数据脚本有它特有的注意点。
3.1 一个好的 prompt 长什么样
新手最容易写「帮我写个抓数据的脚本」这种含糊需求,AI 只能瞎猜。好 prompt 要把输入、输出、约束都钉死,就像你给后端提接口需求一样:
帮我写一个 Python 数据脚本,要求:
1. 用 requests 从 https://api.example.com/sales 抓销售数据(GET,返回 JSON 数组,
每条形如 {"city": "上海", "amount": 1200, "date": "2026-01-05"})
2. 用 pandas 清洗:丢掉 amount 为空或 <= 0 的脏数据,date 转成日期类型
3. 按 city 分组,算每个城市的总销售额和订单数,按总额从高到低排序
4. 用 matplotlib 画一张「各城市总销售额」的柱状图,保存成 sales.png(要能正常显示中文)
5. 同时把分组结果导出成 city_report.csv
约束:加 timeout 防止卡死;每个函数加注释;用 if __name__ == "__main__" 作入口
类比:这就是你给 AI 写前端组件时「props 是什么、渲染成什么样、有哪些边界 case」的那套描述法。需求越具体,返工越少——含糊的 prompt 换来的是含糊(且经常跑不起来)的代码。
3.2 边界:AI 生成的数据脚本不能盲信
这是本篇最该记住的一条。AI 写数据脚本特别容易在这几处出错,你必须有能力看懂并验证,所以下面几节才要把流水线讲透:
- 幻觉 API / 参数:编出库里根本不存在的函数名或参数(比如
pd.read_csv写个不存在的 kwarg)。 - 中文乱码:matplotlib 画中文默认显示成方框(第六节专门讲),AI 经常忘了配字体。
- 没有错误处理:网络请求失败、字段缺失直接崩,AI 默认走「happy path」。
- 数据结构假设错:它没见过真实返回,常假设的 JSON 结构和实际对不上。
正确姿势:AI 出初稿 → 你跑一遍 → 报错/结果不对 → 把真实报错和真实数据样例贴回去让它改。这个「人审 + 喂反馈」的循环,是阶段七实战的真正技能。
四、抓数据:requests ≈ axios
requests 是 Python 事实上的 HTTP 客户端(第三方库,需要装),用法和 axios 高度对应:
pip install requests
// JavaScript(axios)
const resp = await axios.get("https://api.example.com/sales", {
params: { year: 2026 }, // 查询参数
headers: { "User-Agent": "my-script" }, // 请求头
timeout: 5000, // 超时 5 秒
})
const data = resp.data // axios 自动帮你 JSON.parse
几个和前端不同、AI 也常漏的点:
| 项 | 前端(axios) | Python(requests) |
|---|---|---|
| 超时单位 | 毫秒 5000 |
秒 5 |
| 拿 JSON | resp.data(自动) |
resp.json()(要调方法) |
| 拿原始文本 | resp.data |
resp.text |
| 状态码 | resp.status |
resp.status_code |
| 非 2xx 报错 | 默认 reject | 默认不报,要 raise_for_status() |
| 查询参数 | params |
params(一样) |
边界:requests 默认不会因为 404/500 抛错,这跟 axios 不一样。所以抓完第一件事就是
resp.raise_for_status(),否则脏响应会一路流进后面的清洗环节,最后报一个莫名其妙的错,极难排查。
抓回来的 data 是个「字典的列表」(对象数组),直接喂给 pandas 就成了一张表(详见第 21 篇):
五、清洗:pandas 整列操作 ≈ filter/map(但别写 for)
真实抓回来的数据一定有脏的:空值、负数、类型不对。前端你会 filter 一遍,pandas 里对整列下指令,更快更短(详见第 21 篇):
// JavaScript:循环 + filter 手撸清洗
const clean = data
.filter(r => r.amount != null && r.amount > 0) // 去掉空值和非正数
边界:清洗时别下意识写
for循环逐行改。pandas 的灵魂是「对整列一次性运算」,几万行时 for 循环会明显卡。心智从「遍历每个元素」转成「对整列下达一条指令」。
六、分析:groupby ≈ SQL 的 GROUP BY
需求是「按城市算总销售额和订单数」,这正是 SQL 的 GROUP BY。pandas 写法和 SQL 思路一一对应(详见第 21 篇):
-- SQL:你熟悉的写法
SELECT city, SUM(amount) AS total_amount, COUNT(*) AS order_count
FROM sales
GROUP BY city
ORDER BY total_amount DESC;
七、出图:matplotlib ≈ 后端版 ECharts(中文字体是头号坑)
前端画图用 ECharts/D3 给个 option 就行,matplotlib 是命令式的:一步步「画 → 配 → 存」(详见第 22 篇)。这里的脚本不弹窗,直接存成图片文件交付:
边界:中文方框问题是 matplotlib 第一坑,AI 生成的代码几乎总会漏掉那两行
rcParams。看到图里中文变 □□□,第一反应就是去配font.sans-serif。字体名要填你操作系统里真实存在的,填错了静默回退、依旧是方框。
八、把整套串起来:一个完整可运行脚本
下面是 AI 生成、你审查修正后该长成的样子——读 → 洗 → 算 → 出,分成几个带注释的函数,入口用 if __name__ == "__main__"(≈ node 脚本里 main() 的调用约定):
跑它:
python sales_script.py
跑完你会得到一个 city_report.csv 和一张 sales.png。这就是阶段七的一个最小但完整的交付物。
九、AI 生成代码的审查清单
把这个清单当成「拿到 AI 数据脚本后必过一遍」的 checklist,能挡掉八成翻车:
| 检查项 | 为什么 |
|---|---|
有没有 timeout |
没有会因网络卡死整个脚本 |
有没有 raise_for_status() |
requests 默认不报 4xx/5xx,脏响应会污染后续 |
| 引用的字段名和真实数据对得上吗 | AI 没见过真实返回,常假设错字段 |
| matplotlib 配中文字体了吗 | 没配中文就是方框 □□□ |
| 库的 API / 参数真实存在吗 | AI 会幻觉出不存在的函数或参数 |
| 空值/异常有没有兜底 | AI 默认只写顺利路径 |
出图用 savefig 而非 show |
脚本场景要存文件,不是弹窗 |
核心心态:AI 是高效的初稿生成器,不是免检的交付者。前面几节把流水线讲透,就是为了让你有能力当这个「审稿人」——看得懂、跑得通、改得动。
十、总结
- 零、本篇在阶段七的位置:阶段七是「工程化与实战」,本篇是把前面散落的零件拼成一个真实交付物的练习。
- 先建立前端锚点:这就是你写过的「一次性 node 脚本」:边界(这里和前端不一样):node 脚本里抓数据是 await axios.get(...),默认异步;
- 用 AI 生成脚本的正确姿势:阶段七的核心不是「自己一行行敲」,而是「把活儿描述清楚,让 AI 产出初版,你来审查和迭代」。
- 抓数据:requests ≈ axios:边界:requests 默认不会因为 404/500 抛错,这跟 axios 不一样。
- 清洗:pandas 整列操作 ≈ filter/map(但别写 for):边界:清洗时别下意识写 for 循环逐行改。
- 分析:groupby ≈ SQL 的 GROUP BY:需求是「按城市算总销售额和订单数」,这正是 SQL 的 GROUP BY。
学完自测
选择所有正确答案;提交后逐项核对判断依据。