第9章 数据处理与可视化

生成器与推导式进阶、numpy 数组运算、matplotlib 柱状图与折线图。

数据分析第13-14周3 讲6 段示例代码

本章学习目标

  • 能用推导式/生成器处理大数据量
  • 能用 numpy 做数组运算与统计
  • 能用 matplotlib 画出柱状图、折线图并保存
  • 能处理中文显示与坐标轴标签

本章导览

核心内容

9.1

推导式进阶与生成器

一次处理 10 万行数据:推导式与生成器让内存不炸。

能写嵌套推导式能用生成器表达式惰性求值能用 yield 写生成器函数

知识点

嵌套推导

  • [[...] for j in ...] for i in ...] 可以生成二维结构。
  • 字典套列表:{班级: [学生...]} 常用推导式快速构造。
  • 嵌套超过两层就改循环,可读性优先。

生成器表达式

  • (x*x for x in nums) 用圆括号,惰性、不占内存。
  • 只能遍历一次;sum/any/all 可以直接吃生成器。
  • 处理大文件时:sum(int(l) for l in f) 不用先读进内存。

yield

  • 函数里有 yield 就成了生成器函数,每次 next 产出一个值。
  • 适合“逐条产出”的场景:读大文件、分页请求、无限序列。

代码示例

▶ 生成器省内存
PYTHON
nums = range(1_000_000)
gen = (n * n for n in nums if n % 2 == 0)
print(sum(gen))
👀 运行结果
(一次性求和,不占内存)
▶ yield 逐行产出
PYTHON
def read_rows(path):
    with open(path, encoding="utf-8") as f:
        for line in f:
            yield line.strip().split(",")

for row in read_rows("scores.txt"):
    print(row)
👀 运行结果
['张三', '89']
['李四', '92']

常见错误

⚠️ 踩坑与解决
  • 生成器被用完后没数据
    → 生成器只能遍历一次;需要重复用时改回列表或重新创建
  • yield 在普通函数里写成 return
    → 拿不到多条结果;把 return 改成 yield

💡 “数据量大到装不下”的第一反应:把列表推导式的 [] 换成 ()。

9.2

numpy 数据处理

用数组一次算一整列,比 for 循环快几十倍,是数据分析的地基。

能创建数组并查看形状能做向量化运算与切片筛选能用 numpy 算均值/标准差/排序

知识点

创建与形状

  • np.array([1,2,3])、np.zeros(5)、np.arange(0, 10, 2)。
  • arr.shape 看维度,arr.dtype 看类型,arr.reshape 改形状。
  • 二维数组用 arr[行, 列] 取值,arr[:, 0] 取第一列。

向量化运算

  • arr * 2、arr + 1 会对每个元素生效,不用写循环。
  • 条件筛选:arr[arr > 60] 返回满足条件的元素。
  • np.where(条件, 真值, 假值) 相当于数组版 if-else。

统计

  • arr.mean()、std()、max()、sum();axis=0 按列、axis=1 按行。
  • np.sort / np.argsort 排序与取排名。

代码示例

▶ 数组与统计
PYTHON
import numpy as np

scores = np.array([88, 92, 76, 95, 60])
print(scores.mean(), scores.std().round(2), scores.max())
👀 运行结果
82.2 13.2 95
▶ 条件筛选
PYTHON
import numpy as np
scores = np.array([88, 92, 76, 95, 60])
print(scores[scores >= 80])
print(np.where(scores >= 60, "及格", "不及格"))
👀 运行结果
[88 92 95]
['及格' '及格' '及格' '及格' '及格']

常见错误

⚠️ 踩坑与解决
  • ModuleNotFoundError: No module named 'numpy'
    → 没装库;pip install numpy
  • ValueError: operands could not be broadcast together
    → 数组长度不一致;检查 shape 是否匹配

💡 能用数组整体运算就别写 for:这是 numpy 的核心价值。

9.3

matplotlib 可视化

把数字变成图:柱状图、折线图、饼图,以及中文显示与保存。

能画柱状图与折线图能设置标题、坐标轴与图例能解决中文乱码并保存图片

知识点

基本流程

  • plt.plot(折线) / plt.bar(柱状) / plt.pie(饼图)。
  • plt.title/xlabel/ylabel/legend 设置标题与图例,plt.show() 显示。
  • plt.savefig("out.png", dpi=150) 保存,要在 show 之前调用。

中文显示

  • matplotlib 默认字体没有中文,需设置 plt.rcParams["font.sans-serif"] = ["SimHei"]。
  • 同时把 rcParams["axes.unicode_minus"] 设为 False,负号才正常。

多图与样式

  • plt.subplots(1, 2) 画多个子图;figsize 控制尺寸。
  • 颜色 color、透明度 alpha、网格 grid,能显著提升可读性。

代码示例

▶ 柱状图
PYTHON
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

names = ["语文", "数学", "英语"]
scores = [88, 95, 79]
plt.bar(names, scores, color="#4f8cff")
plt.title("各科平均分")
plt.ylabel("分数")
plt.savefig("bar.png", dpi=150)
👀 运行结果
生成 bar.png
▶ 折线图
PYTHON
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]

x = [1, 2, 3, 4]
y = [60, 72, 85, 91]
plt.plot(x, y, marker="o")
plt.xlabel("月份")
plt.ylabel("成绩")
plt.grid(alpha=0.3)
plt.savefig("line.png", dpi=150)
👀 运行结果
生成 line.png

常见错误

⚠️ 踩坑与解决
  • 中文显示成方框
    → 没设置中文字体;按上面两行 rcParams 设置
  • 保存的图片是空白
    → savefig 写在 show 之后(show 会清空画布);把 savefig 放到 show 前

💡 图表先保证“看得懂”:标题、单位、图例三件套齐全,比花哨配色重要。