边看边勘误(pdf版)
原书提供勘误表看着很不方便,而且这几年由于python版本更新有些代码中的参数已经改变,我边看pdf边记录一些我能看出来或实践发现的错误,和网页版进行对比确认,形成一份个人版勘误表,
原书提供的勘误网址:http://bit.ly/python-data-sci-handbook
可以打开的含勘误的网址:http://shop.oreilly.com/product/0636920034919.do
网络版网址:https://jakevdp.github.io/PythonDataScienceHandbook/index.html
说明:p.N(No.M)表示页码为N,也是文档中的第M页
1.p.65(No.83) Figure 2-4
红圈处应改为:np.arange(3).reshape((3,1))或:np.arange(3)[:,np.newaxis]:
网页中的代码已经更正(本节链接):
另外,个人觉得二维表格用立方体表示容易让人误以为这是三维ndarray,相比较而言Python for Data Analysis附录A中的表示(用平面二维表)要好一些。
2.p.75(No.93) 第二段
A AND B和NOT(A OR B)逻辑上并不等价,红圈内应该改为NOT((NOT A) OR (NOT B)):
网页版已更改,未加括号,原因是NOT运算的优先级高于OR运算,加与不加括号等价(本节链接):
3.p.75(No.93) 代码In[25]
红圈处对应关系有误,绿色圈内两个数字应当相同:
网页中已经将两者都改为0.2(链接同2):
4.p.143(No.161) 代码In[8]
这个不是错误,是pandas包的版本差异导致的运行失败,网页版与书相同。在pandas1.0.2版中,红圈处的参数已经失效,新的参数应写成‘columns’,而数字0、1依然有效。
以下是‘pd.concat’帮助内容的截图:
5.p.203(No.221)输出结果Out[35]
我从网上下载的数据和书中示例数据的East和West恰好相反,而且由于时间间隔不同,后续描述性统计结果无法验证,但总体呈现出与Out[37]相同的West多于East的情况,疑似此处显示错误,In[36]赋值语句右侧也应当与此处的顺序对应:
经查,网页版与pdf版内容一致,与csv数据有出入。
由于新的csv数据已经有了总和,因此书中代码In[36]应当改为:
data.columns = ['Total','East','West'] #按照csv文件的顺序
6.p.205(No.233)代码In[40]
正文中描述是取平均数,但代码是求和(但是画出来的图趋势是一样的,但纵坐标不同):
经查,网页版与pdf版内容一致,也是用sum()方法而非mean()方法。
7.p.208(No.226)代码In[46]
这个不是错误,是pandas包的版本差异导致的运行失败。在pandas1.0.2中运行这段代码显示DataFrame对象没有ix参数,查了一下,从pandas0.20.0开始,ix索引就被取消了:
书中的pandas版本是0.18.1,因此还可以使用ix索引。
本例中将ix索引改为loc索引即可正常使用:
8.p.209(No.227)代码In[1]
此处代码红框处参数“1E6”是float,这一位置参数表示生成随机数组的shape,应当是一个整数或者整数元组,在Jupyter Notebook中运行会显示TypeError,改为1000000后即可正常运行:
Jupyter Notebook运行情况:
网页中的代码已经改为了“1000000”:
9.p351(No.369)代码In[15]
这个不是错误,是sklearn包的版本差异导致的运行失败,网页版与书相同。在scikit-learn 0.18 以上的版本中,红圈处的名称已经失效,新的名称应写成‘model_selection’。
即“from sklearn.model_selection import train_test_split”,代码第二行不变。
p357(No.375)代码In[28]中使用了train_test_split函数,导入时也要注意模块的变化。
10.p353(No.371)代码In[20]
这个不是错误,是sklearn包的版本差异导致的运行失败,网页版与书相同。在scikit-learn 0.23 中,红圈处的参数已经失效,新的参数应写成“GaussianMixture”。
即代码前两行改为“from sklearn.mixture import GaussianMixture”和“model = GaussianMixture(n_components=3,covariance_type='full')”,或将代码第一行改为“from sklearn.mixture import GaussianMixture as GMM”,其余内容不变。
11.p356(No.374)代码In[27]
这个不是错误,是matplotlib包的版本差异导致的运行失败,网页版与书相同。在matplotlib3.2.2版中,红圈处的参数已经失效。
错误提醒:
新的版本中'Spectral'参数可用,但根据'spectral'参数的含义和生成的图像推测,作者此处是希望相邻图例之间颜色差异较大(不容易混),因此渐变风格比较不符合要求。
经查阅相关资料,此处使用'tab10'效果更佳,即:
与此对应,原书图5-19下方文字中括号内的颜色也应根据新的图例灵活理解:
12.p362(No.380)代码In[7]和In[8]
这个不是错误,是sklearn包的版本差异导致的运行失败,网页版与书相同。在scikit-learn 0.18 以上的版本中,红圈处的名称已经失效,新的名称应写成‘model_selection’。
此外,LeaveOneOut函数在新版本中无参数,在Jupyter Notebook中上述代码运行如下图:
使用新版本时,'cross_validation'模块的表述均应更新(如p363代码In[9]下方文字)。
13.p368(No.386)代码In[13]
这个不是错误,是sklearn包的版本差异导致的运行失败,网页版与书相同。在scikit-learn 0.18 以上的版本中,红圈处的名称已经失效,新的名称应写成‘model_selection’。
改为“model_selection”后在Jupyter Notebook中运行的截图:
14.p368(No.386)代码In[13]
绿框处代码运行正常,但报警告,警告内容是在0.25版sklearn包后,红框内处的参数不能以位置参数的形式传入,必须以关键词参数的形式传入:
在Jupyter Notebook中运行的警告内容:
最好是把In[13]的第三行代码改为下图所示,实测运行不报警告:
p370(No.388)的代码In[16]也是同理。
15.p372(No.390)代码In[17]
这个不是错误,是sklearn包的版本差异导致的运行失败,网页版与书相同。在scikit-learn 0.18 以上的版本中,红圈处的名称已经失效,新的名称应写成‘model_selection’。
改为“model_selection”后在Jupyter Notebook中运行的截图:
除模块名称,函数的用法并没有发生变化。
16.p374(No.392)代码In[18]
这个不是错误,是sklearn包的版本差异导致的运行失败,网页版与书相同。在scikit-learn 0.18 以上的版本中,红圈处的名称已经失效,新的名称应写成‘model_selection’。
改为“model_selection”后在Jupyter Notebook中运行的截图:
机器学习各具体模型部分跳过,本勘误至此【完结】