《Python数据分析与数据化运营》第一版 常见问题
“本文汇总《Python 数据分析与数据化运营》读者常见问题与解答,涵盖数据维度等核心概念解析、PIL与Matplotlib等依赖库环境配置指南、Pandas排序与模型预测等代码实操报错排查,并补充纸质书缺失的彩色图表及Python双版本随书源码下载资源,提供全面的学习避坑与实战指南。”
《Python 数据分析与数据化运营》读者常见问题答疑汇总
在这篇文章中,我会把读者反馈给我的常见问题总结出来,供更多读者参考。里面会涉及到各种疑问或混淆知识点,希望能给大家解惑。如果大家有什么疑问,可以直接在这里留言,我会将一些跟本书相关的知识性问题总结出来并在此回答。
最近更新时间:2021-07-05
一、核心概念与理论解惑
1. 对于一维数据而言,reshape 之后仍然是一维,为什么还要做 reshape 操作?
问题描述: 在第一章的代码示例中,有一段如下代码:
python
为什么需要对 x 做 reshape?即使是 reshape,x 仍然是 1 维数据啊(只有一列)?
回答:
对于 sklearn 中的 fit 方法而言,对输入的 x 的要求一般都是一个二维空间矩阵,即 shape 是一个 m×n 的矩阵。对于案例中的 x 而言,在使用 numpy.array(x) 方法后,其 shape 是 [100,],这是一个一维空间数据:
python
而 reshape 之后的 shape 是 [100, 1],这是一个二维空间下的矩阵:
python
上述代码返回如下:
code
注意:
x的前 5 条数据跟上面的不同,里面多了一个维度。
再推广下,如果 shape 后是 [100, 1, 1],那么这是 1 个三维空间矩阵:
python
上述代码返回结果如下:
code
这里面其实有一个关于维度的概念容易混淆。在 sklearn 中的维度指的是维度空间,而不是列。为了更好的区分这两个概念,前者通常称为 dimension,后者称为 feature。
对于二维(dimension)空间下的数据而言,无论有多少个 feature,都是一个二维空间数据。例如 [3, 4]、[100, 10000],这些都是二维空间下的矩阵,只是 feature 的数量不同而已。日常情况下,由于大家会将 feature 理解为 dimension,所以会产生混淆。
2. 这本书基本都能掌握的话,在数据分析中属于什么段位水准?
回答: 对分析师而言,这个角色的要求一般包括数据类技能和业务类技能两方面。本书中尽量将我过往的经历总结出来,希望能给读者参考。
- 数据类技能:由于书中考虑到兼顾更多读者的现有知识水平和状态,因此涉及到了多种“参差不齐”的知识点和技能点。但读者会发现,越往后的综合数据技能应用的难度越高。整体上,如果都能掌握的话,数据类技能属于高级分析师的水平。
- 业务类技能:这种经验的培养其实很难在一朝一夕内掌握,更不是在看了一本书之后就能完全体会的。这类业务技能决定了在面对一个命题(例如数据分析、专项分析甚至报表数据)时的思维状态、发散点和思维方式,这些都需要时间来沉淀。本书总结的这些,需要读者跟实际运营业务相结合去体会才能有真正的感觉,否则里面的经验点很难体现出价值。
因此,整体上:
- 如果读者已经是一个中级分析师的水平,那么配合本书的内容,可以达到高级分析师的水平;
- 如果读者是初级分析师的水平,那么在理解本书内容的基础上,可以到达中级分析师的水平。
3. 书里面有没有类似 R 语言中 auto.arima 的实现逻辑?(自动寻找最优 P、D、Q 的方法)
回答:
在本书的“4.6.4 代码实操:Python 时间序列分析”一节中的实现方式,就是类似于 R 的 auto.arima 的实现方法。里面使用的是 BIC 最小的原则得到的最优 P 和 Q,而 D 是在做差分时候已经确定的。
二、环境配置与依赖库问题
4. 为什么没有使用 from PIL import Image,而是直接使用的 import Image?
问题描述:
在 P66 的 PIL 章节中,普通的用法里,我们在安装一个库之后,如果要使用库中的某个类,必须要使用 from 库 import 类 的写法(例如 from os import path)。但是在 P66 中使用 PIL 中的 Image 类时却没有这样做?
回答:
在一般情况下,要引用某个库下面的类,都需要使用 from * import * 的写法。但是 PIL 的原作者 Fredrik Lundh(以及其他贡献者)并没有具体解释为什么要支持这种用法。该库的最新版是 2009 年更新的且之后一直没有更新;但基于 PIL 的衍生分支 Pillow 的帮助文档中,从侧面说明了这种用法之前确实是可接受的,原文是:
Pillow >= 1.0 no longer supports “import Image”. Please use “from PIL import Image” instead.
由于 PIL 已经停止更新,如果大家想继续使用的话可以用 Pillow。Pillow 目前支持 Python 2 和 Python 3 且功能还在不断更新,具体请查阅 Pillow 官方文档。
5. 我已经安装了 Image 库,为什么直接 import Image 却无法导入?
问题描述:
在本书的 2.3.3 中“1. 使用 PIL 读取图像”的代码部分,第一段代码是直接导入 Image(import Image),我电脑上已经装了 Image,但是却提示错误。

回答:
该部分中 import Image 导入的并不是单独的 Image 库,而是 PIL 中的 Image 库,该方式规范的用法应该是 from PIL import Image。因此单独安装的 Image 库并不是 import 的那个 Image 库(虽然二者名字一样)。
首先要安装 PIL。关于 PIL 的安装方法,可以直接去官网下载代码源文件使用 setup 安装或下载 Window 的 exe 安装包:http://www.pythonware.com/products/pil/
另外一个不用直接安装 PIL 的方法是安装 Pillow(这是 fork PIL 的一个分支),使用 pip 方法即可。安装好 Pillow 之后,直接使用 from PIL import Image 也是支持的(注意:不是 from pillow import Image,且在 Pillow 1.0 版本之后也不能直接用 import Image)。
6. 为什么我的电脑上无法通过 pip 命令安装 PIL?
问题描述:
本书的 P19 提到了 PIL 的安装方式是使用 pip install PIL 安装,但我的电脑却无法安装,提示报错。

回答: 使用 pip 的安装方式下会从 pypi 中寻找适合当前系统环境的安装包,但 PIL 在 Pypi 的安装包只有 32 位的,因此如果读者的电脑是 64 位系统,那么将无法找到适合的版本。
解决方式:
- 直接去官网下载代码源文件使用 setup 安装或下载 Window 的 exe 安装包。
- 推荐方案:安装 Pillow,使用 pip 方法即可。安装好 Pillow 之后,直接使用
from PIL import Image即可。
7. 为什么我在对 Pandas 数据框使用 sort 方法排序时,会出现错误?
问题描述:
在对数据框排序中,本书中用到了 sort 方法,在“4.4.6 代码实操:Python 关联分析”的“# 关联结果报表评估”模块中有一段:
python
有些读者可能会出现报错,提示数据框没有 sort 方法,这是为什么?

回答:
在 Pandas 后期的版本中,逐渐开始丢弃这个函数,即使在原来支持的情况下,也会出现 warning。查看 Pandas 的官方说明,官方也不建议再使用 sort 方法了,建议使用的是 sort_values 方法。

经验提示:在主流的 Python 库的应用过程中,不要忽视任何一个警告(Warning)。虽然警告不会引发错误,但在未来的版本或应用中可能会导致问题,因此需要根据 warning 的提示做代码更改。
8. 为什么我使用 Matplotlib 无法展示图形,但将其保存到本地却可以看到?
问题描述:
当我运行 Python 程序时,发现 Matplotlib 无法展示图形(图形区域为空白)。但是,当我使用图像中的保存功能,将图片保存到本地却可以看到图形。



回答: Matplotlib 没有正确显示图形,同时在交互窗口有如下类似的错误信息(截取部分):
code
经过排除发现,该 Matplotlib 的版本为 2.2.0rc1,为非稳定版本,而官方网站提供的最新稳定版本为 2.1.2。因此将该版本的 Matplotlib 卸载,然后重新使用 pip 命令安装即可(默认安装稳定版本)。
提示:所有的程序和版本并不是越新越好,这里面涉及到不同程序和库之间的兼容等问题。建议直接使用 pip 命令在线安装,程序会自动匹配最佳版本的包来下载安装。
三、代码实操与报错排查
9. 为什么从 MySQL 读取 Excel 数据时只有 357 条记录?
问题描述:
在“2.2.3 从关系型数据库 MySQL 读取运营数据”章节中,有朋友反馈,在本地电脑上将 Excel 中的数据导入 MySQL 中时,发现导入的数据不全,只有 357 条,更重要的是没有任何报错信息。

回答: 本书中的 Excel 版本是 2013 版,经测试在装有 Office 2013 版本的电脑上可以完整导入,而 Office 2016 版本导入则不完整。
10. Matplotlib 中线条样式的两个点虚线有什么区别?
问题描述:
在 P170 页有一段如下的文字:“在 plot 方法的 marker 值中,还可设定为线条的样式 '-' 为实线、'--' 为虚线、'-.' 为点虚线、':' 为点虚线。”其中这两个点虚线的样式有什么区别?
回答:
'-.' 的样式和 ':' 的样式分别如下图所示:

11. 书中 for i in xrange(4) 是否应该改成 for i in range(4)?
问题描述:
在 P149 中,书的最下边 for i in xrange(4) 是否应该改成 for i in range(4)?
回答:
对于书中提到的 xrange(4) 应该改为 range(4) 的问题,在书中版本上(Python 2),在功能和实现结果上,二者是无差异的,因此替换不是必须的。
- 在 Python 2 中:
xrange()函数用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器。 - 在 Python 3 中:去除了
xrange()的命名,取而代之的是在功能上使用range来实现类似xrange的方法(实际上去除的是原 Python 2 中range的功能)。
对于这个改变,可以分别在 Python 2 和 Python 3 里面使用 type() 测试下:
Python 2 里面:
python
Python 3 里面:
python
12. 在预测应用时提示报错 "Expected 2D array",如何解决?
问题描述: 如果读者用的是 Python 3 或者 Python 2 较近的版本,在执行预测时:
python
会提示报错,报错信息是:
code
回答:
此时,只需将 new_x 转换为 numpy 数组并做 reshape,或者变为嵌套列表处理即可。
方法一(使用 reshape):
python
方法二(使用嵌套列表):
python
四、随书资源与印刷问题
13. 纸质书是黑白印刷,部分图表看不清楚怎么办?
回答: 的确,受限于成本原因,出版社在对每本书做定位的时候都会有一个相对合理的成本标准,本书也不例外。我查看了下本书的图像,把其中可能涉及到的会混淆原图意义的彩色原图放在这里,供读者参考。
- P126 图 3-4:其中第二排,第一个图由于是黄色,纸质书上看不清楚。

- P162 图 4-2

- P170 图 4-3

- P180 图 4-4:书中黑白色的印刷,难以区分不同模型的线条,如下是原图。

- P194 图 4-8:决策树规则输出树形图中由于没有颜色,很难区分不同的分裂项的属性,如下是原图。

- P239 图 4-16:用户点击热力图,黑白色是无法展示热力图的效果的。

- P249 图 4-18:输出的字符云,不同区域的颜色是跟原始图像对应的。

- P339 图 6-2:书中对于不同月份的颜色无法区分,原图如下。

- P350 图 6-6:书中预测数据和实际数据的线条无法区分,原图如下。

- P415 图 7-17:书中对于左右两侧的分裂颜色区分不明显,原图如下。

- P446 图 7-22:书中 4 个类别的线条颜色无法区分,原图如下。

- P449 图 7-23:书中对于不同类别的区分也不明显,原图如下。

14. 为什么我下载的附件压缩包不可用或提示错误?
回答:
本书的源代码文件以及数据,由于本书第一版基于 Python 2 实现,笔者同时提供了 Python 2 版本的原书代码以及对应的 Python 3 代码(注意 PILLOW 和 PYMYSQL 库在 Python 2 和 Python 3 有差异),可通过如下方式下载:
- Python 2 版本的原书代码: 《Python 数据分析与数据化运营》附件-Python 2 版本
- Python 3 版本的代码: 《Python 数据分析与数据化运营》附件-Python 3 版本
附件的两份压缩包我已经在 Windows 电脑上测试过是可以用的。但由于某些未知的原因,可能导致读者下载后不可用(例如网络问题、压缩包本身的问题、系统兼容等)。
一般情况下,读者尝试上面的两种方式是可以下载到能用的压缩包的。如果确实还是不可用,可直接扫描加我微信,我通过微信直接将压缩包发过去。

注意:由于 Python 2 和 Python 3 的库无法完全通用,因此部分 Python 3 中没有的库将被代替。