Python数据分析与数据化运营

《Python数据分析与数据化运营》第二版 勘误

Author
宋天龙
发布于 2022-01-26
12304 次阅读
0 次赞
0 次分享
《Python数据分析与数据化运营》第二版 勘误
AI 智能核心导读

本文为《Python 数据分析与数据化运营》第二版的官方勘误表,汇总了书中23处细节错误及修正方案。内容涵盖文字拼写、代码逻辑、参数设置、库版本更新及数据展示等问题的详细说明与正确代码示例,并提供了最新版本代码的同步更新链接,旨在帮助读者准确理解并实践书中的数据分析与运营模型。

《Python 数据分析与数据化运营》第二版勘误表

本书默认已经修正了第一版遇到的所有问题,因此以下勘误仅限于第二版。有关第一版的勘误,请见 《Python 数据分析与数据化运营》第一版勘误

版本与代码更新说明

由于第二版的出版时间为 2019 年,我已经将最新版本的代码更新到博客中,地址为:《Python 数据分析与数据化运营》第二版新老版本代码对比。安装和使用最新版本的读者可参照该链接的代码。

最近更新时间:2021-10-14

最近一次新书重印更新为 2020-11(第 2 版第 4 次)重印,读者可查看“前言”的前 1 页找到相关信息,如下:


详细勘误列表

1. 第 108 页:文字拼写错误

第二段文字中,“英语、数据、语文成绩……”中的“数据”应更正为“数学”。

解释:如图圆圈处文字

2. 第 149 页:聚类离散化数值修正

最下面的 amount2 的值应该是 4 个,对应的数据也应该是 4 个值。使用聚类法实现离散化,k=4,那么应该代表 4 类数据,对应的唯一值应该是 0, 1, 2, 3

3. 第 93 页:缺失值处理方法名修正

在描述缺失值的方法中,页面顶部描述文字中,“通过 df.null 方法找到所有数据……”中的 df.null 应该更正为 df.isnull()

4. 第 396 页:交叉验证代码变量名修正

在“模型训练-交叉验证”章节的代码中,这是对集成模型的交叉检验测试,而非单个模型。

  • 原代码
python
1cv_score = cross_val_score(model_gdbc, x_smote_resampled, y_smote_resampled, cv=cv)
  • 应改为
python
1cv_score = cross_val_score(model_vot, x_smote_resampled, y_smote_resampled, cv=cv)

5. 第 179 页:库名称拼写遗漏

最底部最后一行的文字表述中,“不能直接 fit 到 klearn 的 K-Means 模”中的 klearn 缺少一个字符 s,应更正为 sklearn

6. 第 198 页:错别字修正

左侧靠中间位置的文本描述中,(1)部分,“此时的回归模型及其不稳定且方差较大”中的“及其”应更正为“极其”。

7. 第 347 页:Pipeline 代码段遗漏补充

在“步骤 5 模型训练 - 建立 pipeline 中用到的模型对象”模块中,原文只有已经构建好的每个 model,而遗漏了 pipelines 的构建代码。

正确的完整代码应为:

python
1model_etc = ExtraTreesClassifier() # ExtraTree,用于EFE的模型对象 2model_rfe = RFE(model_etc) # 使用RFE方法提取重要特征 3model_lda = LinearDiscriminantAnalysis() # LDA模型对象 4model_rf = RandomForestClassifier() # 分类对象 5 6# ============== 这里开始增加 ============== 7# 构建带有嵌套的pipeline 8pipelines = Pipeline([ 9 ('feature_union', FeatureUnion( # 组合特征pipeline 10 transformer_list=[ 11 ('model_rfe', model_rfe), # 通过RFE中提取特征 12 ('model_lda', model_lda), # 通过LDA提取特征 13 ], 14 transformer_weights={ # 建立不同特征模型的权重 15 'model_rfe': 1, # RFE模型权重 16 'model_lda': 0.8, # LDA模型权重 17 }, 18 )), 19 ('model_rf', model_rf), # rf模型对象 20]) 21# ============== 到这里增加结束 ==============

8. 第 102-104 页:原始数据维度与输出描述修正

在第 102 页“第 2 部分生成原始数据”中,中间部分 print(df) 之后的文字描述有误。

  • 原描述:“数据为 3 行 3 列的数据框,分别包含 id、sex 和 level 列,其中的 id 为模拟的用户 ID,sex 为用户性别(英文),level 为用户等级(分别用 high、middle 和 low 代表三个等级)”
  • 应改为:“数据为 3 行 4 列的数据框,分别包含 id、sex、level 和 score 列,其中的 id 为模拟的用户 ID,sex 为用户性别(英文),level 为用户等级(分别用 high、middle 和 low 代表三个等级),score 列为用户得分等级(其中 1/2/3 分别是等级字符串,而非数字)

补充说明:由于新增了一列,第 102-103 页对应的结果中应该包括 score 列特征。在 print(raw_convert_data) 后,会输出 score 信息。同理,在第 104 页中间部分的输出,也会包含 score_1, score_2, score_3 的信息,请读者知悉。

9. 第 180 页:重复导入库代码

“第 1 部分导入库”中 import matplotlib.pyplot as plt 被重复导入。代码可直接忽略重复部分,或删除其中任意一条。

10. 第 187 页:df.head() 输出记录条数说明

在本书第二版的撰写中,由于新增了很多内容,正常情况下 print(df.head()) 应该输出 5 条记录。但书中的示例中只有 3 条,原因是笔者手动删除了 2 条以减少页面代码量。在代码正式执行下不会出现该问题,请读者知悉。

11. 第 103 页:编码对象描述修正

中部文字描述有误。

  • 原文:“在该过程中,先建立一个 LabelEncoder 对象 model_LabelEncoder,然后使用 model_LabelENcoder 做 fit_transform 转换,转换后的值直接替换上一步创建的副本 transform_data_copy,然后使用 toarray 方法输出为矩阵”。
  • 应改为:“在该过程中,先建立一个 OneHotEncoder 对象 model_enc,然后使用 model_encfit_transform 转换,然后使用 toarray 方法输出为矩阵”。

12. 第 126 页:代码排版样式错误

上部分 from sklearn.svm import SVC # SVM中的分类算法SVC 这段代码本身属于代码格式,脱离了代码段,应与正文区分开并与上面的代码样式合并。

13. 第 63 页:SQL 正则表达式概念严谨性修正

在 SQL 相关功能中提到的正则表达式部分,LIKE 不属于通用意义上的正则表达式,只是在 MySQL 中用于实现类似正则表达式功能的关键字。

14. 第 77 页:参数拼写错误

subplot 段落中的 nrws 应更正为 nrows

15. 第 78 页:OpenCV 大小写规范

2.3.4 内容中,“Python 读取视频最简单的库也是 Opencv”中的 Opencv 应注意大小写,更正为 OpenCV

16. 第 126-127 页:数据读取分隔符与展示结果修正

3.4.6 内容中 data2.txt 的数据读取方式错误。在“第 2 部分 导入数据文件”中,pd.read_tablesep 参数值应该是 \t

正确代码:

python
1df = pd.read_table('data2.txt', sep='\t', names=['col1', 'col2', 'col3', 'col4', 'col5', 'label']) # 读取数据文件

同时,读取之后数据的展示中,label 为 0 和 1 的数据结果应该如下:

code
1 col1 col2 col3 col4 col5 2label 30 475 475 475 475 475 41 525 525 525 525 525

受源数据影响,第 127 页的数据处理后结果展示也相应变化:

第 127 页顶部的数据展示:

code
1 col1 col2 col3 col4 col5 2label 30 475 475 475 475 475 41 475 475 475 475 475

第 127 页中部的数据展示:

code
1 col1 col2 col3 col4 col5 2label 30 525 525 525 525 525 41 525 525 525 525 525

17. 第 235 页:R 语言数据读取参数补充

在目前的 R 版本中,读取数据时需要在 read.transactions 中增加 header=TRUE 设置才能正确读取。完整的 Python 内嵌 R 脚本代码应为:

python
1r_script = ''' 2 library(arules) 3 data <- read.transactions("order_table.csv", format="single", header=TRUE, cols=c("order_id", "product_name"), sep=",") 4 init_rules <- apriori(data, parameter = list(support = 0.01, confidence = 0.05, minlen = 2)) 5 sort_rules <- sort(init_rules, by="lift") 6 rules_pd <- as(sort_rules, "data.frame") 7'''

18. 第 92-94 页:Imputer 缺失值函数弃用与更新

在以前的版本中,Imputersklearn.preprocessing 的一部分,可以直接导入。在最新版本中,Imputer 方法已被弃用并拆分为多个细分方法,集成在 sklearn.impute 中。

目前包含以下 4 个细分方法:

  • impute.SimpleImputer
  • impute.IterativeImputer
  • impute.MissingIndicator
  • impute.KNNImputer

最新版本的使用规则示例:

python
1from sklearn import impute # 导入impute库或者里面的子库 2imp_mean = impute.SimpleImputer(missing_values=np.nan, strategy='mean') # 使用其中的 SimpleImputer 方法 3imp_mean.fit_transform([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]]) # 预处理

19. 第 137 页:岭回归 alpha 参数说明修正

岭回归的文字说明中,如果图中划线和画圈的两部分跟代码注释中的内容相同,alpha 的值应为 1.0

20. 第 212 页:缺失值统计代码与打印结果修正

在“第 3 部分数据基本审查”中,原始 print 语法中的统计逻辑有误。

  • 原代码:
python
1n_samples, n_features = X.shape # 总样本量,总特征数 2print('samples: {0}| features: {1} | na count: {2}'.format(n_samples, n_features, raw_data.isnull().any().count()))

其中的 raw_data.isnull().any().count() 应该改为 raw_data.isnull().any().sum()。原因是 count 得到的是总列数,而在 raw_data.isnull().any() 返回 TrueFalse 后,必须通过 sum 才能得到真正为 NA 值(True)的数量。

  • 正确的打印结果应为:
code
1samples: 1000| features: 41 | na count: 4

21. 第 103 页:数据打印结果列遗漏

在第 102 页中,通过 raw_convert_data = df.iloc[:, 1:] 设置了变量。第 103 页顶部的打印结果错误,应该包含 sexlevelscore 三列。

当前版本的错误之处:

正确的打印结果(红框内):

22. 第 374 页:U 检验与 Z 检验概念合并

在关于 U 检验和 Z 检验的描述中,本书将其拆分为两类。但在国内普遍将 U 检验与 Z 检验视为相同概念。因此,相关描述应合并为:

**U 检验(也称 Z 检验)**是在大样本(n>30)的情况下,检验随机变量的数学期望是否等于某一已知值的一种假设检验方法。U 检验适用于样本量 n 较大且符合正态分布的情况,也适用于比较两个平均数的差异是否显著的场景。

23. 第 470 页:聚类特征数值型索引修正

在获取数值型特征时,代码中的索引提取有误,导致获取到的是标准差数据而非均值。

  • 原代码片段:
python
1merge_data1 = part1_desc.iloc[2, :] # 得到数值型特征的均值
  • 应改为:
python
1merge_data1 = part1_desc.iloc[1, :] # 得到数值型特征的均值

完整的修正后代码:

python
1# part3 计算各个聚类类别内部最显著特征值 2cluster_features = [] # 空列表,用于存储最终合并后的所有特征信息 3for line in range(best_k): # 读取每个类索引 4 label_data = merge_data[merge_data['clusters'] == line] # 获得特定类的数据 5 6 part1_data = label_data.iloc[:, 1:7] # 获得数值型数据特征 7 part1_desc = part1_data.describe().round(3) # 得到数值型特征的描述性统计信息 8 merge_data1 = part1_desc.iloc[1, :] # 得到数值型特征的均值 (此处索引由 2 改为 1) 9 10 part2_data = label_data.iloc[:, 7:-1] # 获得字符串型数据特征 11 part2_desc = part2_data.describe(include='all') # 获得字符串型数据特征的描述性统计信息 12 merge_data2 = part2_desc.iloc[2, :] # 获得字符串型数据特征的最频繁值 13 14 merge_line = pd.concat((merge_data1, merge_data2), axis=0) # 将数值型和字符串型典型特征沿行合并 15 cluster_features.append(merge_line) # 将每个类别下的数据特征追加到列表

补充说明:由于此处索引的修正,对应后面的图形也会产生差异,请读者知悉。

分享
最后修订: 2022-01-26