《Python数据分析与数据化运营》第一版 常见问题


目录:

在这边文章中,我会把读者反馈给我的常见问题总结出来,供更多读者参考。里面会涉及到各种疑问或混淆知识点,希望能给大家解惑。如果大家有什么疑问,可以直接在这里留言,我会将一些跟本书相关的知识性问题总结出来并在此回答。

最近更新时间:2021-07-05


1.问题:对于一维数据而言,reshape之后仍然是一维,为什么还要做reshape操作?

在第一章的代码示例中,有一段如下代码:

x=numpy.array(x).reshape([100,1])

为什么需要对x对reshape?即使是reshape,x仍然是1维数据啊(只有一列)?

回答:对于sklearn中的fit方法而言,对输入的x的要求一般都是一个二维空间矩阵,即shape是一个m×n的矩阵。对于案例中的x而言,在使用numpy.array(x)方法后,其shape是[100,],这是一个一维空间数据

x = numpy.array(x)# 这是一个一维空间数据
print(x.shape) #查看shape
print(x[:5]) # 查看前5条数据

上述代码输出如下:

(100L,)
[ 28192.  39275.  34512.  24430.  23811.]

而reshape之后的shape是[100,1],这是一个二维空间下的矩阵。

x = x.reshape((100,1)) #这是一个二维空间数据
print(x.shape) #查看shape
print(x[:5]) # 查看前5条数据

上述代码返回如下:

(100L, 1L)
[[ 28192.]
 [ 39275.]
 [ 34512.]
 [ 24430.]
 [ 23811.]]

注意:x的前5条数据跟上面的不同,因此里面多了一个维度。

再推广下,如果shape后是[100,1,1],那么这是1个三维空间矩阵。

x = x.reshape((100,1,1)) # 这是一个三维空间数据
print(x.shape) #查看shape
print(x[:5]) # 查看前5条数据

上述代码返回结果如下:

(100L, 1L, 1L)
[[[ 28192.]]
 [[ 39275.]]
 [[ 34512.]]
 [[ 24430.]]
 [[ 23811.]]]

这里面其实有一个关于维度的概念容易混淆。在sklearn中的维度指的是维度空间,而不是列。为了更好的区分这两个概念,前者通常称为dimension,后者称为feature,这样就容易区分了。对于二维(dimension)空间下的数据而言,无论有多少个feature,都是一个二维空间数据。例如[3,4],[100,10000],这些都是二维空间下的矩阵,只是feature的数量不同而已。

日常情况下,由于大家会将feature理解为dimension,所以会产生混淆。


2.问题:我看书里面好像很多图的原图应该是彩色的,但是印刷确实黑白的,有些图看不清楚啊

回答:的确,受限于成本原因,出版社在对每本书做定位的时候都会有一个相对合理的成本标准。本书也不例外。我查看了下本书的图像,把其中可能涉及到的会混淆原图意义的图放在这里,供读者参考。

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

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


3.问题:这本书基本都能会的话,在数据分析中属于什么段位水准呢?

回答:对分析师而言,这个角色的要求一般包括数据类技能和业务类技能两方面。本书中尽量将我过往的经历总结出来,希望能给读者参考。

就这两方面的技能而言,数据类技能上,由于里面考虑到兼顾更多读者的现有知识水平和状态,因此涉及到了多种“参差不齐”的知识点和技能点,但读者会发现,越往后的综合数据技能应用的难度越高。整体上,如果都能掌握的话,数据类技能属于高级分析师的水平。

但就业务类技能而言,这种经验的培养其实很难在一朝一夕内掌握的,更不是在看了一本书之后就能完全体会的。这类业务技能决定了在面对一个命题(例如数据分析、专项分析甚至报表数据)时的思维状态、发散点和思维方式,这些都需要时间来沉淀。本书总结的这些,需要读者跟实际运营业务相结合去体会才能有真正的感觉,否则里面的经验点很难体现出价值。因此,整体上,如果读者已经是一个中级分析师的水平,那么配合本书的内容,达到高级分析师的水平;如果读者是初级分析师的水平,那么在理解本书内容的基础上,可以到达中级分析师的水平。


4.问题:为什么我下载的附件压缩包不可用或提示错误?

回答:本书的源代码文件以及数据,由于本书第一版基于Python2实现的,笔者提供Python2版本的原书代码以及对应的Python3代码(注意PILLOW和PYMYSQL库在python2和python3有差异),可通过如方式下载:

Python2版本的原书代码:

链接: 《Python数据分析与数据化运营》附件-Python2版本

Python3版本的代码:

链接: 《Python数据分析与数据化运营》附件-Python3版本

附件的两份压缩包我已经在windows电脑上测试过是可以用的,但由于某些未知的原因,可能导致读者下载后不可用,例如网络问题、压缩包本身的问题、系统兼容等。

一般情况下,读者尝试上面的两种方式是可以下载到能用的压缩包的。如果确实还是不可用的,可直接扫描加我微信,我微信直接压缩包发过去。

由于python2和python3的库,无法完全通用,因此,部分python3中没有的库,将被代替。


5.问题:书里面有没有类似R里面的auto.arima的实现逻辑?自动寻找最优的P、D、Q的方法?

回答:在本书的“4.6.4 代码实操:Python时间序列分析”一节中的实现方式,就是类似于R的auto.arima的实现方法。里面使用的是BIC最小的原则得到的最优P和Q,而D是在做差分时候已经确定的。


6.问题:问题:在P66的PIL章节中,为什么没有使用from PIL import Image,而是直接使用的import Image?

在普通的用法里,我们在安装一个库之后,都如果要使用库中的某个类,必须要使用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目前应支持py2和py3且功能还在不断更新,具体请查阅https://pillow.readthedocs.io/en/lawww/index.html


7.问题:为什么“2.2.3 从关系型数据库MySQL读取运营数据”章节中使用MySQL导入Excel数据只有357条记录

有朋友反馈,在本地电脑上将Excel中的数据导入mysql中时,发现导入的数据不全,只有357条,更重要的是没有任何报错信息。

回答:本书中的Excel版本是2013版,经测试在装有office2013版本的电脑上可以导入,而office2016版本导入则不完整。


8.问题:在P170“相关知识点:scatter和plot方法”中关于线条样式的有2个点虚线,二者有什么区别?

在P170页有一段如下的文字“在plot方法的marker值中,还可设定为线条的样式'-'为实线、'--'为虚线、'-.'为点虚线、':'为点虚线。”其中这两个点虚线的样式有什么区别?

回答:'-.'的样式和':'的样式分别如下图:


9.问题:我已经安装了Image库,为什么我在电脑上直接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)

10.问题:为什么我的电脑上无法通过pip命令安装PIL?

本书的P19提到了PIL的安装方式是使用pip install PIL安装,但我的电脑却无法安装,提示:

回答:使用pip的安装方式下会从pypi中寻找适合当前系统环境的安装包,但PIL在Pypi的安装包只有32位的,因此如果读者的点是64系统,那么将无法找到适合的版本。解决方式:

可以直接去官网下载代码源文件使用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)

11.问题:为什么我在对数据框使用sort方法排序时,会出现错误?

在对数据框排序中,本书中用到了sort方法,在“4.4.6 代码实操:Python关联分析”的“# 关联结果报表评估”模块中有一段:

print (df_lift.sort('instance', ascending=False))  # 打印排序后的数据框

其中就用到了sort方法。有些读者可能会出现报错,如下:

提示数据框没有sort方法,这是为什么?

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

通过这个问题可以反馈说,在主流的Python库的应用过程中,不要忽视任何一个警告,虽然警告不会引发错误,但在未来的版本或应用中可能会导致问题,因此需要根据warning的提示做代码更改。

12.问题:为什么我使用Matplotlib无法展示图形,但将其保存到本地却可以看到图形?

当我运行Python程序时,发现Matplotlib无法展示图形(图形区域为空白)。但是,当我使用图像中的保存功能,将图片保存到本地却可以看到图形。

第一个图是运行python程序,图形区域无显示。

第二个图是将其保存到本地后,可以看到图像。

回答:Matplotlib没有正确显示图形,同时在交互窗口有如下类似的错误信息:

Exception in Tkinter callback
Traceback (most recent call last):
File "F:\python\lib\lib-tk\Tkinter.py", line 1541, in __call__
return self.func(*args)
File "F:\python\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 228, in resize
self.draw()
File "F:\python\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 300, in draw
tkagg.blit(self._tkphoto, self.renderer._renderer, colormode=2)
File "F:\python\lib\site-packages\matplotlib\backends\tkagg.py", line 34, in blit
dataptr, colormode, bboxptr)
TclError: error reading data, expected ptr height width
Exception in Tkinter callback
Traceback (most recent call last):
File "F:\python\lib\lib-tk\Tkinter.py", line 1541, in __call__
return self.func(*args)
File "F:\python\lib\lib-tk\Tkinter.py", line 592, in callit
func(*args)
File "F:\python\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 320, in idle_draw
self.draw()
File "F:\python\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 300, in draw
tkagg.blit(self._tkphoto, self.renderer._renderer, colormode=2)
File "F:\python\lib\site-packages\matplotlib\backends\tkagg.py", line 34, in blit
dataptr, colormode, bboxptr)
TclError: error reading data, expected ptr height width

经过排除发现,该Matplotlib的版本为2.2.0rc1为非稳定版本,而官方网站(https://matplotlib.org/) 提供的最新(2018-03-01)稳定版本为2.1.2。因此将该版本的Matplotlib卸载,然后重新使用pip命令安装即可(默认安装稳定版本)。

提示 所有的程序和版本并不是越新越好,这里面涉及到不同程序和库之间的兼容等问题。建议直接使用pip命令在线安装,程序会自动匹配最佳版本的包来下载安装。

13.问题:在P149 中,书的最下边‘for i in xrange(4)’应该改成‘for in in range(4)’?

问题:在P149 中,书的最下边for i in xrange(4)是否应该改成for in in range(4)

回答:对于书中提到的xrange(4)应该改为range(4)的问题,在书中版本上(py2),在功能和实现结果上,二者是无差异的,因此替换不是必须的。

  • 在py2里面,xrange() 函数用法与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器。

  • 在py3里面,去除了xrange()的命名,取而代之的是在功能上使用range来实现类似xrange的方法,实际上去除的是原py2中的range的功能。对于这个改变,可以分别在py2和py3里面使用type()测试下,会得到如下结果:

py2里面:

type(range(4)) → list
type(xrange(4)) → xrange

py3里面:

没有type(xrange(4))

type(range(4)) → range

14.问题:在第一章的代码中,在预测应用时,提示报错,需要使用reshape方法转换形状?

如果读者用的是python3或者python2较近的版本,在执行预测时,即:

pre_y = model.predict(new_x)

会提示报错,报错信息是“ValueError: Expected 2D array, got scalar array instead:

array=84610.
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

此时,只需将new_x转换为numpy数组并做reshape或者变为嵌套列表处理即可。例如:

new_x = 84610
pre_y = model.predict(numpy.array(new_x).reshape(-1,1))
print (pre_y)

new_x = 84610
pre_y = model.predict([[new_x]])
print (pre_y)