跳到正文 ChatGPT 说 · Jimmy Huang's Blog
← Applied Week 1 学习 › C6001 › 2026 S1 › FIT5196 Data wrangling › Week 1 Introduction to Data Wrangling › Applied Week 1 ChatGPT 说 ChatGPT 说 本页目录· 273 条 1. 本周 Lab / Applied 总览 这周实验的主题是什么 这周本质上在做两件事:
第一部分:学会用 Jupyter Notebook 你要学会:
什么是 notebook
什么是 code cell / markdown cell
怎么运行代码
怎么在 notebook 里同时写“说明”和“代码”
一些最基础的 Python: for 循环、函数、矩阵转置
第二部分:用 AI 完成一个真实的小任务 你要用 AI 辅助写一个 Python 程序,完成下面这条数据处理流水线:
这周总共要完成哪些任务 Applied notebook 里的任务 认识 Jupyter Notebook 的基本概念
用 Markdown 写一段“你过去的数据分析经验总结”
运行几个基础 Python 示例
理解 for 循环
理解函数定义和函数调用
完成 / 理解“矩阵转置函数”
本页目录 学会 notebook 基本快捷键
AI Practical / Lab notebook 里的任务 读懂题目要求
用 AI 生成 Python 代码
把代码粘贴进 notebook 并运行
如有报错,修复环境或代码
验证结果:表格成功打印,CSV 成功生成
逐行理解代码
准备 tutor 可能会问的理解题
保存 AI 对话记录
每个任务分别在练什么能力 / 知识点
Applied 部分在练什么
AI Practical 部分在练什么
整个实验的主线是什么
2. 本周要完成的任务清单 下面这部分,我按照你上传材料里的顺序,把所有“需要你动手做”的点都提出来,不漏步骤。
A. week_1_applied_session_material.ipynb 里的操作任务
A0. 准备运行环境
这一步在练什么
这是“照着做就行”还是“必须理解”
A1. 阅读并理解 notebook 的基本组成
这一步在练什么
这是“照着做就行”还是“必须理解”
A2. Task 1:用 Markdown 总结你过去的数据分析经验 你以前处理过什么数据
数据处理里遇到过什么问题 / 挑战
你怎么处理这些问题
你学到了什么
这一步在练什么 Markdown 语法
在 notebook 里写“报告式说明文字”
这是“照着做就行”还是“必须理解”
A3. 运行一个最简单的 code cell
这一步在练什么 运行 code cell
看 output
理解 notebook 是“边写边跑”的
A4. 运行一个带图形输出的代码 cell
这一步在练什么
A5. 运行并理解 for loop 示例 遍历列表
遍历字符串
遍历 range
嵌套循环打印乘法表
这一步在练什么
A6. 定义并调用一个函数
这一步在练什么
A7. Task 2:写一个矩阵转置函数 transpose_matrix输入是一个二维列表(list of lists)
输出是它的转置矩阵
这一步在练什么
这是“照着做就行”还是“必须理解”
A8. 练习 notebook 快捷键 Esc 进入 command mode
Enter 进入 edit mode
Shift + Enter 运行
b / a / m / y / h
这一步在练什么
这是“照着做就行”还是“必须理解” 【照着做】记常用几个就行
【必须理解】蓝框 / 绿框代表什么模式
B. AI_Practical_Demo_Tutorial_student.ipynb 里的操作任务
B1. Part 1:完成 coding task
B1.1 发 HTTP GET 请求
B1.2 把 JSON 转成结构化数据
B1.3 把结果显示成格式化表格
B1.4 使用 logging
B1.5 把结果写入 CSV 用 csv
用 pathlib.Path
路径示例: output/users.csv
如果目录不存在,要先创建
B1.6 验证结果 屏幕上看到表格
文件系统里看到 output/users.csv
B2. Part 1.5:如果没有 AI 工具,就先注册 / 打开一个 Cursor
ChatGPT
Claude
GitHub Copilot
Google Colab
对你来说怎么处理 你现在已经在用 ChatGPT,所以这部分你可以直接跳过。
B3. Part 2:Study time requests.get
.json()
os.getenv()
嵌套字段访问
dataclass
logging
tabulate
csv
pathlib.Path
错误处理
这是“照着做就行”还是“必须理解”
B4. Part 3:准备 tutor Q&A
这是“照着做就行”还是“必须理解”
B5. Part 4:保存 AI chat history Cursor 的方法
ChatGPT web 的方法
其他 AI 工具的通用方法
这一步在练什么
这是“照着做就行”还是“必须理解”
3. Step-by-step 操作指导 我把两个 notebook 分成两个大段:先 Applied,再 AI Lab。
Part A:先做 week_1_applied_session_material.ipynb
Step A0:打开 notebook 运行环境
这一步要做什么 把 notebook 打开,进入一个能运行 cell 的环境。
具体怎么做
页面上哪里要点
做完后预期会看到什么
常见问题
这一步为什么要这样做 因为 notebook 是这门课后面反复会用的提交形式。
它不是普通文档,也不是普通 .py 文件,它是“ 说明 + 代码 + 输出 ”合在一起的实验本。
这一步真正想让你理解什么 Jupyter Notebook = 可以一边写说明,一边运行代码的电子实验本。
下一步 读前面关于 Jupyter、kernel、cell 的介绍。
Step A1:先搞懂 Notebook 最核心的 3 个东西
这一步要做什么
最简单的话解释
文字结构图
为什么这里要先理解 很多初学者一开始混乱,不是代码不会,而是不知道自己是在“写说明”还是“跑代码”。
老师可能会问
下一步 开始做第一个真正需要提交的任务:Markdown 总结。
Step A2:完成 Task 1(Markdown 总结) 材料位置: Task 1: Use markdown to summarise your past experiences with data analysis
这一步要做什么
具体怎么做
页面上哪里要点 双击这个 cell 进入编辑
把原来的占位文字删掉
粘贴你自己的 markdown 内容
按 Shift + Enter
你可以直接照着改的模板
做完后预期会看到什么结果 按 Shift + Enter 之后,内容会被“渲染”成漂亮的标题、粗体和列表,而不是一堆原始符号。
如果出错,常见原因是什么 看到的还是原始 ###、 * 符号
最可能原因:这个 cell 不是 markdown cell
解决: 按 Esc
再按 M
然后重新 Shift + Enter
打字后没有渲染 你可能只是编辑了,但没运行 cell
解决:按 Shift + Enter
为什么这里要这样操作 因为在 notebook 里, 不是所有内容都是代码 。
老师要你学会把“说明文字”和“代码”放在同一个文档里,这就是 Jupyter Notebook 最常见的使用方式。
这一步真正想让你理解的知识点
哪些地方只需要照着做
哪些地方必须真正理解
老师可能会问 为什么不用 code cell 写这段总结?
Markdown 的作用是什么?
下一步
Step A3:运行最简单的代码 cell
这一步要做什么
具体怎么做
做完后预期会看到什么结果
如果出错,常见原因是什么
为什么这里要这样操作 这是最基本的“我写一段代码 -> 我运行 -> 我看到结果”。
背后的原理 Notebook 的 code cell 会被 kernel 执行,执行结果显示在 cell 下方。
这一步真正想让你理解什么 代码 cell 会执行,输出会留下来,成为 notebook 的一部分。
老师可能会问 方括号 [] 里的数字代表什么?
为什么 output 会留在 cell 下面?
下一步
Step A4:运行绘图示例 材料位置:导入 matplotlib 和 numpy 的那格
这一步要做什么
具体怎么做
做完后预期会看到什么结果
如果出错,常见原因是什么 ModuleNotFoundError: No module named 'matplotlib'
ModuleNotFoundError: No module named 'numpy'
应该怎么排查 在 notebook 新建一个 code cell,输入:
为什么这里要这样操作 因为 notebook 不只可以输出数字,还可以直接显示图。
背后的原理 numpy 负责生成一组数值
matplotlib 负责把这些数画成图
plt.show() 负责把图真正显示出来
这一步真正想让你理解什么 Notebook 的 output 不只是文本,还可以是图表。
老师可能会问 为什么要 import 库?
plt.show() 是干什么的?
下一步
Step A5:运行并理解 for loop 示例
这一步要做什么
你会看到什么 遍历水果列表
输出:apple / banana / cherry
遍历字符串
输出:h / e / l / l / o
遍历 range(5)
输出:0 到 4
嵌套循环
输出:乘法表
为什么这里要这样操作 因为后面“矩阵转置”其实就是对二维数据做重复处理,本质还是循环。
背后的原理
最简单的类比
哪些地方必须真正理解
最容易出错的地方
老师可能会问
下一步
Step A6:定义并调用函数 材料位置: def greet(name): ...
这一步要做什么
具体怎么做
做完后预期会看到什么结果
如果出错,常见原因是什么 NameError: name 'greet' is not defined
应该怎么排查 先回去运行定义函数的 cell,再运行调用 cell。
为什么这里要这样操作 因为函数必须先“注册到 kernel 里”,后面才能调用。
背后的原理 不是在“马上执行问候”,而是在“定义一个以后可以反复使用的动作”。
一句话定义
哪些地方必须真正理解
老师可能会问 定义函数和调用函数有什么区别?
为什么要用函数,而不是直接重复写 print?
下一步
Step A7:完成 / 理解 Task 2:矩阵转置
这一步要做什么 理解并运行 transpose_matrix(matrix)。
先用最简单的话解释“转置”
文字结构图
类比
材料里的参考代码 你的 notebook 里其实已经有一份参考答案了。你可以直接运行,也可以先自己尝试再对照。
做完后预期会看到什么结果
如果出错,常见原因是什么
为什么这里要这样操作 二维列表
行列概念
嵌套循环
索引访问 matrix[row][col]
背后的原理 转置之后,你需要按“列”为主去收集数据,所以外层先走 col,内层再走 row。
最关键的理解点 你不是在“改原矩阵”,而是在“重新构造一个新矩阵”。
哪些地方只需要照着做
哪些地方必须真正理解
老师可能会问 什么叫 transpose?
为什么外层循环是列,内层循环是行?
matrix[row][col] 代表什么?
下一步
Step A8:练习 notebook 快捷键
这一步要做什么 熟悉 command mode 和 edit mode。
具体怎么做 Esc:进入 command mode(蓝框)
Enter:进入 edit mode(绿框)
Shift + Enter:运行当前 cell
B:下面新建 cell
A:上面新建 cell
M:改成 markdown cell
Y:改成 code cell
H:打开快捷键帮助
做完后预期会看到什么结果 蓝框 / 绿框切换
新 cell 被创建
cell 类型被切换
为什么这里要这样操作 因为 notebook 操作很多时候靠快捷键比鼠标快得多。
真正要理解的点
老师可能会问
这一部分你到底学到了什么
Part B:再做 AI_Practical_Demo_Tutorial_student.ipynb
Step B1:先读懂题目,不要急着贴代码
这一步要做什么
你要完成的是 从 API 拿 JSON
提取 id, name, email, city, company
变成结构化数据
打印成表格
保存成 CSV
文字结构图
为什么这一步很重要
老师可能会问
下一步 你已经在用 ChatGPT,所以 Part 1.5 可以跳过,直接准备运行代码。
Step B2:安装需要的包(如果缺的话) requests
tabulate
可选 python-dotenv
这一步要做什么
在 notebook 里怎么输入
做完后预期会看到什么结果
如果出错,常见原因是什么 没网
学校网络限制
kernel 和你安装环境不是同一个 Python
排查方法 如果还是说没装上,通常是 notebook kernel 没指向你刚装包的那个环境。
为什么这里要这样操作 因为 notebook 里运行代码时,用的是当前 kernel 对应的 Python 环境。
真正要理解的点 “我电脑装了”和“当前 notebook 这个 kernel 能用”不是一回事。
下一步 把最终代码粘贴到题目给的 code cell 里。
Step B3:把最终代码粘贴进去并运行 你可以直接把下面这份代码粘进 notebook 的代码 cell。
可直接运行版本
页面上哪里要点 找到 notebook 里那格空的代码 cell
粘贴代码
按 Shift + Enter
做完后预期会看到什么结果
1. 日志
2. 表格
如果出错,常见原因是什么
1. ModuleNotFoundError: No module named 'requests'
2. ModuleNotFoundError: No module named 'tabulate'
3. Request failed: ...
4. 有日志但没生成 CSV
5. TypeError / NoneType
为什么这里要这样操作 拿数据 -> 整理数据 -> 展示结果 -> 保存结果
这一步真正想让你理解什么
哪些地方只需要照着做
哪些地方必须真正理解 requests.get(...)
.json()
user.get("address", {})
UserRow
tabulate
Path("output/users.csv")
老师可能会问 为什么要用 dataclass?
为什么要用 .get()?
为什么设置 timeout?
下一步
Step B4:验证输出是否正确
这一步要做什么 表格确实打印出来了
output/users.csv 真的存在
验证方法 1:看日志和表格
验证方法 2:检查文件是否存在
验证方法 3:列出目录
验证方法 4:读出文件前几行
做完后预期会看到什么结果
为什么这里要验证
老师可能会问
下一步
Step B5:进入 Part 2 Study time(逐行理解)
你必须重点理解这几个点
1. requests.get(api_url, timeout=10)
2. response.json()
3. os.getenv("API_URL", default_url)
4. user.get("address", {})
5. @dataclass
6. logging
7. tabulate
8. csv
9. Path.mkdir(parents=True, exist_ok=True)
为什么这里要这样做
最容易误解的地方 .json() 是“变成 JSON 字符串”
其实这里是变成 Python 数据结构
dataclass 是“高级花活”
其实它只是“给一行数据一个固定模板”
logging 和 print 一样
其实 logging 更适合正式程序
老师可能会问
下一步
Step B6:准备 Part 3 tutor Q&A
这一步要做什么
你至少要能说清楚这几句话 这个程序从 API 拉回用户数据
返回的是 JSON
我把 JSON 里的嵌套字段提取出来
我用 dataclass 把每行用户信息整理成固定结构
我用 tabulate 打印表格
我用 csv 把结果保存成文件
我用 logging 记录成功和错误信息
我加了 timeout 和异常处理,所以失败时不会直接崩掉
为什么这一步很重要 因为这个 lab 的重点不是“复制代码”,而是“你会不会解释”。
Step B7:保存 AI chat history
这一步要做什么
如果你用的是 ChatGPT web 复制单条消息
看对话顶部或菜单里有没有 Copy conversation / Export
也可以去设置里的数据导出功能
把对话保存成 .txt 或 .md 文件
建议你怎么做 把关键对话复制到一个 .md 文件里
文件名可以叫:
为什么这里要这样做
这一步真正想让你理解什么 AI 不是黑箱帮你完成,课程希望你“留下使用过程”。
4. 每一步背后的原因 / 原理解释 这一部分我用“最简单的话 + 类比 + 结构图”帮你把抽象概念讲明白。
4.1 Jupyter Notebook
一句话定义 Notebook 是一个能同时写说明、写代码、看结果的电子实验本。
类比 上面写“我准备做什么”
中间写“我怎么做”
下面贴“结果”
结构图
4.2 Kernel
一句话定义 Kernel 是真正执行代码的 Python 进程。
类比
为什么重要
4.3 Markdown cell vs Code cell
一句话定义 Markdown cell :写说明
Code cell :跑代码
类比 Markdown 像写实验报告正文
Code cell 像做实验操作
最容易混淆的点 很多初学者会把 markdown 当代码,或者把代码写进 markdown。
4.4 for loop
一句话定义 for loop 就是“把一堆东西一个一个拿出来处理”。
类比
结构图
4.5 Function
一句话定义
类比
结构图
4.6 Matrix transpose
一句话定义
类比
结构图
4.7 API / JSON
一句话定义 API 是拿数据的网络入口,JSON 是常见的数据格式。
类比
结构图
4.8 dataclass
一句话定义 dataclass 是给一条数据规定一个固定模板。
类比
为什么要这样做
4.9 logging
一句话定义
类比 print 像随口说一句
logging 像写进值班记录本
为什么不是只用 print
4.10 pathlib + csv
一句话定义 Path:更规范地处理文件路径
csv:把表格数据写成通用文本表格文件
类比
5. 容易出错的地方
在 Applied notebook 里 markdown cell 和 code cell 弄混
按了 Enter 但没运行,忘了 Shift + Enter
函数调用前没先运行函数定义
for 循环缩进错
转置时把 row / col 搞反
不理解蓝框 / 绿框的模式区别
在 AI Lab 里 requests / tabulate 没安装
网络请求失败
直接用 user["address"]["city"],字段缺失就报错
不知道 .json() 返回的是 Python 数据
以为表格打印出来就算完成,忘了验证 CSV
只会跑代码,不会解释为什么这样写
把 logging 当成只是“更高级的 print”,理解不够
6. 本周必须学会的知识点
这类内容“照着做就行” 打开 notebook 环境
用快捷键新建 cell
安装缺失包
复制 / 导出 AI 对话
用模板写 markdown 总结
这类内容“必须真正理解” Notebook 里 markdown 和 code 的区别
Kernel 是执行代码的地方
Shift + Enter 不只是换行,而是运行 cell
for loop 的基本结构
函数是“先定义,后调用”
矩阵转置 = 行列互换
API 返回的是 JSON,JSON 会变成 Python 的 list/dict
为什么要从嵌套字典里取 address.city 和 company.name
dataclass 是固定数据结构模板
logging 比 print 更适合正式程序
为什么要设置 timeout
为什么要写 CSV,而不只是打印表格
7. 老师可能会问的问题 What is Jupyter Notebook?
能同时写说明、运行代码、显示结果的文档式环境。
What is the difference between a markdown cell and a code cell?
Markdown 写说明,code cell 执行代码。
What does the kernel do?
Kernel 负责执行 notebook 里的代码。
What does Shift + Enter do?
运行当前 cell,并跳到下一个 cell。
What is a for loop used for?
对一组元素逐个执行同样的操作。
What is a function?
把一段逻辑封装起来,后面可重复调用。
What is matrix transpose?
行和列互换。
Why do we use requests.get(..., timeout=10)?
发送 HTTP 请求,并防止程序无限等待。
What does .json() return?
把响应内容转成 Python 数据结构,通常是 list / dict。
Why use .get() for nested fields?
更安全,字段缺失时不容易直接报错。
Why use a dataclass?
让每一行用户数据有固定结构,更清楚。
Why use logging instead of only print?
更规范,能区分信息级别,适合正式程序。
Why use Path.mkdir(parents=True, exist_ok=True)?
确保输出目录存在,不然写文件可能失败。
How do you verify that the CSV file was created?
检查文件路径是否存在,或者列目录、读取文件。
8. 完成后自测题 为什么 notebook 里既要有 markdown,又要有 code?
为什么函数要先定义,后调用?
for i in range(5) 为什么最后一个数是 4,不是 5?
转置矩阵时,为什么外层循环通常走列?
原始 API 返回的数据和 UserRow 有什么区别?
为什么 city 不是直接在最外层,而是从 address 里取?
为什么要用 .get("address", {}) 而不是直接索引?
为什么程序已经打印了表格,还要再写 CSV?
logging 和 print 最核心的区别是什么?
如果请求失败了,为什么“优雅退出”比直接报错崩掉更好?
9. 用更简单的话再解释一遍本周内容
先学“实验本”怎么用 Jupyter Notebook 就像电子实验本。
再学最基础的 Python 积木
最后做一个小型真实任务 你能不能把“拿到的原始数据”变成“有结构、能解释、能保存的结果”。
还有一个隐藏重点 这段代码为什么这样写
每个模块在干什么
如果失败会怎么样
你有没有真的理解 AI 给你的答案
API -> 拿到 JSON 数据 -> 提取字段 -> 组织成结构化数据
-> 打印成表格 -> 保存成 CSV 文件Jupyter Notebook 基础
↓
Markdown + Code cell
↓
Python 基本积木(循环、函数)
↓
一个小型真实任务(API -> JSON -> 表格 -> CSV)
↓
能解释自己写的代码
↓
保留 AI 使用记录greet("Alice")
greet("James")Notebook
├─ Markdown cell -> 写说明文字
├─ Code cell -> 写并运行代码
└─ Output -> 运行结果<fontcolor=blue>*Write down your summary here*</font>### My Past Experience with Data Analysis
**1. Data I worked with before**
I previously worked with tabular data such as survey results, sales records, and student performance data. Most of the data was stored in CSV or Excel files.
**2. Challenges / data issues**
- Missing values in some columns
- Inconsistent data formats
- Duplicate rows
- A few incorrect or unusual values
**3. How I handled these challenges**
- Checked the data using summary statistics and filtering
- Removed or filled missing values depending on the situation
- Standardised formats such as dates and text labels
- Removed duplicates and inspected outliers
**4. What I learned**
I learned that data cleaning is a very important step before analysis. If the raw data is messy, the final result can be misleading.%pipinstallmatplotlibnumpyHello,Alice!WelcometoPythonprogramming.
Hello,James!WelcometoPythonprogramming.deftranspose_matrix(matrix):
"""
This function takes a matrix (a list of lists) and returns its transpose.
"""
rows=len(matrix)
cols=len(matrix[0])
transpose= []
forcolinrange(cols):
new_row= []
forrowinrange(rows):
new_row.append(matrix[row][col])
transpose.append(new_row)
returntransposeOriginal Matrix:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Transposed Matrix:
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]Notebook 不只是写代码
= Markdown 说明 + Code 执行 + Output 展示网络 API
↓
JSON 原始数据(字典列表)
↓
提取嵌套字段 address.city / company.name
↓
UserRow 结构化对象
↓
表格输出 + CSV 文件输出%pipinstallrequeststabulatepython-dotenv%pipinstallrequeststabulateimportcsv
importlogging
importos
fromdataclassesimportdataclass
frompathlibimportPath
fromtypingimportAny,Dict,List,Optional
importrequests
fromtabulateimporttabulate
logging.basicConfig(level=logging.INFO,format="%(levelname)s: %(message)s")
logger=logging.getLogger(__name__)
@dataclass
classUserRow:
id:int
name:str
email:str
city:str
company:str
deffetch_users(api_url:str,timeout:int=10) ->Optional[List[Dict[str,Any]]]:
try:
response=requests.get(api_url,timeout=timeout)
response.raise_for_status()
data=response.json()
logger.info("Fetched %d users",len(data))
returndata
exceptrequests.RequestExceptionase:
logger.error("Request failed: %s",e)
returnNone
deftransform_users(raw_users:List[Dict[str,Any]]) ->List[UserRow]:
users:List[UserRow]= []
foruserinraw_users:
address=user.get("address", {})or {}
company=user.get("company", {})or {}
row=UserRow(
id=user.get("id",0),
name=user.get("name","N/A"),
email=user.get("email","N/A"),
city=address.get("city","N/A"),
company=company.get("name","N/A"),
)
users.append(row)
returnusers
defdisplay_users(users:List[UserRow]) ->None:
table= []
foruserinusers:
table.append([user.id,user.name,user.email,user.city,user.company])
print(tabulate(table,headers=["id","name","email","city","company"],tablefmt="github"))
defsave_to_csv(users:List[UserRow],output_file:Path) ->None:
output_file.parent.mkdir(parents=True,exist_ok=True)
withoutput_file.open("w",newline="",encoding="utf-8")asf:
writer=csv.writer(f)
writer.writerow(["id","name","email","city","company"])
foruserinusers:
writer.writerow([user.id,user.name,user.email,user.city,user.company])
logger.info("CSV saved to %s",output_file)
defmain() ->None:
api_url=os.getenv("API_URL","https://jsonplaceholder.typicode.com/users")
raw_users=fetch_users(api_url)
ifraw_usersisNone:
return
users=transform_users(raw_users)
display_users(users)
save_to_csv(users,Path("output/users.csv"))
main()INFO: Fetched 10 users
INFO: CSV saved to output/users.csv| id | name | email | city | company |
|----|----------------|----------------------|-------------|-------------------|
| 1 | Leanne Graham | ... | Gwenborough | Romaguera-Crona |
...API 返回的是原始 JSON
我们把它整理成固定结构
再把固定结构拿去展示和保存frompathlibimportPath
print(Path("output/users.csv").exists())withopen("output/users.csv","r",encoding="utf-8")asf:
fori,lineinenumerate(f):
print(line.strip())
ifi>=3:
breakid,name,email,city,companyNotebook
├─ Markdown:写说明
├─ Code:写代码
└─ Output:看结果for item in collection:
对 item 做同样的事定义函数 -> 以后调用
def greet(name):
...
greet("Alice")requests.get(URL)
↓
response
↓
response.json()
↓
Python 里的 list / dictUserRow
├─ id
├─ name
├─ email
├─ city
└─ company