
数据分析与可视化在大数据时代扮演着重要角色。数据分析用于将原始数据转化为可行的见解,可视化能将关键数据和特征直观地表达出来。本书深入浅出地介绍了数据分析与可视化的相关理论和实践,全书共7章。第1章阐明NumPy的基础操作。第2章详细介绍NumPy的高级应用,内容包括数组的高级索引方式、张量的合并与分割、NumPy文件的读与写。第3章介绍Pandas的基本特性。第4章详细阐述Pandas的高级特性。第5章详细讨论可视化工具Matplotlib的用法。第6章介绍高阶可视化工具Seaborn的用法。第7章讲解时间序列数据的处理。每个章节均给出了可用性强的实战项目。本书结构完整、行文流畅,是一本图文并茂、通俗易懂的数据分析与可视化的零基础入门著作。对于计算机、大数据、人工智能及相关专业的本科生和研究生,这是一本适合入门与系统学习的教材;对于从事数据分析与可视化的工程技术人员,本书亦有很高的参考价值。
自 序 早在汉代,司马迁就提出了“运筹帷幄之中,决胜千里之外”的浪漫式期许。这里“筹”,实际上就是竹签做的“筹码”,它是一种计算工具,也是数字的物态表征工具。 “运筹”演化到今天,就叫“数据分析”。所不同的是,“运筹”的场所发生了变化,它不再是“帷幄”,而是计算机。然而,“决胜千里之外”亘古不变。 当前,我们正身处在一个大数据时代。大数据作为对客观世界的一个同构表征 ,给我们提供了一个难得机遇,让我们有机会利用科学研究的第四范式——数据分析去感知世界、研究世界,进而改造世界。在这个过程中,数据科学家无疑发挥着巨大的作用。 身处大数据时代,自由行走“江湖”的本领必须包括数据分析。2013年,托马斯·达文波特(Thomas Davenport)等人就在《哈佛商业评论》中指出,数据分析师是21世纪最性感的职业 。落实到实操层面,在很大程度上,Python生态大家族中的成员,如Numpy、Pandas等都为这份“性感”增色不少。 然而,人类是有视觉青睐的,高度抽象的数据并不符合人类的认知惯性。用丹尼尔·卡尼曼(Daniel Kahneman)在《思考,快与慢》一书的观点来说,人类更倾向于符合直觉、不需要深度思考的“系统1(System 1)”,数据可视化以一种更直观的方式展现数据,这无疑是迎合了人类的这一认知偏好。数据可视化大大提升了数据的表达张力、理解力甚至冲击力。在Python生态中,Matplotlib和Seaborn等对数据可视化起着至关重要的作用。 本书定位于对Numpy和Pandas等工具包的介绍和运用这些工具包进行数据分析,以及对Matplotlib和Seaborn等类库的介绍和利用这些类库进行可视化呈现。 不可否认,目前市面上相关技术类的图书并不少见,然而大部分较为晦涩,学术性较强,可读性不高,要么实践性案例较少,要么案例难度较大。这样的图书对读者并不友好,从而导致读者的学习曲线变得比较陡峭,降低了知识传播效率。 当读者在阅读图书而感到难以理解时,其实大多数情况并不是读者理解力或者知识储备的问题,而是著作人没有用足够的诚意和精力对作品的语言描述进行反复推敲、对其表达进行反复斟酌。写作其实是一个手艺活,科技写作亦是如此。所幸的是,编者团队喜欢并擅长(科技)写作,曾先后出过10余本科技著作并获得了很好的口碑和市场认可。 本书特色: (1)通俗易懂,图文并茂。在写作风格上,不同于传统技术图书刻板的技术写作方式,本书生动阐述技术背后的内涵(蕴含思政元素)。本书通俗易懂,并配备了大量精心绘制的插图,从而大大降低了阅读门槛。 (2)实用导向,精益求精。这里的“精”是指,让读者尽快掌握数据分析与可视化实践的“最少必要知识(Minimal Actionable Knowledge and Experience,MAKE)”。在最短时间内,让读者掌握数据分析与可视化的MAKE实践之道,节省读者的时间成本。 (3)实战前沿,产教融合。与传统教材相比,本书吸纳国内外最前沿的案例、最近期的开源项目(如GitHub、Gitee等)和原始数据,并与大数据企业合作,所选实战案例具有前沿性、新颖性和实用性。 阅读准备 阅读本书,读者需要具备一定的Python编程基础。要想运行本书中的示例代码,需要提前安装如下系统及软件。 ? 操作系统:Windows、macOS、Linux均可。 ? Python环境:建议使用Anaconda安装,确保版本为Python 3.6+即可。 ? NumPy:建议使用Anaconda安装NumPy 1.18或以上版本。 ? Pandas:建议使用Anaconda安装Pandas 1.3.0或以上版本。 联系作者 从构思大纲、查阅资料、撰写内容、绘制图片,到出版成书,本书得益于多方面的帮助和支持,它也是多人相互协作的结果,其中,河南工业大学张玉宏编写了图书的第1~5章,河南工业大学侯慧芳编写了第6章,河南工业大学樊超编写了第7章。科大讯飞教育发展有限公司高级工程师张承云负责企业实践项目案例审查与修订。张玉宏统筹全书的编写工作。 数据分析与可视化是一个前沿且广袤的研究领域,编者自认才疏学浅,同时限于时间与篇幅,书中难免出现理解偏差和错缪之处。若读者朋友们在阅读本书的过程中发现问题,希望能及时与我们联系,我们将在第一时间修正并对此不胜感激。 联系邮件为zhangyuhong001@gmail.com。读者也可以在知乎关注“玉来愈宏”,在这里,你能找到本书的勘误与补充材料。 致谢 在信息获取上,编者在各种参考资料中学习并吸纳了很多精华知识,书中也尽可能地给出了文献出处,如有疏漏,望来信告知。在这里,我对这些高价值资料的提供者、生产者表示深深的敬意和感谢。同时,感谢河南省教育厅自然科学项目(项目号: 22A520025)、2021 郑州市数字人才相关“订单式”培养教材出版基金、河南工业大学校级规划教材项目(项目号:26400522)的支持。 很多人在这本书的出版过程中扮演了重要角色——电子工业出版社的孟宇老师在选题策划上,河南工业大学的刘国震、钟克针、张航等同学在文字校对上,都付出了辛勤的劳动,在此对他们一并表示感谢。 张玉宏 2022年6月于郑州
目 录 第1章 NumPy数值计算基础 001 1.1 为何还需NumPy 002 1.2 如何安装和导入NumPy 002 1.3 N维数组的本质 003 1.3.1 NumPy数组的两种视图 004 1.3.2 数组的常用属性 004 1.4 如何生成NumPy数组 008 1.4.1 利用序列生成 008 1.4.2 利用特定方法生成 009 1.4.3 利用其他常用方法 011 1.5 NumPy中的随机数生成 014 1.6 NumPy数组中的运算 016 1.6.1 向量运算 016 1.6.2 NumPy中的通用函数 017 1.6.3 逐元素运算与点乘运算 019 1.6.4 向量的内积与矩阵乘法 020 1.7 NumPy中的广播机制 022 1.7.1 广播的本质 022 1.7.2 “低维有1”情况下的广播 023 1.7.3 “后缘相符”情况下的广播 023 1.7.4 “后缘不符但低维有1”情况下的广播 024 1.8 NumPy中的轴 026 1.8.1 认识轴的概念 026 1.8.2 基于轴的约减操作 027 1.8.3 基于轴的各种运算 028 1.9 操作数组元素 031 1.9.1 通过索引访问数组元素 031 1.9.2 NumPy中的切片访问 033 1.9.3 二维数组的转置与展平 035 1.10 实战:张量思维的养成——利用NumPy计算π 038 1.11 本章小结 042 1.12 思考与提高 042 第2章 NumPy数值计算进阶 044 2.1 NumPy数组的高级索引 045 2.1.1 花式索引 045 2.1.2 好用的布尔索引 050 2.2 张量的堆叠操作与分割 051 2.2.1 水平方向堆叠hstack 052 2.2.2 垂直方向堆叠vstack 053 2.2.3 深度方向堆叠dstack 054 2.2.4 张量的分割操作 056 2.3 NumPy张量的升维与降维 062 2.4 数据的去重与铺叠 064 2.4.1 用unique去重 065 2.4.2 用tile铺叠数据 068 2.5 张量的排序 071 2.5.1 数值排序 071 2.5.2 按列名(order)排序 073 2.5.3 多序列排序(lexsort) 076 2.5.4 索引排序(argsort) 078 2.5.5 索引最大值(argmax)与最小值(argmin) 080 2.6 常用的统计方法 081 2.6.1 最大值、最小值与极值区间 082 2.6.2 均值、中位数、百分数与方差 083 2.6.3 众数与堆统计 084 2.7 NumPy文件的读与写 086 2.7.1 二进制文件的读与写 087 2.7.2 文本文件的读与写 090 2.7.3 CSV文件的读与写 091 2.8 基于NumPy的综合实践 093 2.8.1 鸢尾花数据集的统计分析 093 2.8.2 电力负荷数据的处理 097 2.9 本章小结 100 2.10 思考与练习 101 第3章 Pandas数据分析初步 102 3.1 Pandas简介与安装 103 3.2 Series类型数据 104 3.2.1 Series的创建 104 3.2.2 索引访问与重建索引 106 3.2.3 通过字典构建Series 109 3.2.4 Series中数据的选择 110 3.2.5 向量化操作 112 3.2.6 布尔索引 114 3.2.7 切片访问 114 3.2.8 数值的删除 115 3.2.9 数值的添加 117 3.3 DataFrame 类型数据 119 3.3.1 构建DataFrame 120 3.3.2 访问DataFrame中的列与行 122 3.3.3 DataFrame的删除操作 128 3.3.4 添加行与列 130 3.4 基于Pandas的文件读取与分析 135 3.4.1 读取CSV文件——以工资信息表为例 136 3.4.2 DataFrame中的常用属性 137 3.4.3 DataFrame中的常用方法 138 3.4.4 DataFrame的条件过滤 141 3.4.5 DataFrame的切片操作 143 3.4.6 DataFrame的排序操作 145 3.5 实战:读取Excel文件——以电力负荷数据为例 146 3.5.1 数据源参数 147 3.5.2 特定表单参数 147 3.5.3 表头读数 150 3.5.4 表头名称参数 151 3.5.5 索引列参数 152 3.5.6 解析列参数 152 3.5.7 数据转换参数 153 3.6 本章小结 153 3.7 思考与练习 154 第4章 Pandas数据预处理与深加工 156 4.1 数据清洗 157 4.1.1 缺失值标记与检测 157 4.1.2 检测形式各异的缺失值 159 4.1.3 缺失值的删除 161 4.1.4 缺失值的填充 163 4.2 数据的标准化 168 4.2.1 MAX-MIN归一化 168 4.2.2 零均值标准化 171 4.3 数据变换与数据离散化 172 4.3.1 类别型数据的哑变量处理 172 4.3.2 连续型变量的离散化 174 4.4 函数的映射与应用 178 4.4.1 map函数的使用 178 4.4.2 apply函数的使用 183 4.4.3 applymap函数的使用 188 4.5 索引的高阶应用 189 4.5.1 重建索引 189 4.5.2 设置索引 190 4.5.3 重置索引 193 4.5.4 分层索引 195 4.5.5 实战:《指环王》台词数量分析 201 4.6 数据的融合与堆叠 205 4.6.1 merge按键数据融合 205 4.6.2 concat按轴堆叠数据 210 4.6.3 append数据项追加 214 4.7 数据的聚合和分组操作 215 4.7.1 聚合操作 216 4.7.2 分组与聚合 217 4.7.3 分组与转换 220 4.8 数据重塑与透视 224 4.8.1 数据重塑 224 4.8.2 数据透视 228 4.8.3 实战:《指环王》中的透视表 230 4.9 实战:泰坦尼克幸存者数据预处理分析 234 4.9.1 数据简介 234 4.9.2 数据探索 236 4.9.3 缺失值处理 238 4.10 本章小结 241 4.11 思考与练习 242 第5章 Matplotlib可视化分析 244 5.1 可视化与Matplot 245 5.2 Matplot绘制简单图形 246 5.3 pyplot的常用方法 249 5.3.1 添加图例与注释 249 5.3.2 设置(中文)标题及坐标轴 251 5.3.3 添加网格线 256 5.3.4 绘制多个子图 257 5.3.5 Axes与subplot的区别 259 5.3.6 图形的填充 265 5.4 折线图 268 5.5 散点图 270 5.6 条形图与直方图 271 5.6.1 垂直条形图 271 5.6.2 水平条形图 273 5.6.3 并列条形图 274 5.6.4 直方图 278 5.7 饼状图 281 5.8 箱形图 283 5.9 误差条 285 5.10 实战:谷歌流感趋势数据可视化分析 287 5.10.1 谷歌流感趋势数据描述 287 5.10.2 导入数据与数据预处理 288 5.10.3 绘制时序曲线图 291 5.10.4 选择合适的数据可视化表达 293 5.10.5 基于条件判断的图形绘制 296 5.10.6 绘制多个子图 299 5.11 本章小结 300 5.12 思考与提高 301 第6章 可视化分析进阶 304 6.1 绚丽多姿的Seaborn 305 6.1.1 Matplotlib与Seaborn对比 305 6.1.2 Seaborn的样式设置 308 6.1.3 设置应用模式与绘图元素缩放比例 309 6.1.4 使用despine方法进行边框控制 311 6.1.5 使用axes_style方法设置子图风格 312 6.2 Seaborn中的常用绘图 315 6.2.1 回归图 315 6.2.2 对图 317 6.2.3 密度图 319 6.2.4 直方图 323 6.2.5 热力图 329 6.2.6 箱形图 330 6.2.7 小提琴图 334 6.3 手绘风格的绘图 338 6.3.1 手绘曲线 338 6.3.2 手绘柱状图 339 6.3.3 在手绘图中添加中文卡通字体 340 6.3.4 手绘饼状图 343 6.4 实战:泰坦尼克幸存者数据可视化分析 345 6.4.1 导入数据 345 6.4.2 绘制幸存者情况 346 6.4.3 绘制乘客的其他信息 346 6.5 本章小结 351 6.6 思考与练习 351 第7章 时间序列数据分析 354 7.1 时间序列数据概述 355 7.2 日期和时间数据类型 356 7.2.1 datetime模块 356 7.2.2 datetime转换为timestamp 357 7.2.3 datetime转换为str 359 7.2.4 datetime的加与减 359 7.2.5 NumPy中的日期模块 360 7.3 时间序列对象的构建与切片 362 7.3.1 时间序列构造 362 7.3.2 时间索引与切片 364 7.4 日期范围、频率和移位 365 7.4.1 日期范围 366 7.4.2 时间频率 367 7.4.3 时间序列的移位操作 368 7.5 时期的表示 371 7.5.1 时期的创建与运算 371 7.5.2 频率转换 374 7.5.3 时期与周期的转换 375 7.6 时间滑动窗口 376 7.7 重采样、降采样和升采样 383 7.7.1 重采样 383 7.7.2 降采样中的常用参数 385 7.7.3 升采样中的缺失值填充 387 7.8 实战:面向股票数据的时间序列分析 390 7.8.1 股票数据的获取 390 7.8.2 设置百日滚动均线 393 7.8.3 绘制价格与成交量子图 393 7.8.4 股票数据的K线图绘制 395 7.9 本章小结 397 7.10 思考与练习 398