Python数据分析与数据化运营

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

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

本文汇总《Python 数据分析与数据化运营》第二版常见问题及解决方案。内容涵盖第二版核心内容升级说明、Python及pyecharts等第三方库的版本兼容与环境配置指南、数据分析核心概念解析,以及具体代码报错的修复方法,为读者提供完整的学习与实践避坑指南。

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

说明:本文仅总结第二版相关的问题。有关第一版的问题,请前往“《Python 数据分析与数据化运营》第一版常见问题”查看。

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

最近更新时间:2021-06-15


一、 资源获取与版本更新

1. 第二版配套源代码下载地址

代码下载《Python 数据分析与数据化运营》第二版 附件

2. 第二版与第一版相比有哪些变化?

本书在第一版上市后,得到了来自各行各业众多好友和读者的支持与反馈,在此致以诚挚的感谢!第二版在第一版的基础上做了大量优化甚至重写,同时新增了许多内容。

优化与重写的内容

  • Python 3 全面升级:全部代码基于 Python 3 做优化或重写,书中的 Python 版本为 3.7。
  • 引入 Jupyter:基于 Jupyter 做调试、分析和应用,更适合数据分析师的应用场景(包括探索性分析、数据预处理、结果可视化展示、交互式演示等)。
  • 网页解析重构:网页数据解析中基于 Class 做功能封装和处理,更方便以网页对象为主体的数据工作。
  • 图像处理更新:介绍了 PIL/Pillow 的替换和方法应用,应用于图像处理工作。
  • 数据挖掘案例重写:第四章数据挖掘的案例部分,每一部分的案例都经过重写并增加了许多知识点,以实际案例为需求,应用数据挖掘算法做建模和分析。
  • 3D 可视化:Matplotlib 调用 3D 图形展示多个维度的信息,并可通过拖拽展示不同角度下数据的分布情况。
  • RFM 代码重构:第五章第一个案例 RFM 代码的重构,以及针对不同分组的精细化运营策略的制定。
  • 复合数据工作流:第五章第二个案例,基于嵌套 Pipeline 和 FeatureUnion 复合数据工作流的营销响应预测,基于两层管道的 Pipeline 做数据工作流管理。
  • 集成算法应用:第六章第二个案例,基于集成算法 GBDT 和 RandomForest 的投票组合模型进行异常检测。将基础算法改为 GBDT 和 RF,这两个算法分别代表模型的**“准确度”“稳定度”**,这种兼顾“准”和“稳”的模型搭配更符合实际需求。
  • 树形图可视化优化:第七章基于自动节点树的数据异常原因下探分析,优化了代码和样式,可视化效果更好并能获得更多信息(包括维度分解过程、主因子、其他因子和潜在因子等)。

新增的内容

  • 环境搭建:基于 Anaconda 的 Python 环境安装和配置,更方便初学者快速搭建应用环境。
  • Jupyter 进阶:Jupyter 基础工具的用法,包括安装、启动、基础操作、魔术命令、新内核安装和使用、执行 Shell 命令、扩展和插件使用、系统基础配置等。
  • 特征工程扩展
    • 基于 Pandas 的 get_dummies 做标志转换(即 OneHotEncode 转换)。
    • 特征选择降维中,新增 feature_selection 配合 SelectPercentileVarianceThresholdRFESelectFromModel 做特征选择。
    • 特征转换降维中,新增 PCA、LDA、FA、ICA 数据转换和降维的具体方法。
    • 特征组合降维中,新增基于 GBDT、PolynomialFeaturesgplearn 的 genetic 方法做组合特征。
  • 算法与可视化扩展
    • 第四章分类算法中,新增使用 XGBoost 做分类应用,以及配合 Graphviz 输出矢量图形。
    • pyecharts 数据可视化的应用和操作,尤其是关联关系图的应用。
  • 跨语言与自动化
    • Python 通过 rpy2 调用 R 程序实现关联算法的挖掘(包括直接执行程序文件、代码段、变量使用等)。
    • Python 通过 rpy2 调用 auto.arima 实现自动 ARIMA 的应用,降低时间序列算法的应用门槛。
    • 自动化学习:增加了对于自动化数据挖掘与机器学习的理论、流程、知识和应用库介绍,并基于 TPOT 做自动化回归和分类学习案例演示。

二、 环境配置与依赖问题

3. 为什么完全按照书上敲代码会报错?

“代码在其他人的电脑上能正常运行,而在你的电脑上不行”,这种情况极大概率是版本不一致导致的。

本书的 Python 默认版本是 3.7,采用 Anaconda 安装。如果读者是自行安装的 Python,或者使用 Anaconda 安装的是 3.6 版本,就很容易出现兼容性报错。

案例说明: 有读者自行下载了 Anaconda 3.6 版本,在执行第四章程序时报错。经排查发现,该读者环境下的 Pandas 版本是 0.20.*,而笔者书中的环境是 Python 3.7 配合 Pandas 0.25.*。 虽然同一个库的不同版本功能大致相同,但细节差异致命:例如在 Pandas 0.20.* 中,默认不支持将字符串 "null" 识别为缺失值;而在 0.25.* 中却可以。这导致如果数据中出现 "null" 字符串,旧版本会将其视为普通文本,而新版本会正确解析为空值(NULL)。

4. 第五章:导入 pyecharts 报错

pyecharts 库中,分为 v0.5.Xv1.* 两个大版本,这两个版本之间互不兼容v1 是一个全新的版本,对应的语法也发生了较大的改变。

如果读者的环境是最新版(v1 及之后),按照书中的 from pyecharts import Bar3D 就会报错无法导入。在 v1 版本之后,需要使用以下方法导入:

python
1from pyecharts.charts import Bar3D

因此,读者需要留意自己的 pyecharts 版本,并选择对应的语法。

5. 第四章:导入 pyecharts 报错

本书第二版的 pyecharts 仍然是基于 v0.5 版本实现的,而目前最新的版本已经升级到 v1.*。由于 v1.*v0.5 版本不兼容,如果读者电脑上安装的是 v1.* 版本,执行图形展示代码时就会报错。

在 P238 创建关系图中,v1.* 版本的正确代码如下:

python
1# 先导入配置方法库 2from pyecharts import options as opts 3 4graph = Graph(init_opts=opts.InitOpts(width="800px", height="800px")) 5graph.add("", nodes, edges, repulsion=8000, layout='circular', is_rotate_label=True) 6graph.set_global_opts(title_opts=opts.TitleOpts(title="商品关联结果图"))

请读者注意区分版本使用。有关完整的数据展示代码,也可参照下文的第 6 个问题

6. 第四章:pyecharts 无报错但无图形展示

在第二版第四章的关联分析环节,调用 pyecharts 展示关联结果时如果无法加载图形,通常是因为使用了 v1.* 版本的库。请替换为如下适配 v1.* 版本的代码:

python
1# 导入库 2from pyecharts.charts import Graph 3from pyecharts import options as opts # 先导入配置方法库 4 5# 1.X版本 创建关系图 6graph = Graph(init_opts=opts.InitOpts(width="800px", height="800px")) 7graph.add("", nodes, edges, repulsion=8000, layout="circular", is_rotate_label=True) 8graph.set_global_opts(title_opts=opts.TitleOpts(title="商品关联结果图")) 9graph.render_notebook()

7. 导入 apriori 时提示找不到库

在该章 P229 中,导入库的代码如下:

python
1import pandas as pd 2import apriori

这里的 apriori 模块,并不是一个需要通过 pip 安装的第三方库,而是存放在当前“第四章附件目录”下的一个名为 apriori.py 的本地源码文件。

因此,在执行导入时,Python 默认导入的是这个本地文件的功能。这要求当前的工作目录下,必须存在该文件(在官方下载的附件压缩包里默认包含此文件)。如果提示找不到模块,读者只需通过 cd 命令将终端路径切换到该文件所在的目录(第四章目录)下即可。

8. Jupyter 插件显示为灰色、无法勾选

按照书上的方式操作后,如果发现 Jupyter 的插件都处于灰色不可选状态,解决方法非常简单:

直接取消勾选页面标题下方“disable configuration for ...”这段文字前面的复选框即可。

9. 百度地图 API 调用无效

笔者的百度 API 注册较早,目前的百度地图 API 已经升级了 URL 地址格式。

目前最新的 API 地址格式为

code
1http://api.map.baidu.com/geocoder?address=地址&output=输出格式类型&key=用户密钥&city=城市名

而笔者书中使用的旧版 API 地址为

code
1http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=%s

因此,后期新注册的读者,请务必使用百度最新的 API 格式;之前已经注册过旧版 API 的读者,可继续沿用笔者书中的格式。

补充说明:API 调用无效的另一个常见原因是,部分读者没有自己注册账户,而是直接使用了笔者源代码中的权限信息。目前笔者的 API 调用资源已经接近限制峰值,会导致直接使用原代码无法正常返回信息。请务必自行注册并替换密钥


三、 核心概念与理论解析

10. 纯文本读取的 3 种方法指的是什么?

在第 2 章 P55 中提到:“对于纯文本……Python 默认的 3 种方法更为合适”。

这里指的是使用 open 方法获得读取对象后,调用 readreadlinereadlines 读取的方法。

11. “中位数做兜底策略”是什么技术?

在 P96 中提到的**“兜底策略”**,指的是在任意情况下都能保障数据有效性的一种处理方式,它不是一种具体的技术

如书中所讲,如果使用均值填充,当数据中存在 inf(无穷大)时,是无法计算均值的;而中位数则不受极端值影响,依然可以计算。这样可以保证填充数值的有效性。例如:

12. 变化维度表中的“维度行”是什么意思?

在第三章 P91 介绍变化维度表(Slowly Changing Dimensions)时提到了“维度行”。

它的意思是:将每个发生变化的维度都记录下来,并形成一条新的记录。这样每次在匹配数据时,只需要匹配当时历史状态下使用的维度即可。例如:

上面的表是一个变化维度表,里面的 KEY 是关联产品信息的键值,用来标记产品 ID。在这个表中,基于 ID 可以匹配出产品类别。在不同时期,该 ID 所属的一级分类(CATE1)发生了变化(例如 2019 年 7 月 1 日的值和 2019 年 8 月 8 日的属性值不同),这时可同时记录两个属性信息。后续就可以基于修改日期来判断,在不同周期下应该匹配哪个分类模式。

13. get_dummies 和 OneHotEncoder 的使用场景与区别

Pandas 的 get_dummies 和 Scikit-Learn 中的 OneHotEncoder 都能实现哑变量编码转换(书中称为标志转换),二者的核心区别在于:

  • Pandas 的 get_dummies 是“一次性”的:适用于单次的数据分析或探索性场景。
  • Scikit-Learn 的 OneHotEncoder 是“可复用”的:在每次 fit 之后,处理规则会被持久化保存。在预测性应用(如分类或回归)中,当新数据到来时,需要保证预测数据的转换规则与训练时完全一致,因此必须使用持久化的处理对象。这个原理跟模型训练和预测是相同的。

14. 关联规则输出结果中,item1/item2 及符号的含义

在教材 P231 中,通过 Python 计算关联规则会得到结果表格。其中:

  • item1 表示后项(Consequent,即结果)。
  • item2 表示前项(Antecedent,即条件)。

符号含义:

  • ,(逗号):表示前项或后项集合中包含的多个不同项目。例如 pip fruit, other vegetables 表示该项目集中包含了 2 个项目。
  • /(斜杠):仅仅是项目名称字符串本身自带的字符,没有特殊含义。例如 whipped/sour cream 整体代表一个单一项目。

读者可参考 P340 通过 R 语言得到的关联规则,会更容易理解前项和后项的逻辑:前项是规则的前提条件,后项是规则推导出的结果。前项和后项都可以包含多个项目,从而组成项目集。


四、 代码细节与报错修复

15. 能否使用 SQL Server 代替书中的 MySQL?

可以的。Python 几乎支持所有主流数据库。

如果使用 SQL Server,可以安装并使用第三方库 pymssql,其用法几乎与 pymysql 相同;也可以使用 pyodbc,通过 ODBC 的方式连接 SQL Server。尤其是在面对海量数据(百万到千万级)写入时,设置 fast_executemany = True 可以极大提升写入速度。

16. 第七章:聚类雷达图输出 ValueError 报错

在新版本的 Matplotlib 中,输出雷达图时如果完全按照原书代码执行,会提示如下错误:

code
1ValueError: The number of FixedLocator locations (7), usually from a call to set_ticks, does not match the number of ticklabels (6).

这是因为新版 Matplotlib 要求雷达图的标签数组必须首尾闭合。此时,只需要在 labels 数组中额外增加对初始值的闭合拼接即可。修正后的完整代码如下

python
1# part1 各类别数据预处理 2num_sets = cluster_pd.iloc[:6, :].T.astype(np.float64) # 获取要展示的数据 3num_sets_max_min = model_scaler.fit_transform(num_sets) # 获得标准化后的数据 4 5# part2 画布基本设置 6fig = plt.figure(figsize=(6,6)) # 建立画布 7ax = fig.add_subplot(111, polar=True) # 增加子网格,注意polar参数 8labels = np.array(merge_data1.index) # 设置要展示的数据标签 9cor_list = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'] # 定义不同类别的颜色 10angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False) # 计算各个区间的角度 11angles = np.concatenate((angles, [angles[0]])) # 建立相同首尾字段以便于闭合 12 13# 【核心修复点】新版本增加,对labels进行封闭 14labels = np.concatenate((labels, [labels[0]])) 15 16# part3 画雷达图 17for i in range(len(num_sets)): # 循环每个类别 18 data_tmp = num_sets_max_min[i, :] # 获得对应类数据 19 data = np.concatenate((data_tmp, [data_tmp[0]])) # 建立相同首尾字段以便于闭合 20 ax.plot(angles, data, 'o-', c=cor_list[i], label=i) # 画线 21 22# part4 设置图像显示格式 23ax.set_thetagrids(angles * 180 / np.pi, labels, fontproperties="SimHei") # 设置极坐标轴 24ax.set_title("各聚类类别显著特征对比", fontproperties="SimHei") # 设置标题放置 25ax.set_rlim(-0.2, 1.2) # 设置坐标轴尺度范围 26plt.legend(loc=0) # 设置图例位置

17. 运行 3.10.1 代码时出现 max() arg is an empty sequence

这是由于之前的博客模板存在问题导致的。后续笔者已经修改并恢复了模板。目前(2020-10-12 之后)该代码已经能正常运行并返回正确数据。

18. P201 设置的 n_folds=5 没有被使用?

是的,在 P201 页代码中定义的 n_folds=5 在后续逻辑中没有被使用,可以直接删除

19. P93-P94 的库导入顺序是否可以调整?

可以调整。书中的导入顺序(Pandas, sklearn, pandas)是笔者在写作时未注意到的冗余问题,读者可自行精简和规范导入顺序。

20. P95 打印的各个 df 对象分别是什么?

在 P95-P96 的各个打印对象中,从上到下依次对应的是: nan_result_pd1nan_result_pd2nan_result_pd3nan_result_pd4nan_result_pd5nan_result_pd6。请读者在阅读时注意区分。

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