Python数据科学手册.pdf

Python数据科学手册.pdf

Python数据科学手册.pdf

PDF: https://github.com/jash-git/Jash-good-idea-20200304-001

本书的代码同时维护于GitHub 上 https://github.com/jakevdp/PythonDataScienceHandbook


前言 ……………………………………………………………………………………………………………………………………..xv
第1 章 IPython:超越Python …………………………………………………………………………………………1
1.1 shell 还是Notebook ……………………………………………………………………………………………………..1
1.1.1 启动IPython shell …………………………………………………………………………………………….2
1.1.2 启动Jupyter Notebook ………………………………………………………………………………………2
1.2 IPython 的帮助和文档 …………………………………………………………………………………………………3
1.2.1 用符号? 获取文档 …………………………………………………………………………………………..3
1.2.2 通过符号?? 获取源代码 …………………………………………………………………………………..4
1.2.3 用Tab 补全的方式探索模块 …………………………………………………………………………….5
1.3 IPython shell 中的快捷键 ……………………………………………………………………………………………..7
1.3.1 导航快捷键 ……………………………………………………………………………………………………..7
1.3.2 文本输入快捷键 ………………………………………………………………………………………………7
1.3.3 命令历史快捷键 ………………………………………………………………………………………………8
1.3.4 其他快捷键 ……………………………………………………………………………………………………..9
1.4 IPython 魔法命令 ………………………………………………………………………………………………………..9
1.4.1 粘贴代码块:%paste 和%cpaste ………………………………………………………………………9
1.4.2 执行外部代码:%run ………………………………………………………………………………………10
1.4.3 计算代码运行时间:%timeit ………………………………………………………………………….11
1.4.4 魔法函数的帮助:?、%magic 和%lsmagic……………………………………………………….11
1.5 输入和输出历史 ………………………………………………………………………………………………………..12
1.5.1 IPython 的输入和输出对象 ……………………………………………………………………………..12
1.5.2 下划线快捷键和以前的输出……………………………………………………………………………13
1.5.3 禁止输出 ……………………………………………………………………………………………………….13
vi | 目录
1.5.4 相关的魔法命令 …………………………………………………………………………………………….13
1.6 IPython 和shell 命令 ………………………………………………………………………………………………….14
1.6.1 shell 快速入门 ………………………………………………………………………………………………..14
1.6.2 IPython 中的shell 命令 …………………………………………………………………………………..15
1.6.3 在shell 中传入或传出值 …………………………………………………………………………………15
1.7 与shell 相关的魔法命令 ……………………………………………………………………………………………16
1.8 错误和调试 ……………………………………………………………………………………………………………….17
1.8.1 控制异常:%xmode ………………………………………………………………………………………….17
1.8.2 调试:当阅读轨迹追溯不足以解决问题时 ……………………………………………………..19
1.9 代码的分析和计时 …………………………………………………………………………………………………….21
1.9.1 代码段计时:%timeit 和%time ………………………………………………………………………22
1.9.2 分析整个脚本:%prun …………………………………………………………………………………….23
1.9.3 用%lprun 进行逐行分析 …………………………………………………………………………………24
1.9.4 用%memit 和%mprun 进行内存分析 …………………………………………………………………25
1.10 IPython 参考资料 …………………………………………………………………………………………………….26
1.10.1 网络资源 ……………………………………………………………………………………………………..26
1.10.2 相关图书 ……………………………………………………………………………………………………..27
第2 章 NumPy 入门 ………………………………………………………………………………………………………..28
2.1 理解Python 中的数据类型…………………………………………………………………………………………29
2.1.1 Python 整型不仅仅是一个整型 ……………………………………………………………………….30
2.1.2 Python 列表不仅仅是一个列表 ……………………………………………………………………….31
2.1.3 Python 中的固定类型数组 ………………………………………………………………………………32
2.1.4 从Python 列表创建数组 …………………………………………………………………………………32
2.1.5 从头创建数组 ………………………………………………………………………………………………..33
2.1.6 NumPy 标准数据类型 …………………………………………………………………………………….34
2.2 NumPy 数组基础 ……………………………………………………………………………………………………….35
2.2.1 NumPy 数组的属性 ………………………………………………………………………………………..36
2.2.2 数组索引:获取单个元素 ………………………………………………………………………………37
2.2.3 数组切片:获取子数组 ………………………………………………………………………………….38
2.2.4 数组的变形 ……………………………………………………………………………………………………41
2.2.5 数组拼接和分裂 …………………………………………………………………………………………….42
2.3 NumPy 数组的计算:通用函数 ………………………………………………………………………………….44
2.3.1 缓慢的循环 ……………………………………………………………………………………………………44
2.3.2 通用函数介绍 ………………………………………………………………………………………………..45
2.3.3 探索NumPy 的通用函数 ………………………………………………………………………………..46
2.3.4 高级的通用函数特性 ……………………………………………………………………………………..49
2.3.5 通用函数:更多的信息 ………………………………………………………………………………….51
2.4 聚合:最小值、最大值和其他值 ……………………………………………………………………………….51
2.4.1 数组值求和 ……………………………………………………………………………………………………51
2.4.2 最小值和最大值 …………………………………………………………………………………………….52
目录 | vii
2.4.3 示例:美国总统的身高是多少 ……………………………………………………………………….54
2.5 数组的计算:广播 …………………………………………………………………………………………………….55
2.5.1 广播的介绍 ……………………………………………………………………………………………………55
2.5.2 广播的规则 ……………………………………………………………………………………………………57
2.5.3 广播的实际应用 …………………………………………………………………………………………….60
2.6 比较、掩码和布尔逻辑 ……………………………………………………………………………………………..61
2.6.1 示例:统计下雨天数 ……………………………………………………………………………………..61
2.6.2 和通用函数类似的比较操作 …………………………………………………………………………..62
2.6.3 操作布尔数组 ………………………………………………………………………………………………..64
2.6.4 将布尔数组作为掩码 ……………………………………………………………………………………..66
2.7 花哨的索引 ……………………………………………………………………………………………………………….69
2.7.1 探索花哨的索引 …………………………………………………………………………………………….69
2.7.2 组合索引 ……………………………………………………………………………………………………….70
2.7.3 示例:选择随机点 …………………………………………………………………………………………71
2.7.4 用花哨的索引修改值 ……………………………………………………………………………………..72
2.7.5 示例:数据区间划分 ……………………………………………………………………………………..73
2.8 数组的排序 ……………………………………………………………………………………………………………….75
2.8.1 NumPy 中的快速排序:np.sort 和np.argsort ………………………………………………76
2.8.2 部分排序:分隔 …………………………………………………………………………………………….77
2.8.3 示例:K 个最近邻 ………………………………………………………………………………………….78
2.9 结构化数据:NumPy 的结构化数组 …………………………………………………………………………..81
2.9.1 生成结构化数组 …………………………………………………………………………………………….83
2.9.2 更高级的复合类型 …………………………………………………………………………………………84
2.9.3 记录数组:结构化数组的扭转 ……………………………………………………………………….84
2.9.4 关于Pandas ……………………………………………………………………………………………………85
第3 章 Pandas 数据处理 ………………………………………………………………………………………………..86
3.1 安装并使用Pandas…………………………………………………………………………………………………….86
3.2 Pandas 对象简介………………………………………………………………………………………………………..87
3.2.1 Pandas 的Series 对象…………………………………………………………………………………….87
3.2.2 Pandas 的DataFrame 对象 ……………………………………………………………………………….90
3.2.3 Pandas 的Index 对象 ……………………………………………………………………………………..93
3.3 数据取值与选择 ………………………………………………………………………………………………………..95
3.3.1 Series 数据选择方法 ……………………………………………………………………………………..95
3.3.2 DataFrame 数据选择方法 ………………………………………………………………………………..98
3.4 Pandas 数值运算方法……………………………………………………………………………………………….102
3.4.1 通用函数:保留索引 ……………………………………………………………………………………102
3.4.2 通用函数:索引对齐 ……………………………………………………………………………………103
3.4.3 通用函数:DataFrame 与Series 的运算………………………………………………………..105
3.5 处理缺失值 ……………………………………………………………………………………………………………..106
3.5.1 选择处理缺失值的方法 ………………………………………………………………………………..106
viii | 目录
3.5.2 Pandas 的缺失值 …………………………………………………………………………………………..107
3.5.3 处理缺失值 ………………………………………………………………………………………………….110
3.6 层级索引 ………………………………………………………………………………………………………………..113
3.6.1 多级索引Series …………………………………………………………………………………………..113
3.6.2 多级索引的创建方法 ……………………………………………………………………………………116
3.6.3 多级索引的取值与切片 ………………………………………………………………………………..119
3.6.4 多级索引行列转换 ……………………………………………………………………………………….121
3.6.5 多级索引的数据累计方法 …………………………………………………………………………….124
3.7 合并数据集:Concat 与Append 操作 ………………………………………………………………………..125
3.7.1 知识回顾:NumPy 数组的合并 …………………………………………………………………….126
3.7.2 通过pd.concat 实现简易合并 ………………………………………………………………………126
3.8 合并数据集:合并与连接 ………………………………………………………………………………………..129
3.8.1 关系代数 ……………………………………………………………………………………………………..129
3.8.2 数据连接的类型 …………………………………………………………………………………………..130
3.8.3 设置数据合并的键 ……………………………………………………………………………………….132
3.8.4 设置数据连接的集合操作规则 ……………………………………………………………………..134
3.8.5 重复列名:suffixes 参数 ………………………………………………………………………………135
3.8.6 案例:美国各州的统计数据 …………………………………………………………………………136
3.9 累计与分组 ……………………………………………………………………………………………………………..140
3.9.1 行星数据 ……………………………………………………………………………………………………..140
3.9.2 Pandas 的简单累计功能 ………………………………………………………………………………..141
3.9.3 GroupBy:分割、应用和组合 ………………………………………………………………………..142
3.10 数据透视表 ……………………………………………………………………………………………………………150
3.10.1 演示数据透视表 ………………………………………………………………………………………..150
3.10.2 手工制作数据透视表 …………………………………………………………………………………151
3.10.3 数据透视表语法 ………………………………………………………………………………………..151
3.10.4 案例:美国人的生日 …………………………………………………………………………………153
3.11 向量化字符串操作 …………………………………………………………………………………………………157
3.11.1 Pandas 字符串操作简介 ……………………………………………………………………………..157
3.11.2 Pandas 字符串方法列表 ……………………………………………………………………………..159
3.11.3 案例:食谱数据库 …………………………………………………………………………………….163
3.12 处理时间序列 ………………………………………………………………………………………………………..166
3.12.1 Python 的日期与时间工具 ………………………………………………………………………….166
3.12.2 Pandas 时间序列:用时间作索引 ……………………………………………………………….169
3.12.3 Pandas 时间序列数据结构 ………………………………………………………………………….170
3.12.4 时间频率与偏移量 …………………………………………………………………………………….172
3.12.5 重新取样、迁移和窗口 ……………………………………………………………………………..173
3.12.6 更多学习资料 ……………………………………………………………………………………………178
3.12.7 案例:美国西雅图自行车统计数据的可视化 ……………………………………………..179
3.13 高性能Pandas:eval() 与query() ………………………………………………………………………..184
3.13.1 query() 与eval() 的设计动机:复合代数式 ……………………………………………..184
目录 | ix
3.13.2 用pandas.eval() 实现高性能运算 …………………………………………………………….185
3.13.3 用DataFrame.eval() 实现列间运算 …………………………………………………………..187
3.13.4 DataFrame.query() 方法 ……………………………………………………………………………188
3.13.5 性能决定使用时机 …………………………………………………………………………………….189
3.14 参考资料 ……………………………………………………………………………………………………………….189
第4 章 Matplotlib 数据可视化 ………………………………………………………………………………………191
4.1 Matplotlib 常用技巧 …………………………………………………………………………………………………192
4.1.1 导入Matplotlib……………………………………………………………………………………………..192
4.1.2 设置绘图样式 ………………………………………………………………………………………………192
4.1.3 用不用show() ?如何显示图形 …………………………………………………………………….192
4.1.4 将图形保存为文件 ……………………………………………………………………………………….194
4.2 两种画图接口 ………………………………………………………………………………………………………….195
4.2.1 MATLAB 风格接口 ………………………………………………………………………………………195
4.2.2 面向对象接口 ………………………………………………………………………………………………196
4.3 简易线形图 ……………………………………………………………………………………………………………..197
4.3.1 调整图形:线条的颜色与风格 ……………………………………………………………………..199
4.3.2 调整图形:坐标轴上下限 …………………………………………………………………………….200
4.3.3 设置图形标签 ………………………………………………………………………………………………203
4.4 简易散点图 ……………………………………………………………………………………………………………..204
4.4.1 用plt.plot 画散点图 …………………………………………………………………………………..205
4.4.2 用plt.scatter 画散点图 ……………………………………………………………………………..206
4.4.3 plot 与scatter:效率对比 ………………………………………………………………………….208
4.5 可视化异常处理 ………………………………………………………………………………………………………208
4.5.1 基本误差线 ………………………………………………………………………………………………….209
4.5.2 连续误差 ……………………………………………………………………………………………………..210
4.6 密度图与等高线图 …………………………………………………………………………………………………..211
4.7 频次直方图、数据区间划分和分布密度 …………………………………………………………………..215
4.8 配置图例 ………………………………………………………………………………………………………………..219
4.8.1 选择图例显示的元素 ……………………………………………………………………………………221
4.8.2 在图例中显示不同尺寸的点 …………………………………………………………………………222
4.8.3 同时显示多个图例 ……………………………………………………………………………………….223
4.9 配置颜色条 ……………………………………………………………………………………………………………..224
4.9.1 配置颜色条 ………………………………………………………………………………………………….224
4.9.2 案例:手写数字 …………………………………………………………………………………………..228
4.10 多子图 ………………………………………………………………………………………………………………….230
4.10.1 plt.axes:手动创建子图…………………………………………………………………………..230
4.10.2 plt.subplot:简易网格子图 ……………………………………………………………………..231
4.10.3 plt.subplots:用一行代码创建网格 …………………………………………………………233
4.10.4 plt.GridSpec:实现更复杂的排列方式 ……………………………………………………..234
x | 目录
4.11 文字与注释 ……………………………………………………………………………………………………………235
4.11.1 案例:节假日对美国出生率的影响 ……………………………………………………………236
4.11.2 坐标变换与文字位置 …………………………………………………………………………………237
4.11.3 箭头与注释 ……………………………………………………………………………………………….239
4.12 自定义坐标轴刻度 …………………………………………………………………………………………………241
4.12.1 主要刻度与次要刻度 …………………………………………………………………………………242
4.12.2 隐藏刻度与标签 ………………………………………………………………………………………..243
4.12.3 增减刻度数量 ……………………………………………………………………………………………244
4.12.4 花哨的刻度格式 ………………………………………………………………………………………..245
4.12.5 格式生成器与定位器小结 ………………………………………………………………………….247
4.13 Matplotlib 自定义:配置文件与样式表 …………………………………………………………………..248
4.13.1 手动配置图形 ……………………………………………………………………………………………248
4.13.2 修改默认配置:rcParams…………………………………………………………………………..249
4.13.3 样式表 ………………………………………………………………………………………………………251
4.14 用Matplotlib 画三维图 …………………………………………………………………………………………..255
4.14.1 三维数据点与线 ………………………………………………………………………………………..256
4.14.2 三维等高线图 ……………………………………………………………………………………………256
4.14.3 线框图和曲面图 ………………………………………………………………………………………..258
4.14.4 曲面三角剖分 ……………………………………………………………………………………………259
4.15 用Basemap 可视化地理数据 ………………………………………………………………………………….261
4.15.1 地图投影 …………………………………………………………………………………………………..263
4.15.2 画一个地图背景 ………………………………………………………………………………………..267
4.15.3 在地图上画数据 ………………………………………………………………………………………..269
4.15.4 案例:美国加州城市数据 ………………………………………………………………………….270
4.15.5 案例:地表温度数据 …………………………………………………………………………………271
4.16 用Seaborn 做数据可视化 ……………………………………………………………………………………….273
4.16.1 Seaborn 与Matplotlib …………………………………………………………………………………274
4.16.2 Seaborn 图形介绍 ………………………………………………………………………………………275
4.16.3 案例:探索马拉松比赛成绩数据 ……………………………………………………………….283
4.17 参考资料 ……………………………………………………………………………………………………………….290
4.17.1 Matplotlib 资源 ………………………………………………………………………………………….290
4.17.2 其他Python 画图程序库 …………………………………………………………………………….290
第5 章 机器学习 …………………………………………………………………………………………………………….291
5.1 什么是机器学习 ………………………………………………………………………………………………………291
5.1.1 机器学习的分类 …………………………………………………………………………………………..292
5.1.2 机器学习应用的定性示例 …………………………………………………………………………….292
5.1.3 小结 …………………………………………………………………………………………………………….299
5.2 Scikit-Learn 简介 ……………………………………………………………………………………………………..300
5.2.1 Scikit-Learn 的数据表示 ……………………………………………………………………………….300
5.2.2 Scikit-Learn 的评估器API …………………………………………………………………………….302
目录 | xi
5.2.3 应用:手写数字探索 ……………………………………………………………………………………309
5.2.4 小结 …………………………………………………………………………………………………………….313
5.3 超参数与模型验证 …………………………………………………………………………………………………..313
5.3.1 什么是模型验证 …………………………………………………………………………………………..314
5.3.2 选择最优模型 ………………………………………………………………………………………………317
5.3.3 学习曲线 ……………………………………………………………………………………………………..322
5.3.4 验证实践:网格搜索 ……………………………………………………………………………………326
5.3.5 小结 …………………………………………………………………………………………………………….327
5.4 特征工程 ………………………………………………………………………………………………………………..327
5.4.1 分类特征 ……………………………………………………………………………………………………..327
5.4.2 文本特征 ……………………………………………………………………………………………………..329
5.4.3 图像特征 ……………………………………………………………………………………………………..330
5.4.4 衍生特征 ……………………………………………………………………………………………………..330
5.4.5 缺失值填充 ………………………………………………………………………………………………….332
5.4.6 特征管道 ……………………………………………………………………………………………………..332
5.5 专题:朴素贝叶斯分类 ……………………………………………………………………………………………333
5.5.1 贝叶斯分类 ………………………………………………………………………………………………….333
5.5.2 高斯朴素贝叶斯 …………………………………………………………………………………………..334
5.5.3 多项式朴素贝叶斯 ……………………………………………………………………………………….336
5.5.4 朴素贝叶斯的应用场景 ………………………………………………………………………………..339
5.6 专题:线性回归 ………………………………………………………………………………………………………340
5.6.1 简单线性回归 ………………………………………………………………………………………………340
5.6.2 基函数回归 ………………………………………………………………………………………………….342
5.6.3 正则化 …………………………………………………………………………………………………………346
5.6.4 案例:预测自行车流量 ………………………………………………………………………………..349
5.7 专题:支持向量机 …………………………………………………………………………………………………..353
5.7.1 支持向量机的由来 ……………………………………………………………………………………….354
5.7.2 支持向量机:边界最大化 …………………………………………………………………………….355
5.7.3 案例:人脸识别 …………………………………………………………………………………………..363
5.7.4 支持向量机总结 …………………………………………………………………………………………..366
5.8 专题:决策树与随机森林 ………………………………………………………………………………………..367
5.8.1 随机森林的诱因:决策树 …………………………………………………………………………….367
5.8.2 评估器集成算法:随机森林 …………………………………………………………………………371
5.8.3 随机森林回归 ………………………………………………………………………………………………373
5.8.4 案例:用随机森林识别手写数字 ………………………………………………………………….374
5.8.5 随机森林总结 ………………………………………………………………………………………………376
5.9 专题:主成分分析 …………………………………………………………………………………………………..376
5.9.1 主成分分析简介 …………………………………………………………………………………………..377
5.9.2 用PCA 作噪音过滤 ………………………………………………………………………………………383
5.9.3 案例:特征脸 ………………………………………………………………………………………………385
5.9.4 主成分分析总结 …………………………………………………………………………………………..387
xii | 目录
5.10 专题:流形学习 …………………………………………………………………………………………………….388
5.10.1 流形学习:“HELLO” ………………………………………………………………………………..388
5.10.2 多维标度法(MDS) ………………………………………………………………………………….389
5.10.3 将MDS 用于流形学习 ………………………………………………………………………………391
5.10.4 非线性嵌入:当MDS 失败时 ……………………………………………………………………393
5.10.5 非线性流形:局部线性嵌入 ………………………………………………………………………395
5.10.6 关于流形方法的一些思考 ………………………………………………………………………….396
5.10.7 示例:用Isomap 处理人脸数据 …………………………………………………………………397
5.10.8 示例:手写数字的可视化结构 …………………………………………………………………..400
5.11 专题:k-means 聚类 ……………………………………………………………………………………………….402
5.11.1 k-means 简介 ……………………………………………………………………………………………..403
5.11.2 k-means 算法:期望最大化 ………………………………………………………………………..404
5.11.3 案例 ………………………………………………………………………………………………………….409
5.12 专题:高斯混合模型 ……………………………………………………………………………………………..415
5.12.1 高斯混合模型(GMM)为什么会出现:k-means 算法的缺陷 …………………….415
5.12.2 一般化E-M:高斯混合模型 ………………………………………………………………………417
5.12.3 将GMM 用作密度估计 ……………………………………………………………………………..421
5.12.4 示例:用GMM 生成新的数据 …………………………………………………………………..425
5.13 专题:核密度估计 …………………………………………………………………………………………………427
5.13.1 KDE 的由来:直方图 ………………………………………………………………………………..428
5.13.2 核密度估计的实际应用 ……………………………………………………………………………..431
5.13.3 示例:球形空间的KDE …………………………………………………………………………….433
5.13.4 示例:不是很朴素的贝叶斯 ………………………………………………………………………436
5.14 应用:人脸识别管道 ……………………………………………………………………………………………..439
5.14.1 HOG 特征 …………………………………………………………………………………………………440
5.14.2 HOG 实战:简单人脸识别器 …………………………………………………………………….441
5.14.3 注意事项与改进方案 …………………………………………………………………………………445
5.15 机器学习参考资料 …………………………………………………………………………………………………446
5.15.1 Python 中的机器学习 …………………………………………………………………………………446
5.15.2 通用机器学习资源 …………………………………………………………………………………….447
关于作者 ……………………………………………………………………………………………………………………………448
关于封面 ……………………………………………………………………………………………………………………………448

—-

前言 ……………………………………………………………………………………………………………………………………..xv
第1 章 IPython:超越Python …………………………………………………………………………………………1
1.1 shell 還是Notebook ……………………………………………………………………………………………………..1
1.1.1 啟動IPython shell …………………………………………………………………………………………….2
1.1.2 啟動Jupyter Notebook ………………………………………………………………………………………2
1.2 IPython 的幫助和文檔 …………………………………………………………………………………………………3
1.2.1 用符號? 獲取文檔 …………………………………………………………………………………………..3
1.2.2 通過符號?? 獲取原始程式碼 …………………………………………………………………………………..4
1.2.3 用Tab 補全的方式探索模組 …………………………………………………………………………….5
1.3 IPython shell 中的快速鍵 ……………………………………………………………………………………………..7
1.3.1 導航快速鍵 ……………………………………………………………………………………………………..7
1.3.2 文本輸入快速鍵 ………………………………………………………………………………………………7
1.3.3 命令歷史快速鍵 ………………………………………………………………………………………………8
1.3.4 其他快速鍵 ……………………………………………………………………………………………………..9
1.4 IPython 魔法命令 ………………………………………………………………………………………………………..9
1.4.1 粘貼代碼塊:%paste 和%cpaste ………………………………………………………………………9
1.4.2 執行外部代碼:%run ………………………………………………………………………………………10
1.4.3 計算代碼執行時間:%timeit ………………………………………………………………………….11
1.4.4 魔法函數的説明:?、%magic 和%lsmagic……………………………………………………….11
1.5 輸入和輸出歷史 ………………………………………………………………………………………………………..12
1.5.1 IPython 的輸入和輸出物件 ……………………………………………………………………………..12
1.5.2 底線快速鍵和以前的輸出……………………………………………………………………………13
1.5.3 禁止輸出 ……………………………………………………………………………………………………….13
vi | 目錄
1.5.4 相關的魔法命令 …………………………………………………………………………………………….13
1.6 IPython 和shell 命令 ………………………………………………………………………………………………….14
1.6.1 shell 快速入門 ………………………………………………………………………………………………..14
1.6.2 IPython 中的shell 命令 …………………………………………………………………………………..15
1.6.3 在shell 中傳入或傳出值 …………………………………………………………………………………15
1.7 與shell 相關的魔法命令 ……………………………………………………………………………………………16
1.8 錯誤和調試 ……………………………………………………………………………………………………………….17
1.8.1 控制異常:%xmode ………………………………………………………………………………………….17
1.8.2 調試:當閱讀軌跡追溯不足以解決問題時 ……………………………………………………..19
1.9 代碼的分析和計時 …………………………………………………………………………………………………….21
1.9.1 程式碼片段計時:%timeit 和%time ………………………………………………………………………22
1.9.2 分析整個腳本:%prun …………………………………………………………………………………….23
1.9.3 用%lprun 進行逐行分析 …………………………………………………………………………………24
1.9.4 用%memit 和%mprun 進行記憶體分析 …………………………………………………………………25
1.10 IPython 參考資料 …………………………………………………………………………………………………….26
1.10.1 網路資源 ……………………………………………………………………………………………………..26
1.10.2 相關圖書 ……………………………………………………………………………………………………..27
第2 章 NumPy 入門 ………………………………………………………………………………………………………..28
2.1 理解Python 中的資料類型…………………………………………………………………………………………29
2.1.1 Python 整型不僅僅是一個整型 ……………………………………………………………………….30
2.1.2 Python 列表不僅僅是一個列表 ……………………………………………………………………….31
2.1.3 Python 中的固定類型陣列 ………………………………………………………………………………32
2.1.4 從Python 清單創建陣列 …………………………………………………………………………………32
2.1.5 從頭創建陣列 ………………………………………………………………………………………………..33
2.1.6 NumPy 標準資料類型 …………………………………………………………………………………….34
2.2 NumPy 陣列基礎 ……………………………………………………………………………………………………….35
2.2.1 NumPy 陣列的屬性 ………………………………………………………………………………………..36
2.2.2 陣列索引:獲取單個元素 ………………………………………………………………………………37
2.2.3 陣列切片:獲取子陣列 ………………………………………………………………………………….38
2.2.4 陣列的變形 ……………………………………………………………………………………………………41
2.2.5 陣列拼接和分裂 …………………………………………………………………………………………….42
2.3 NumPy 陣列的計算:通用函數 ………………………………………………………………………………….44
2.3.1 緩慢的迴圈 ……………………………………………………………………………………………………44
2.3.2 通用函數介紹 ………………………………………………………………………………………………..45
2.3.3 探索NumPy 的通用函數 ………………………………………………………………………………..46
2.3.4 高級的通用函數特性 ……………………………………………………………………………………..49
2.3.5 通用函數:更多的資訊 ………………………………………………………………………………….51
2.4 聚合:最小值、最大值和其他值 ……………………………………………………………………………….51
2.4.1 陣列值求和 ……………………………………………………………………………………………………51
2.4.2 最小值和最大值 …………………………………………………………………………………………….52
目錄 | vii
2.4.3 示例:美國總統的身高是多少 ……………………………………………………………………….54
2.5 陣列的計算:廣播 …………………………………………………………………………………………………….55
2.5.1 廣播的介紹 ……………………………………………………………………………………………………55
2.5.2 廣播的規則 ……………………………………………………………………………………………………57
2.5.3 廣播的實際應用 …………………………………………………………………………………………….60
2.6 比較、遮罩和布林邏輯 ……………………………………………………………………………………………..61
2.6.1 示例:統計下雨天數 ……………………………………………………………………………………..61
2.6.2 和通用函數類似的比較操作 …………………………………………………………………………..62
2.6.3 操作布林陣列 ………………………………………………………………………………………………..64
2.6.4 將布林陣列作為遮罩 ……………………………………………………………………………………..66
2.7 花哨的索引 ……………………………………………………………………………………………………………….69
2.7.1 探索花哨的索引 …………………………………………………………………………………………….69
2.7.2 組合索引 ……………………………………………………………………………………………………….70
2.7.3 示例:選擇隨機點 …………………………………………………………………………………………71
2.7.4 用花哨的索引修改值 ……………………………………………………………………………………..72
2.7.5 示例:資料區間劃分 ……………………………………………………………………………………..73
2.8 陣列的排序 ……………………………………………………………………………………………………………….75
2.8.1 NumPy 中的快速排序:np.sort 和np.argsort ………………………………………………76
2.8.2 部分排序:分隔 …………………………………………………………………………………………….77
2.8.3 示例:K 個最近鄰 ………………………………………………………………………………………….78
2.9 結構化資料:NumPy 的結構化陣列 …………………………………………………………………………..81
2.9.1 生成結構化陣列 …………………………………………………………………………………………….83
2.9.2 更高級的複合類型 …………………………………………………………………………………………84
2.9.3 記錄陣列:結構化陣列的扭轉 ……………………………………………………………………….84
2.9.4 關於Pandas ……………………………………………………………………………………………………85
第3 章 Pandas 資料處理 ………………………………………………………………………………………………..86
3.1 安裝並使用Pandas…………………………………………………………………………………………………….86
3.2 Pandas 對象簡介………………………………………………………………………………………………………..87
3.2.1 Pandas 的Series 對象…………………………………………………………………………………….87
3.2.2 Pandas 的DataFrame 對象 ……………………………………………………………………………….90
3.2.3 Pandas 的Index 對象 ……………………………………………………………………………………..93
3.3 資料取值與選擇 ………………………………………………………………………………………………………..95
3.3.1 Series 資料選擇方法 ……………………………………………………………………………………..95
3.3.2 DataFrame 資料選擇方法 ………………………………………………………………………………..98
3.4 Pandas 數值運算方法……………………………………………………………………………………………….102
3.4.1 通用函數:保留索引 ……………………………………………………………………………………102
3.4.2 通用函數:索引對齊 ……………………………………………………………………………………103
3.4.3 通用函數:DataFrame 與Series 的運算………………………………………………………..105
3.5 處理缺失值 ……………………………………………………………………………………………………………..106
3.5.1 選擇處理缺失值的方法 ………………………………………………………………………………..106
viii | 目錄
3.5.2 Pandas 的缺失值 …………………………………………………………………………………………..107
3.5.3 處理缺失值 ………………………………………………………………………………………………….110
3.6 層級索引 ………………………………………………………………………………………………………………..113
3.6.1 多級索引Series …………………………………………………………………………………………..113
3.6.2 多級索引的創建方法 ……………………………………………………………………………………116
3.6.3 多級索引的取值與切片 ………………………………………………………………………………..119
3.6.4 多級索引行列轉換 ……………………………………………………………………………………….121
3.6.5 多級索引的資料累計方法 …………………………………………………………………………….124
3.7 合併資料集:Concat 與Append 操作 ………………………………………………………………………..125
3.7.1 知識回顧:NumPy 陣列的合併 …………………………………………………………………….126
3.7.2 通過pd.concat 實現簡易合併 ………………………………………………………………………126
3.8 合併資料集:合併與連接 ………………………………………………………………………………………..129
3.8.1 關聯代數 ……………………………………………………………………………………………………..129
3.8.2 資料連接的類型 …………………………………………………………………………………………..130
3.8.3 設置數據合併的鍵 ……………………………………………………………………………………….132
3.8.4 設置資料連接的集合操作規則 ……………………………………………………………………..134
3.8.5 重複列名:suffixes 參數 ………………………………………………………………………………135
3.8.6 案例:美國各州的統計資料 …………………………………………………………………………136
3.9 累計與分組 ……………………………………………………………………………………………………………..140
3.9.1 行星數據 ……………………………………………………………………………………………………..140
3.9.2 Pandas 的簡單累計功能 ………………………………………………………………………………..141
3.9.3 GroupBy:分割、應用和組合 ………………………………………………………………………..142
3.10 樞紐分析表 ……………………………………………………………………………………………………………150
3.10.1 演示樞紐分析表 ………………………………………………………………………………………..150
3.10.2 手工製作樞紐分析表 …………………………………………………………………………………151
3.10.3 樞紐分析表語法 ………………………………………………………………………………………..151
3.10.4 案例:美國人的生日 …………………………………………………………………………………153
3.11 向量化字串操作 …………………………………………………………………………………………………157
3.11.1 Pandas 字串操作簡介 ……………………………………………………………………………..157
3.11.2 Pandas 字串方法清單 ……………………………………………………………………………..159
3.11.3 案例:食譜資料庫 …………………………………………………………………………………….163
3.12 處理時間序列 ………………………………………………………………………………………………………..166
3.12.1 Python 的日期與時間工具 ………………………………………………………………………….166
3.12.2 Pandas 時間序列:用時間作索引 ……………………………………………………………….169
3.12.3 Pandas 時間序列資料結構 ………………………………………………………………………….170
3.12.4 時間頻率與偏移量 …………………………………………………………………………………….172
3.12.5 重新取樣、遷移和窗口 ……………………………………………………………………………..173
3.12.6 更多學習資料 ……………………………………………………………………………………………178
3.12.7 案例:美國西雅圖自行車統計資料的視覺化 ……………………………………………..179
3.13 高性能Pandas:eval() 與query() ………………………………………………………………………..184
3.13.1 query() 與eval() 的設計動機:複合代數式 ……………………………………………..184
目錄 | ix
3.13.2 用pandas.eval() 實現高性能運算 …………………………………………………………….185
3.13.3 用DataFrame.eval() 實現列間運算 …………………………………………………………..187
3.13.4 DataFrame.query() 方法 ……………………………………………………………………………188
3.13.5 性能決定使用時機 …………………………………………………………………………………….189
3.14 參考資料 ……………………………………………………………………………………………………………….189
第4 章 Matplotlib 數據視覺化 ………………………………………………………………………………………191
4.1 Matplotlib 常用技巧 …………………………………………………………………………………………………192
4.1.1 導入Matplotlib……………………………………………………………………………………………..192
4.1.2 設置繪圖樣式 ………………………………………………………………………………………………192
4.1.3 用不用show() ?如何顯示圖形 …………………………………………………………………….192
4.1.4 將圖形保存為檔 ……………………………………………………………………………………….194
4.2 兩種畫圖介面 ………………………………………………………………………………………………………….195
4.2.1 MATLAB 風格介面 ………………………………………………………………………………………195
4.2.2 物件導向介面 ………………………………………………………………………………………………196
4.3 簡易線形圖 ……………………………………………………………………………………………………………..197
4.3.1 調整圖形:線條的顏色與風格 ……………………………………………………………………..199
4.3.2 調整圖形:坐標軸上下限 …………………………………………………………………………….200
4.3.3 設置圖形標籤 ………………………………………………………………………………………………203
4.4 簡易散點圖 ……………………………………………………………………………………………………………..204
4.4.1 用plt.plot 畫散點圖 …………………………………………………………………………………..205
4.4.2 用plt.scatter 畫散點圖 ……………………………………………………………………………..206
4.4.3 plot 與scatter:效率對比 ………………………………………………………………………….208
4.5 視覺化異常處理 ………………………………………………………………………………………………………208
4.5.1 基本誤差線 ………………………………………………………………………………………………….209
4.5.2 連續誤差 ……………………………………………………………………………………………………..210
4.6 密度圖與等高線圖 …………………………………………………………………………………………………..211
4.7 頻次長條圖、資料區間劃分和分佈密度 …………………………………………………………………..215
4.8 配置圖例 ………………………………………………………………………………………………………………..219
4.8.1 選擇圖例顯示的元素 ……………………………………………………………………………………221
4.8.2 在圖例中顯示不同尺寸的點 …………………………………………………………………………222
4.8.3 同時顯示多個圖例 ……………………………………………………………………………………….223
4.9 配置顏色條 ……………………………………………………………………………………………………………..224
4.9.1 配置顏色條 ………………………………………………………………………………………………….224
4.9.2 案例:手寫數字 …………………………………………………………………………………………..228
4.10 多子圖 ………………………………………………………………………………………………………………….230
4.10.1 plt.axes:手動創建子圖…………………………………………………………………………..230
4.10.2 plt.subplot:簡易網格子圖 ……………………………………………………………………..231
4.10.3 plt.subplots:用一行代碼創建網格 …………………………………………………………233
4.10.4 plt.GridSpec:實現更複雜的排列方式 ……………………………………………………..234
x | 目錄
4.11 文字與注釋 ……………………………………………………………………………………………………………235
4.11.1 案例:節假日對美國出生率的影響 ……………………………………………………………236
4.11.2 座標變換與文字位置 …………………………………………………………………………………237
4.11.3 箭頭與注釋 ……………………………………………………………………………………………….239
4.12 自訂坐標軸刻度 …………………………………………………………………………………………………241
4.12.1 主要刻度與次要刻度 …………………………………………………………………………………242
4.12.2 隱藏刻度與標籤 ………………………………………………………………………………………..243
4.12.3 增減刻度數量 ……………………………………………………………………………………………244
4.12.4 花哨的刻度格式 ………………………………………………………………………………………..245
4.12.5 格式生成器與定位器小結 ………………………………………………………………………….247
4.13 Matplotlib 自訂:設定檔與樣式表 …………………………………………………………………..248
4.13.1 手動配置圖形 ……………………………………………………………………………………………248
4.13.2 修改預設配置:rcParams…………………………………………………………………………..249
4.13.3 樣式表 ………………………………………………………………………………………………………251
4.14 用Matplotlib 畫三維圖 …………………………………………………………………………………………..255
4.14.1 三維資料點與線 ………………………………………………………………………………………..256
4.14.2 三維等高線圖 ……………………………………………………………………………………………256
4.14.3 線框圖和曲面圖 ………………………………………………………………………………………..258
4.14.4 曲面三角剖分 ……………………………………………………………………………………………259
4.15 用Basemap 視覺化地理資料 ………………………………………………………………………………….261
4.15.1 地圖投影 …………………………………………………………………………………………………..263
4.15.2 畫一個地圖背景 ………………………………………………………………………………………..267
4.15.3 在地圖上畫資料 ………………………………………………………………………………………..269
4.15.4 案例:美國加州城市資料 ………………………………………………………………………….270
4.15.5 案例:地表溫度資料 …………………………………………………………………………………271
4.16 用Seaborn 做數據視覺化 ……………………………………………………………………………………….273
4.16.1 Seaborn 與Matplotlib …………………………………………………………………………………274
4.16.2 Seaborn 圖形介紹 ………………………………………………………………………………………275
4.16.3 案例:探索馬拉松比賽成績資料 ……………………………………………………………….283
4.17 參考資料 ……………………………………………………………………………………………………………….290
4.17.1 Matplotlib 資源 ………………………………………………………………………………………….290
4.17.2 其他Python 畫圖程式庫 …………………………………………………………………………….290
第5 章 機器學習 …………………………………………………………………………………………………………….291
5.1 什麼是機器學習 ………………………………………………………………………………………………………291
5.1.1 機器學習的分類 …………………………………………………………………………………………..292
5.1.2 機器學習應用的定性示例 …………………………………………………………………………….292
5.1.3 小結 …………………………………………………………………………………………………………….299
5.2 Scikit-Learn 簡介 ……………………………………………………………………………………………………..300
5.2.1 Scikit-Learn 的資料表示 ……………………………………………………………………………….300
5.2.2 Scikit-Learn 的評估器API …………………………………………………………………………….302
目錄 | xi
5.2.3 應用:手寫數字探索 ……………………………………………………………………………………309
5.2.4 小結 …………………………………………………………………………………………………………….313
5.3 超參數與模型驗證 …………………………………………………………………………………………………..313
5.3.1 什麼是模型驗證 …………………………………………………………………………………………..314
5.3.2 選擇最優模型 ………………………………………………………………………………………………317
5.3.3 學習曲線 ……………………………………………………………………………………………………..322
5.3.4 驗證實踐:網格搜索 ……………………………………………………………………………………326
5.3.5 小結 …………………………………………………………………………………………………………….327
5.4 特徵工程 ………………………………………………………………………………………………………………..327
5.4.1 分類特徵 ……………………………………………………………………………………………………..327
5.4.2 文本特徵 ……………………………………………………………………………………………………..329
5.4.3 圖像特徵 ……………………………………………………………………………………………………..330
5.4.4 衍生特徵 ……………………………………………………………………………………………………..330
5.4.5 缺失值填充 ………………………………………………………………………………………………….332
5.4.6 特徵管道 ……………………………………………………………………………………………………..332
5.5 專題:樸素貝葉斯分類 ……………………………………………………………………………………………333
5.5.1 貝葉斯分類 ………………………………………………………………………………………………….333
5.5.2 高斯樸素貝葉斯 …………………………………………………………………………………………..334
5.5.3 多項式樸素貝葉斯 ……………………………………………………………………………………….336
5.5.4 樸素貝葉斯的應用場景 ………………………………………………………………………………..339
5.6 專題:線性回歸 ………………………………………………………………………………………………………340
5.6.1 簡單線性回歸 ………………………………………………………………………………………………340
5.6.2 基函數回歸 ………………………………………………………………………………………………….342
5.6.3 正則化 …………………………………………………………………………………………………………346
5.6.4 案例:預測自行車流量 ………………………………………………………………………………..349
5.7 專題:支持向量機 …………………………………………………………………………………………………..353
5.7.1 支持向量機的由來 ……………………………………………………………………………………….354
5.7.2 支持向量機:邊界最大化 …………………………………………………………………………….355
5.7.3 案例:人臉識別 …………………………………………………………………………………………..363
5.7.4 支持向量機總結 …………………………………………………………………………………………..366
5.8 專題:決策樹與隨機森林 ………………………………………………………………………………………..367
5.8.1 隨機森林的誘因:決策樹 …………………………………………………………………………….367
5.8.2 評估器集成演算法:隨機森林 …………………………………………………………………………371
5.8.3 隨機森林回歸 ………………………………………………………………………………………………373
5.8.4 案例:用隨機森林識別手寫數字 ………………………………………………………………….374
5.8.5 隨機森林總結 ………………………………………………………………………………………………376
5.9 專題:主成分分析 …………………………………………………………………………………………………..376
5.9.1 主成分分析簡介 …………………………………………………………………………………………..377
5.9.2 用PCA 作噪音過濾 ………………………………………………………………………………………383
5.9.3 案例:特徵臉 ………………………………………………………………………………………………385
5.9.4 主成分分析總結 …………………………………………………………………………………………..387
xii | 目錄
5.10 專題:流形學習 …………………………………………………………………………………………………….388
5.10.1 流形學習:“HELLO” ………………………………………………………………………………..388
5.10.2 多維標度法(MDS) ………………………………………………………………………………….389
5.10.3 將MDS 用於流形學習 ………………………………………………………………………………391
5.10.4 非線性嵌入:當MDS 失敗時 ……………………………………………………………………393
5.10.5 非線性流形:局部線性嵌入 ………………………………………………………………………395
5.10.6 關於流形方法的一些思考 ………………………………………………………………………….396
5.10.7 示例:用Isomap 處理人臉資料 …………………………………………………………………397
5.10.8 示例:手寫數位的視覺化結構 …………………………………………………………………..400
5.11 專題:k-means 聚類 ……………………………………………………………………………………………….402
5.11.1 k-means 簡介 ……………………………………………………………………………………………..403
5.11.2 k-means 演算法:期望最大化 ………………………………………………………………………..404
5.11.3 案例 ………………………………………………………………………………………………………….409
5.12 專題:高斯混合模型 ……………………………………………………………………………………………..415
5.12.1 高斯混合模型(GMM)為什麼會出現:k-means 演算法的缺陷 …………………….415
5.12.2 一般化E-M:高斯混合模型 ………………………………………………………………………417
5.12.3 將GMM 用作密度估計 ……………………………………………………………………………..421
5.12.4 示例:用GMM 生成新的資料 …………………………………………………………………..425
5.13 專題:核密度估計 …………………………………………………………………………………………………427
5.13.1 KDE 的由來:長條圖 ………………………………………………………………………………..428
5.13.2 核密度估計的實際應用 ……………………………………………………………………………..431
5.13.3 示例:球形空間的KDE …………………………………………………………………………….433
5.13.4 示例:不是很樸素的貝葉斯 ………………………………………………………………………436
5.14 應用:人臉識別管道 ……………………………………………………………………………………………..439
5.14.1 HOG 特徵 …………………………………………………………………………………………………440
5.14.2 HOG 實戰:簡單人臉識別器 …………………………………………………………………….441
5.14.3 注意事項與改進方案 …………………………………………………………………………………445
5.15 機器學習參考資料 …………………………………………………………………………………………………446
5.15.1 Python 中的機器學習 …………………………………………………………………………………446
5.15.2 通用機器學習資源 …………………………………………………………………………………….447
關於作者 ……………………………………………………………………………………………………………………………448
關於封面 ……………………………………………………………………………………………………………………………448

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *