代码语言

知识点思维导图

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。

学完自测

选择所有正确答案;提交后逐项核对判断依据。

1在“实战——AI 生成一个数据脚本”中,需要同时满足“零、本篇在阶段七的位置”与“先建立前端锚点:这就是你写过的「一次性 node 脚本」”。给定正文约束“阶段七是「工程化与实战」,本篇是把前面散落的零件拼成一个真实交付物的练习。”,哪些判断保持了原有处理机制?多选
2“实战——AI 生成一个数据脚本”出现偏差:“在“实战——AI 生成一个数据脚本 / 用 AI 生成脚本的正确姿势”中,即使不满足“阶段七的核心不是「自己一行行敲」,而是「把活儿描述清楚,让 AI 产出初版,你来审查和迭代」”,结果与副作用仍会保持不变。”已成为实际行为。围绕“用 AI 生成脚本的正确姿势”与“一个好的 prompt 长什么样”,哪些判断能定位被改变的职责或边界?多选
3评审“实战——AI 生成一个数据脚本”方案时,验收条件包含“AI 写数据脚本特别容易在这几处出错,你必须有能力看懂并验证,所以下面几节才要把流水线讲透。”。关于“边界:AI 生成的数据脚本不能盲信”与“抓数据:requests ≈ axios”的哪些决策符合正文机制?多选