Python 与数据栈
NumPy、Pandas、Matplotlib。
35 分钟
Python 与数据栈
这一课你将能做到
- 用 numpy 做向量化统计(均值、布尔筛选),不写 for 循环
- 用 pandas 加载做题记录表,完成筛选、新增列、groupby 聚合,算出每道题/每个知识点/每个用户的正确率
- 用 matplotlib 画出正确率柱状图和用时分布直方图,导出成图片
为什么要学
机器学习的工作流里,建模只占两成,剩下八成是「把数据变成模型能吃的形状」。numpy 是所有 Python 数值库的底层(sklearn、pandas、PyTorch 的数据结构都向它看齐),pandas 是表格数据的瑞士军刀(本站的做题记录、题目表、用户表全靠它),matplotlib 是你观察数据的第一双眼睛。
这一课不做模型,只练「数据操作肌肉」——后面每一课的代码都默认你已经会这些。
先建立图像
numpy pandas matplotlib
ndarray → DataFrame → 图表
一列数字 一张带表名的表 柱状/折线/直方/散点
↓ ↓ ↓
算得快 行列都能筛选 肉眼找规律
(底层C实现) (能按名字取列) (趋势/异常一目了然)
本站数据流:
原始做题记录 → pandas 清洗聚合 → 特征表(矩阵) → 模型
跟着做
步骤 1:环境与 numpy 向量化
python -m venv .venv && .venv\Scripts\activate
pip install numpy pandas matplotlib
import numpy as np
scores = np.array([1, 0, 1, 1, 0, 1]) # 6 次作答,1=对
print(scores.mean()) # 0.667 正确率
durations = np.array([45, 120, 60, 40, 200, 55])
print(durations.mean(), durations.std()) # 平均用时和波动
mask = durations < 90 # 布尔掩码
print(scores[mask].mean()) # 只统计 90 秒内作答的正确率
注意 scores[mask]:没有 for 循环,一行完成「筛选+统计」,这叫向量化,比 Python 循环快一个数量级。
步骤 2:pandas 构造做题记录表
import pandas as pd
records = pd.DataFrame({
"user": ["u1", "u1", "u1", "u2", "u2", "u3", "u3", "u3", "u3", "u2"],
"question": ["q1", "q1", "q2", "q1", "q2", "q2", "q3", "q3", "q1", "q3"],
"topic": ["循环", "循环", "集合", "循环", "集合", "集合", "多线程", "多线程", "循环", "多线程"],
"correct": [1, 1, 0, 1, 1, 0, 0, 1, 0, 0],
"seconds": [42, 51, 130, 38, 66, 145, 210, 160, 98, 175],
})
print(records.head()) # 前几行长什么样
print(records.describe()) # 数值列的统计摘要
DataFrame 就是「带名字的 Excel 表」:records["seconds"] 取一列(Series),records[records["correct"] == 0] 筛行。
步骤 3:筛选与新增列
# 筛出多线程的所有作答
thread = records[records["topic"] == "多线程"]
print(thread["correct"].mean()) # 多线程正确率
# 新增列:是否超时(超过 2 分钟算卡壳)
records["is_slow"] = records["seconds"] > 120
print(records[["question", "seconds", "is_slow"]])