Python数据分析与数据化运营(第2版)
上QQ阅读APP看书,第一时间看更新

1.2 数据化运营所需的Python相关工具和组件

本书将以Python为主要数据工作工具,重点介绍Python相关工具,包括Python程序、IDE、Python第三方库、数据库和客户端、SSH远程客户端、OCR工具和机器学习框架等。

1.2.1 Python程序

1. Python 2还是Python 3

目前,Python仍然是两个系列的版本并存,一个是Python 2,另一个是Python 3。这两个版本的语法不完全兼容,因此两个版本的程序调用对方的执行脚本将很可能报错。

如果没有特殊需求,大多数场景下选择Python 3都是一个正确的选择。但结合特定场景,笔者还是给出以下具体建议:

❑ 如果想要成熟、可靠且稳定的程序,选择Python 2和Python 3都可以。

❑ 如果只是学习或了解一下Python,优选Python 3。

❑ 如果是企业内部应用,有历史程序需要执行和开发,具体看企业用的是哪个版本。

❑ 如果你的工作中需要大量的第三方库,而且是比较早期的库,那么使用Python 2。但更多情况下,即使那些只支持Python 2的库不再更新了,也有很多替代库可以实现,因此如果不是必须使用Python 2,还是建议使用Python 3。

❑ 如果你的程序需要在Linux服务器上运行且使用其原生程序,那么去看看你的Linux服务器自带的Python版本(通常Linux服务器上自带Python 2的居多)。同样的,即使Linux原生带的程序版本低,仍然可以安装并使用Python 3。

❑ 如果上述没有任何一个场景满足你的需求,那么就从Python 3开始吧。

2. 32位还是64位

大多数情况下,如果没有特殊需求,尽量选择64位版本。

本书的案例是基于64位Python实现的,版本是Python 3.7。选择64位的原因是它能应对更大容量的数据应用,用Python 3除了因为这是趋势外,还有一个重要原因是Numpy已经宣布从2019年1月1日起新功能将只支持Python 3,相信很多系统和工具也开始慢慢放弃对Python 2的支持了。

3. Python环境的搭建

一般情况下,我们可以直接到Python官网https://www.python.org下载需要的版本,然后在安装好Python程序后根据需要自定义安装其他相关库和包。但对大多数初次接触Python的读者来讲,如果能有“一键安装”就更好了。在此,我们介绍Anaconda。

Anaconda是一个Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,它是科学计算领域非常流行的Python包以及集成环境管理的应用。它的优势主要表现在以下几个方面:

❑ 默认可以帮你安装好Python主程序,而不用单独下载安装。

❑ 常用的数据工作包,包含数据导入、清洗、处理、计算、展示等各个环节的主要包都已经安装好,如Pandas、Numpy、Scipy、Statsmodels、Scikit-Learn(sklearn)、NetworkX、Matplotlib等。常用的非结构化数据处理工具也一应俱全,如beautifulsoup4、lxml、NLTK、pillow、scikit-image等。

❑ 很多包的安装有依赖,这点在Linux系统上非常常见,而Anaconda已经将这些依赖的问题统统解决。尤其在离线环境下做Python和大量库的安装部署工作时,Anaconda大大降低了实施难度,是项目开发过程中必不可少的有效工具。

❑ 提供了类似于pip的包管理功能的命令conda,可以对包进行展示、更新、安装、卸载等常用操作。当然,如果你更喜欢pip,仍然可以继续使用该命令,因为Anaconda默认也安装了该命令。

❑ 多平台、多版本的通用性,而且紧跟Python主程序更新的步伐。Anaconda支持Windows、Mac OS和Linux系统,且同时包含32位和64位的Python版本(Python 2和Python 3全都支持)。

❑ 提供了IPyton、Jupyter、Spyder交互环境,可以直接通过界面化的方式引导用户操作,易用程度非常高,甚至连具体细分的学习资源都准备好了。

要安装Anaconda环境,只需要登录https://www.anaconda.com/download下载对应版本的安装包即可,如图1-2所示。目前Anaconda发行的最新Python版本包括32位和64位的Python 2.7和Python 3.7。本书选择的是左侧画框的Anaconda3-5.3.1-Windows-x86_64,读者也可直接从https://repo.anaconda.com/archive/Anaconda3-5.3.1-Windows-x86_64.exe下载。

图1-2 Anaconda下载页面

下载完成后,会在本地计算机中存在一个名为“Anaconda3-5.3.1-Windows-x86_64.exe”的安装包,安装过程只需使用默认配置即可。

1.2.2 Python交互环境Jupyter

通过Anaconda安装的环境,默认会带有IPython和Jupyter;如果使用Python原生环境安装(通过Python官网下载的安装包安装),也会有默认的交互环境。在数据分析领域,笔者推荐使用Jupyter,原因是数据分析师在做数据工作时,不仅需要做数据交互性分析、建模,还需要做数据结果展示和交互介绍等,这些最好在一体化环境中完成,而不需要多种工具配合完成,这也正是Jupyter的优势。

1. IPython和Jupyter的关系

IPython是一个基于Python的交互式shell,比默认的Python shell好用得多,它支持变量自动补全、自动缩进、交互式帮助、魔法命令、系统命令等,内置了许多很有用的功能和函数。

从IPython 4.0开始,IPython衍生出了IPython和Jupyter两个分支。在该分支正式出现之前,IPython其实已经拥有了ipython notebook功能,因此,Jupyter更像一个ipython notebook的升级版。IPython和Jupyter都是非常好的、用于Python学习和应用的交互式工具。在做数据工作时二者的主要差异如下:

1)IPython仍然是一个基于命令行窗口的命令行工具,基本上所有的功能都需要使用命令实现。而Jupyter则是一个基于Web的交互环境(没错,它的运行需要一个浏览器),除了命令行以外还有交互功能可供使用,例如运行、暂停、重启等。在IPython中,这些都是需要操作者通过命令的方式操作,而在这里则可以像使用Office一样做基本管理。

2)IPython是基于Python的交互开发工具,功能纯粹且相对单一。而Jupyter除了代码工作外,还可以整合网页、图片等,它与Matplotlib结合在可视化方面应用比较多,甚至连CODE及输出的结果都可以保存为扩展名为ipynb的文件,方便大家分享和交流。另外它还包含了多组程序的执行、支持markdown做注释、文件操作和管理功能等。

3)IPython应用的语言主要是围绕Python的,包括语言开发、设计、调试等;而Jupyter除了Python交互工作外,还可以用于C、C++、C#、Fortan、Java、R、Haskell等几十种语言,未来应该还会支持更多的语言及相关工作功能。

因此,综合二者的应用差异性,IPython是一个开发类工具,Jupyter则更像一个学习、演示和交互的开放式工具。在我们实际工作中,如果是开发方向的,更侧重于选择IPython;而以数据分析为目的的,选择Jupyter则更合适。本书之后的章节中,将使用Jupyter来做所有功能和代码的介绍和演示。

那么IPython和Jupyter到底是什么关系?直观上看,Jupyter是一个Web服务,它本身不能执行任何程序,若执行程序则需要依赖于其“内核”(有关内核的部分,会在下面介绍到)。默认情况下,当在Jupyter中发起程序执行请求后,Jupyter会将请求转发给对应的内核执行,默认的Jupyter的Python是调用IPython,所以Jupyter天然就继承了IPython的功能和特性,包括各种魔术函数等。由于Jupyter和其内核是功能拆分的,因此Jupyter也可以执行其他内核,例如R等。

2. Jupyter的安装和启动

(1)安装Jupyter

如果使用Anaconda安装Python环境,则默认已经安装了Jupyter。如果读者自定义安装,则可以通过命令pip install jupyter安装。

(2)启动Jupyter

在命令行窗口中输入jupyter-notebook或jupyter notebook然后回车(或直接从Windows开始菜单中的Anaconda 3(64-bit)目录下也能找到该入口,如图1-3所示),默认浏览器会打开命令行窗口以及新的TAB,并进入Jupyter在线页面窗口,如图1-4所示。

图1-3 Windows开始菜单中的入口

图1-4 Jupyter命令窗口启动信息和Web页面

提示

笔者通过Anaconda安装的Jupyter,在命令行输入命令时无法正常启动,如图1-5所示。经过测试,只需要将以下3个路径粘贴到系统环境变量的PATH中即可:C:\Anaconda3\Library\mingw-w64\bin; C:\Anaconda3\usr\bin; C:\Anaconda3\Library\bin。需要注意的是,该路径的Anaconda3需要改为读者实际安装的路径。

图1-5 命令行启动Jupyter时报错

3. Jupyter的基本操作

在图1-6中,可以看到共分为3个功能区:图中①是主功能区,②是文件和目录功能区,③是文件和目录列表。

图1-6 Jupyter功能区

❑ 主功能区:Files(默认视图)展示了所有该空间下文件和目录的详细信息,可在该区域对文件和目录做管理;Running区展示了当前正在运行的Jupyter程序,可在该功能区关闭特定程序;Clusters展示了由IPython提供的并行功能项信息。

❑ 文件和目录功能区:对文件和目录做新增、删除、移动、上传等操作。

❑ 文件和目录列表:查看特定目录和文件,直接单击可查看文件详情。

这里我们简单介绍Jupyter的使用方法和常用操作。

(1)新建Python文件

单击右上角New按钮,选择当前Python版本对应的文件Python 3,进入文件编辑窗口,如图1-7所示。这里也可以创建其他文件,单击Text File即可。如果当前Jupyter还安装了其他内核,则也可以建立其他内核文件,例如R。

图1-7 新建Python 3文件

(2)编辑Python文件

在文件编辑窗口中,功能区包括3个部分,如图1-8所示。

图1-8 新交互窗口功能区

❑ 图中①区域为菜单功能区,包括文件、编辑、视图、元件、内核、小部件以及帮助菜单。由于里面的功能菜单,读者一看便知道是什么意思。后面主要介绍编辑中的常用操作。

❑ 图中②区域为代码相关操作,包括保存、新增、运行、停止等功能,是与代码本身相关的常用操作。

❑ 图中③区域为代码区,在该区域内输入代码并使用②区域中的功能之后,可直接显示代码运行结果。

(3)保存与恢复

保存直接使用Ctrl+S快捷键即可,此时将生成一个检查点版本。与保存不同的是,恢复有不同的场景应用。

❑ 撤销或回退。如果文件中进行了多次修改,但是想返回之前的操作,可直接使用Ctrl+Z快捷键,该操作与是否保存无关。

❑ 恢复到上个检查版本。在很多场景下,第1个版本已经完成,第2个版本修改了很多功能,可能无法确认第2个版本具体修改了哪些地方。此时可以用Jupyter中的“Revert to Checkpoint”来恢复上一个检查点的版本,如图1-9所示。

图1-9 恢复检查点功能

注意

目前的恢复检查点功能,只支持一个检查点的恢复。例如,当读者在10点10分、15分、20分三个时间点分别使用Ctrl+S快捷键保存检查点后,在10点20分之后使用Revert to Checkpoint只能恢复到最近的10点20分的版本。

(4)导出文件

在Jupyter中编辑完成后,可以导出为多种文件,例如常用的Python文件、Jupyter专用文件、PDF文件等,如图1-10所示。如果后期可能二次修改或使用,那么存为Jupyter或Python文件;如果要想将结果分享出去,可保存为Jupyter、PDF或HTML文件;如果希望分享出去的结果不被他人编辑,那么选择PDF或HTML文件。

图1-10 导出文件格式

(5)单元格输入和输出

单元格(Cell)类似于Excel中的单元格,用来输入和输出内容。单元格的输入格式包括4类,如图1-11所示。

图1-11 输入语言类型

❑ Code:当前文件内核的代码,本书为Python代码。

❑ Markdown:一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。

❑ Raw NBConvert:类似于纯文本的格式,输入内容即输出内容,因此是“原样输出”的格式。

❑ Heading:标题格式,类似于Word中的标题一、标题二等,不过Jupyter已经不建议在这里设置了,而是使用Markdown语言中的#来设置标题。

在输入格式上,写代码时选择Code,而做单独模块的注释时使用Markdown。单元格的内容输出具体取决于Code内容。

(6)单元格常用编辑功能

单元格的常用编辑功能非常简单,图标如图1-12所示。

图1-12 常用单元格编辑功能

❑ ①保存和检查点,快捷键Ctrl+S

❑ ②在当前单元格下新建单元格

❑ ③剪切当前单元格

❑ ④粘贴所选择的单元格

❑ ⑤在当前单元格下粘贴单元格

❑ ⑥和⑦将当前单元格上移或下移

提示

在Jupyter中编辑代码时,按Tab键可以自动补足。

(7)执行Python程序

执行Python文件是以单元格为单位的,操作命令如下:

❑ 执行当前单元格代码,单击该单元格前的或按快捷键Ctrl + Enter。

❑ 执行当前单元格代码并且移动到下一个单元格,单击菜单功能栏中的或使用快捷键Shift + Enter。

❑ 执行当前单元格代码,新建并移动到下一个单元格,使用快捷键Alt + Enter。

❑ 重启内核并重新执行所有单元格程序,单击

提示

默认情况下,单元格中的对象初始时是基于位置顺序执行,基于位置产生的单元格序号也是顺序的,因此程序会按照单元格的序号继承对象,此时如果单纯改变单元格的位置顺序,则可能无法获得预期结果。如图1-13所示,第1个单元格和第3个单元格分别为a赋值1和2,虽然单元格2的位置在单元格1之后,在单元格3之前,但由于序号在单元格3之后,因此其执行的输出结果仍然是其“序号”的结果,而非基于位置的结果。此时,如果重启内核并重新执行单元格内容,会产生如图1-14所示的结果,单元格2执行的是单元格1的结果。因此,读者如果更改了代码位置,一般需要重新执行程序。

图1-13 单元格序号对结果的影响

图1-14 重启内核并重新执行

以上执行命令操作仅仅是利用Jupyter提供的功能执行单元格的程序,但很多情况下,我们可能需要执行外部文件或程序,例如执行test.py文件。此时,我们可以在单元格中输入以下任一命令实现程序执行。

❑ %run test.py:调用IPython的魔术命令执行该文件。

❑! Python 3 test.py:调用系统的Python命令执行该文件。

提示

需要注意的是,文件路径要与当前执行环境一致,否则要写完整的绝对路径或相对路径。

(8)将外部程序加载到单元格

Jupyter允许直接将外部程序加载到单元格,例如已经写好的类或方法,使用%load file_name.py即可实现。整个过程如图1-15中的①②③④所示。

图1-15 加载外部程序代码到单元格

❑ test.py的文件中有两行代码,如图中的①。

❑ 在Jupyter的单元格中输入%load test.py,如图中的②。

❑ 执行该单元格,单元格会默认将%load test.py注释掉(即加#注释),然后加载test.py中的内容到单元格,如图中的③。

❑ 再次执行该单元格,Jupyter会执行单元格中的代码,即从test.py加载的代码,如图中的④。

提示

%load不仅支持本地文件,还支持远程服务器上的文件,例如使用%load http://www.dataivy.cn/book/test.py同样可以工作。

4. Jupyter的魔术命令

Jupyter支持IPython中的魔术命令。所谓魔术命令指的是IPython提供的特殊命令,它将常用的操作以%开头的命令封装起来,使用时非常方便。以下是笔者常用的魔术命令。

❑ %matplotlib inline:一般情况下,Python的可视化都会用到Matplotlib库。要在Jupyter中使用该库并把结果集成到Jupyter中,需要使用%matplotlib inline命令,如图1-16所示。

图1-16 Matplotlib集成到Jupyter

扩展知识点:%matplotlib inline到底激活了什么模式?

在上面的示例中,我们通过%matplotlib inline来将Matplotlib的结果嵌入Jupyter,但实际上不需要这段代码Matplotlib也能正常工作。

我们知道,Matplotlib展示的图形允许用户有交互动作,例如缩放、平移、保存等,此时我们需要调用plt.show()来将程序挂起,直到手动将图像窗口关闭,否则程序不会向下执行。

但将Matplotlib嵌入Jupyter之后,这种Matplotlib生成的图像就处于一种非交互的模式,而%matplotlib inline命令就是激活Matplotlib,为IPython和Jupyter提供“内联后端”支持,也就是作为一个静态图像嵌入Jupyter中,因此Matplotlib就不需要使用plt.show()来主动调用图像展示窗口。这种后端服务的模式,Jupyter(IPython)提供了魔术命令%config来做适当调整,例如使用%config InlineBackend.figure_format='retina’来解决在Retina显示屏上的模糊问题。

❑ %ls:查看当前目录下的文件或文件夹详细列表信息。

❑ %cd:切换工作路径。

❑ %run:执行特定Python文件。要中断程序,按Ctrl+C快捷键。

❑ %paste和%cpaste:粘贴在剪切板中的内容。前者实现粘贴代码后立即执行,无须确认,更适合一小段功能确认的代码,直接执行;后者实现粘贴代码后,需要用户输入“—”或按Ctrl+D快捷键确认,适合大量的代码,尤其是不同的代码可能来自不同的片段的情况,需要粘贴到一起做二次编辑或确认。

❑ %pwd:查看当前Python工作路径和目录。

❑ %time、%timeit、%%time和%%timeit:这3个命令都是用来做代码执行时间测试的,%time用来测试单个单元格或单行命令一次的执行时间;%timeit与%time类似,但可以基于次数做测试并返回平均时间,例如测试10次或100次,若不指定,默认为测试1000次;如果要测试的代码不只有一行,这时就需要%%time和%%timeit了,它们与前两个的区别主要在于支持多行程序测试。

❑ %hist:显示命令的输入(可选输出)历史,在查找历史命令操作时非常有用。

❑ %quickref:显示IPython的快速参考。

❑ %magic:显示所有魔术命令的详细文档。

另外,还有一些是数据分析师不常用,但数据开发工程师会经常用到的命令。

❑ %debug:从最新的异常跟踪的底部进入交互式调试器,在debug时常用。

❑ %pdb:在异常发生后自动进入调试器。

❑ %prun statement:通过cProfile执行statement,并打印分析器的输出结果。

❑ %bookmark:将特定路径保存为书签,以后使用时可直接使用cd命令定位到书签名而无须完整路径。

❑ %alias:为特定命令定义别名,尤其当命令中包含众多参数时很有用。

❑ %xdel和%reset:二者都是删除变量或名称,前者删除单个对象,后者删除当前交互空间全部变量或名称。

提示

%符号不是必需的,这意味着即使不输入%也可以使用,例如pwd=%pwd,但前提是当前环境空间中没有与魔术命令相同的名称,这叫作automagic。

如果要执行Jupyter中其他语言的单元格程序,只需在特定单元格的开头使用相关的魔术命令来声明。

❑ %%bash:执行UNIX和Linux的shell命令。

❑ %%HTML:执行HTML程序。

❑ %%Python 2:执行Python 2程序。

❑ %%Python 3:执行Python 3程序。

❑ %%ruby:执行Ruby程序。

❑ %%perl:执行Perl程序。

当然,要执行这些程序的前提是已经安装了对应的内核。具体过程会在下节中介绍。

5. Jupyter新内核安装和使用

(1)查看可用内核

在系统终端命令行中输入jupyter kernelspec list来查看当前Jupyter可用内核,例如笔者环境的内核只有Python 3,如图1-17所示。

图1-17 Jupyter可用内核

(2)安装新内核

使用Anaconda安装新内核将非常简单,例如:安装R内核使用conda install -c r r-essentials命令即可。整个过程的耗时较长,用户需耐心等待。安装完成后会有如图1-18所示的命令行的提示信息。

图1-18 R内核安装成功和提示

此时,重新启动Jupyter,在新建(New)时,出现新的可选内核R。另外,再次通过jupyter kernelspec list也能看到当前可用内核列表发生变化,如图1-19所示。

图1-19 Jupyter可用内核列表

6. Jupyter执行Shell命令及安装第三方库

Jupyter调用终端命令行命令只需要在单元格中的命令前面加!即可。

❑! ping www.baidu.com:测试ping服务。

❑! ipconfig:查看Windows的网络配置信息。

同样,我们也可以直接调用终端的命令安装第三方包。

(1)检查pip命令是否可用

安装Python第三方库,可通过pip、easy_install(目前已经不推荐使用)、conda(Anaconda安装方式提供)以及默认的setup方法安装。笔者更倾向于使用pip命令安装,其次使用setup命令安装。

原生的Python程序(Python 2 ≥2.7.9或者Python 3 ≥3.4)或通过Anaconda安装的环境,自带pip命令,一般情况下可从Windows终端命令行直接使用。如果无法使用pip命令,可通过以下两个步骤确认:

1)确认pip命令已经安装。直接在Python安装目录下查看是否有pip文件即可,例如Windows环境下是否有pip.exe。

2)查看pip命令执行路径是否存在于环境变量的Path。以Windows为例,具体方法是:单击“计算机”,鼠标右键在弹出的菜单中单击“属性”,在弹出的窗口中选择“高级系统设置”,在系统变量中找到名为path的变量,单击下方的“编辑”按钮,最后会弹出一个编辑系统变量的窗口,在此编辑变量值栏中的字符串。目的是将需要执行的脚本或程序目录加入系统变量中,这样在命令行窗口输入命令时,系统会自动查找在系统中变量对应的目录或名称。路径的写法参照原有的变量值写法:路径包含完整路径名,以英文分号结束。

例如,下面是笔者将Anaconda3的相关执行命令路径加入Path中的路径:C:\Anacon-da3; C:\Anaconda3\Scripts;整个过程如图1-20所示。

图1-20 Windows系统环境变量配置示意图

提示

默认情况下,pip所在的路径(如笔者的路径为C:\Anaconda3\Scripts)会加入系统变量的路径中,该路径下还有很多其他可执行的命令,同样可直接在命令行使用。

(2)使用pip命令安装

在Jupyter单元格中,直接使用!pip package_name即可实现安装,其中的package_name可以是本地文件,也可以是远程服务器文件。一般情况下,pip包会自动查找最新匹配的版本安装。

例如,以下3种方法可实现相同的安装效果:

❑! pip install scikit-learn

❑! pip install https://files.pythonhosted.org/packages/b2/9d/3e18b1191331d9a467426fb4625c17de1aae29d371696f38a5e05238e99/scikit_learn-0.20.1-cp36-cp36m-win_amd4.whl #基于远程文件

❑! pip install scikit_learn-0.20.1-cp36-cp36m-win_amd4.whl # 基于本地文件

(3)使用setup命令从源码安装

每个第三方库都有一个源码文件压缩包,格式为.tar.gz或.zip,例如pandas-0.19.2.tar.gz、numpy-1.12.1.zip。将压缩包从pypi(或其他官方资源)中下载到要安装的服务器或本机并解压(这些步骤都非常简单),然后在Jupyter单元格的命令行窗口执行如下命令:

        cd [解压后的包含了setup.py的路径]
        !Python 3 setup.py install

上述代码会默认执行完成命令,如果环境配置正确,会有成功安装提示。

注意

离线安装第三方库/包时,不同的库/包可能存在依赖关系,如果在安装之前没有安装和配置好相应的包,那么可能报错。例如,安装statsmodels 0.8时,依赖Python ≥2.6、NumPy ≥1.6、SciPy ≥0.11、Pandas ≥0.12、Patsy ≥0.2.1等。因此,大多数情况下,不建议手动离线安装。

(4)如何批量安装Python第三方库

在某些情况下,例如迁移Python程序或者升级、重装等,往往在现有服务器或主机上已经安装了大量的库,此时如果要在新的环境上安装,则需要重新安装很多第三方库。此时,我们需要一种能够批量安装第三方库的方法。整个实现过程如下:

1)批量导出第三方库列表。

实现批量安装第三方库,首先要有一份安装列表,这份列表可以从原来要迁移的主机或服务器中获取。具体方法为:打开系统终端,然后输入如下命令:

        !pip freeze > requirements.txt

该命令的意思是,将现有第三方库以requirements格式导出至requirements.txt文件中。执行完成后,在执行路径下会产生一个新的文件,名为requirements.txt。打开该文件,会发现里面包括了所有的第三方库,如下是部分库:

        adal==1.0.1
        alabaster==0.7.10
        anaconda-client==1.6.5
        anaconda-navigator==1.6.9
        anaconda-project==0.8.0
        …

2)批量安装第三方库列表到新的环境。

在新的Python环境下,执行如下命令实现安装:

        !pip install -r requirements.txt

该命令的意思是,从requirements.txt中读取要安装的第三方库Python库列表,并按指定的版本安装到现有Python环境中。

注意

执行该命令时,需要在requirements.txt的路径下,即先把该文件复制到新的Python主机或服务器中才能执行。

相关知识:什么是requirements格式文件?

直白点说,requirements格式文件就是pip能看懂的文件格式,用于pip做第三方库或包管理时使用。

在我们导出的requirements.txt的内容中,可以看到每行都是一个包,且每个包都指定了版本,指定的方法是用“==”,这就是pip能看懂的格式。除了这些格式外,还有以下几种常用的格式可以指定批量安装列表,并且这些安装方法可以适用于本节之前提到的场景。不同场景下的requirements.txt内容格式如下:

❑ 直接批量安装第三方库,而不指定具体版本。此时直接写第三方库的名称即可,例如本书中的示例。

        adal
        alabaster
        anaconda-client
        anaconda-navigator
        anaconda-project
        …

在这种场景下,一般都是个人直接指定名称,唯一需要注意的就是手动指定时,安装包的名称要写对。例如skleran在安装时的名称是scikit-learn。

❑ 指定特定的版本范围,而不是某个版本。此时的文件内容为:

        adal==1.0.1                       # 指定版本
        alabaster>=0.7.10                 # 指定最低版本
        anaconda-client! =1.6.5            # 指定不等于的版本
        anaconda-project>0.8.0            # 指定特定版本范围
        …

❑ 指向其他的requirements.txt文件。常用于非常大的项目,安装文件往往比较多,此时会有多个列表文件可供指定。此时的文件内容为:

        -r requirements2.txt
        -r requirements3.txt

❑ 指向特定的安装源文件。之前我们提到过可以直接使用本地或云端源文件安装Python程序的方法,这种方法也可以写到requirements.txt里面。写法如下:

        ./downloads/numpy-1.9.2-cp34-none-win32.whl
        http ://wxpython.org/Phoenix/snapshot-builds/wxPython_Phoenix-3.0.3.dev1820+49a8884-cp34-none-win_amd64.whl

pip本身是一个非常强大的第三方包/库管理工具,包括下载、安装、升级、卸载、搜索、查看过期和版本等功能。有关pip的更多信息,具体查阅https://pip.pypa.io/en/stable/

7. Jupyter的扩展和插件

Jupyter的扩展和插件(Jupyter-contrib extensions)的很多功能会增加数据工作的便利性。要实现扩展,需经过两个步骤(以下步骤建议系统终端进行):

1)安装Python扩展包,使用pip install jupyter_contrib_nbextensions或conda install -c conda-forge jupyter_contrib_nbextensions即可完成,具体提示信息如图1-21所示。

图1-21 Python包安装成功提示

2)安装JavaScript和CSS文件。此步骤将Nbextensions的JavaScript和CSS文件复制到jupyter服务器的搜索目录中,并编辑一些jupyter配置文件。通过命令jupyter contrib nbextension install --user --skip-running-check实现。完成结束后信息如图1-22所示。

图1-22 安装JavaScript和CSS文件结束提示

上述过程结束后,重启Jupyter程序,会发现原有的主导航菜单栏中多了一个“Nbextensions”,如图1-23所示。

图1-23 重启后视图

单击“Nbextensions”切换到扩展和插件视图,要启用对应的功能只需勾选即可,笔者的配置项如图1-24所示。在此介绍几个常用扩展和插件。

图1-24 nbextensions配置项

❑ Collapsible Headings:该扩展在大型Jupyter文件中很有用,可折叠的标题能收起/放开Notebook中的特定内容,使整个页面看起来更整洁。

❑ Codefolding:上面的功能是折叠标题,这里的功能是折叠代码,尤其当代码段比较长且功能较多时常用。

❑ Table of Contents:自动生成目录,该功能类似于Word中的导航视图,都是在左侧提供一个基于标题的目录导航列表,在文件功能较多时,查找和浏览非常方便。

❑ Ruler:用于显示每行代码目标字符数长度,默认每行字符数为78。特定长度的代码更利于阅读,这是编程中的基本原则。

❑ Comment/Uncomment Hotkey:通过Alt+C快捷键对代码进行注释,可以注释一行也可以注释多行,也可以二次键入取消注释。

❑ Autopep8:代码的规则和美化是程序员的必修课,在Jupyter中可以选择自动美化功能,勾选该选项即可根据PEP8规范美化代码,在代码中使用Alt+A快捷键即可。当然,该功能需要同步使用pip install autopep8安装所需包才能实现。

❑ ScrollDown:当系统输出的内容过长时,自动出现滚动条。

提示

单击每个扩展后,页面底部会自动出现该扩展的说明及配置项信息。读者可根据自己偏好做对应配置。

更多关于Jupyter扩展和插件的说明,请见https://jupyter-contrib-nbextensions.readthedocs. io/en/latest/nbextensions.html

8. Jupyter的配置

配置Jupyter不是必需的步骤,但更好的配置能提高使用技能和编程效率。配置之前,需要手动生成一个配置文件,在命令行中输入jupyter notebook --generate-config。完成之后,系统会有如下提示:Writing default config to: C:\Users\Administrator\.jupyter\jupyter_notebook_config.py。

此时,我们根据上述输出信息,进入配置文件的路径:C:\Users\Administrator\.jupyter\,然后使用文本编辑器,例如Notepad,打开jupyter_notebook_config.py。

如果仅仅在当前个人PC上使用,基本不需要做过多设置;但如果需要作为Web服务,提供给其他人使用,那么需要设置IP、密码、授权、端口等很多内容。这里仅介绍个人PC的默认工作目录设置。

笔者的Jupyter默认工作目录是C:\Users\Administrator\,但笔者想要将其设置为本书附件的根目录。方法是:使用搜索功能找到“c.NotebookApp.notebook_dir =”代码行,取消其注释(去掉前面的#),并在后面设置具体目录:D:\[书籍] python数据分析与数据化运营\9_再版\附件。

在实现上述设置后,需要将“开始-所有程序-Anaconda3(64-bit)”中的快捷方式的目标值最后面的%USERPROFILE%删除并保存,如图1-25所示。重启一个新的Jupyter任务即可。

图1-25 修改快捷方式值

Jupyter的应用广泛,限于篇幅无法展开,有关Jupyter的更多使用方法和技巧,请查阅http://jupyter.readthedocs.io/en/latest/。本书的代码部分,将使用Jupyter Notebook完成,读者可在附件中找到。

1.2.3 Python第三方库

Python第三方库包括交互开发库、科学计算库、机器学习库、自然语言库、数据库连接库、图像处理库、网络爬虫库、图像展示库等。本节介绍的第三方库大多是书中用到的主要库,在各章中还会提到一些小众的应用库。

1.科学计算库

(1)Numpy

NumPy(Numeric Python的简称)是Python科学计算的基础工具包,也是Python做数据计算的关键库之一,同时又是很多第三方库的依赖库。默认情况下,Anaconda中已经安装了该包,如果读者系统环境中没有该包,安装会稍微费点功夫。原因是之后我们用到的sklearn的安装,会依赖带有MKL模块的Numpy包,而这个包目前需要自己安装。有需要的读者,可直接从http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy中下载,例如numpy-1.15.2+mkl-cp37- cp37m-win_amd64.whl。

安装成功之后,使用import numpy导入。有关Numpy的安装和更多信息,请查阅http://www.numpy.org/

相关知识点:查看库的版本信息

有两种常用方式查看Numpy(以及其他库)的版本:

一种是在Jupyter中导入库后通过__version__属性查看。

          In [1]: import numpy
          In [2]: print(numpy.__version__)
          1.15.2

一种是在Jupyter命令行窗口输入!pip list,系统会返回所有安装的第三方库以及版本列表信息,从中找到numpy即可。

          Package                             Version
          ---------------------------------- ---------
          alabaster                           0.7.11
          anaconda-client                     1.7.2
          anaconda-navigator                  1.9.2
          anaconda-project                    0.8.2
          appdirs                             1.4.3
          asn1crypto                          0.24.0
          astroid                             2.0.4
          …

(2)Scipy

Scipy(Scientific Computing Tools for Python的简称)是一组专门用于科学和工程计算不同场景的主题工具包,它提供的主要功能侧重于数学、函数等相关方面,例如积分和微分方程求解等。默认情况下,Anaconda中已经安装了该包,如果读者系统环境中没有该包,可在Jupyter中使用!pip install scipy命令安装即可。安装成功之后,使用import scipy导入。有关Scipy的安装和更多信息,请查阅https://www.scipy.org/install.html

(3)Pandas

Pandas(Python Data Analysis Library的简称)是一个用于Python数据分析的库,它的主要作用是进行数据分析。Pandas提供用于进行结构化数据分析的二维的表格型数据结构DataFrame,类似于R中的数据框,能提供类似于数据库中的切片、切块、聚合、选择子集等精细化操作,为数据分析提供了便捷方法。另外,Pandas还提供了时间序列的功能,用于金融行业的数据分析。默认情况下,Anaconda中已经安装了该包,如果读者系统环境中没有该包,可在Jupyter中使用!pip install pandas命令完成安装。安装成功之后,使用import pandas导入。有关Pandas的安装和更多信息,具体查阅http://pandas.pydata.org

(4)Statsmodels

Statsmodels是Python的统计建模和计量经济学工具包,包括一些描述性统计、统计模型估计和统计测试,集成了多种线性回归模型、广义线性回归模型、离散数据分布模型、时间序列分析模型、非参数估计、生存分析、主成分分析、核密度估计,以及广泛的统计测试和绘图等功能。默认情况下,Anaconda中已经安装了该包,如果读者系统环境中没有该包,可在Jupyter中使用!pip install statsmodels命令完成安装。安装成功之后,使用import statsmodels导入。有关Statsmodels的安装和更多信息,具体查阅http://statsmodels.sourceforge. net/index.html

(5)Imblearn

Imblearn是用于样本均衡处理的重要第三方库,它具有多种样本处理的集成模式,包括过抽样、欠抽样等。读者若需要可先在系统终端的命令行使用!pip install imbalanced-learn或!conda install -c glemaitre imbalanced-learn安装;安装成功后,在Jupyter中使用import imblearn(注意导入的库名)检查安装是否正确,具体查阅https://imbalanced-learn.readthedocs.io/en/stable/install.html

(6)gplearn

gplearn扩展了scikit-learn机器学习库,用符号回归执行遗传编程(GP)。遗传编程主要有两个对象经常使用,一个是gplearn.genetic.SymbolicRegressor,另一个是gplearn.genetic. SymbolicTransformer。读者可使用!pip install gplearn安装该库,通过from gplearn. genetic import SymbolicTransformer测试是否正确安装。有关该库更多信息,具体查阅https://gplearn.readthedocs.io/en/stable/intro.html

2.机器学习库

(1)scikit-learn

scikit-learn(有时也称为SKlearn)是一个基于Python的机器学习综合库,内置监督式学习和非监督式学习两类机器学习方法,包括各种回归、K近邻、贝叶斯、决策树、混合高斯模型、聚类、分类、流式学习、人工神经网络、集成方法等主流算法,同时支持预置数据集、数据预处理、模型选择和评估等方法,是一个非常完整的机器学习工具库。scikit-learn是Python数据挖掘和机器学习的主要库之一。默认情况下,Anaconda中已经安装了该包,如果读者系统环境中没有该包,可在Jupyter中使用!pip install sklearn命令完成安装(注意库名称为sklearn)。安装成功之后,使用import sklearn导入。有关scikit-learn的安装和更多信息,具体查阅http://scikit-learn.org/stable/index.html

提示

scikit-learn缺少了某些常用算法,例如关联规则算法、时间序列算法等。不过结合Pandas和Statsmodels可以实现时间序列算法;关联规则相对简单,pypi上也有很多开源库,当然如果你动手能力强,使用Python自行编写难度也不大。当然,Python缺失的这些应用恰恰是R的长处,所以后面我们还会介绍Python调用R来执行特定程序。另外,在手动安装scikit-learn之前一定要确保Numpy(含mkl)、Scipy、Matplotlib按顺序安装,这样才能保证不同库的依赖关系建立正确,否则可能会导致scikit-learn安装或导入报错。

(2)XGBoost

GBDT、XGBoost、LightGBM都是在竞赛和工业界使用频繁且经过检验效果非常好的机器学习库,都能有效地应用到分类、回归、排序问题,并且是集成类机器学习算法的典型代表。GBDT是以决策树(CART)为基学习器(Base estimateor)的Gradient Boosting算法,XGBoost扩展和改进了GDBT, XGBoost得益于并行化的处理,其算法运行更快,并且更适合大数据的分布式处理(这可能是它最核心的亮点之一)。另外,由于XGBoost的基学习器除了CART外,还可以用线性分类器,因此其适用的场景更广。除此以外,它在分割点的查找、缺失值或数据稀疏问题处理等方面也做了相对优化,因此XGBoost准确率也相对高一些。该库的安装直接使用!pip install xgboost命令即可,使用import xgboost验证是否成功安装。有关该库的更多信息,请具体查阅https://xgboost.readthedocs.io/en/latest/

(3)LightGBM

LightGBM是微软推出的梯度boosting框架,也使用基于学习算法的决策树,它与XGB-oost,有相同的特性,例如都基于分布式的学习框架,都支持大规模数据处理和计算,都有更高的准确率。它比XGBoost的主要优化点在于通过多种方式减少内存的使用,例如基于Histogram的决策树算法、带深度限制的Leaf-wise的叶子生长策略、Cache命中率优化等。因此,它也是非常好的并行集成学习方法。LightGBM的安装官网的过程略显复杂,读者可直接使用!pip install lightgbm命令安装,之后使用import lightgbm测试安装是否成功。有关该库的更多信息,请具体查阅https://lightgbm.readthedocs.io/en/latest/

(4)TPOT

TPOT是一款Python自动化机器学习工具,它使用遗传编程方式优化机器学习管道(pipelines)。它通过探索不同的pipelines来测试效果,并自动找到最适合数据的pipelines方案。它本身基于sklearn做了二次封装,通过一定算法来自动寻找所用的算法以及参数。该库需要读者手动安装,如果读者已经通过Aanconda安装了Python环境,那么需要先通过!pip install deap update_checker tqdm stopit命令验证相关组件,再通过!pip install tpot命令安装该库,完成后使用import tpot测试是否成功。但如果没有Anaconda环境,那么安装过程略显复杂,请读者参考https://epistasislab.github.io/tpot/installing/查阅更多信息。

3.自然语言处理库

(1)结巴分词

由于NLTK本身不支持中文分词,因此在针对中文的处理过程中,我们会引入其他分词工具,例如结巴分词。结巴分词是国内的Python文本处理工具包,分词模式分为3种模式:精确模式、全模式和搜索引擎模式,支持繁体分词、自定义词典等,是非常好的Python中文分词解决方案,可以实现分词、词典管理、关键字抽取、词性标注等。结巴分词默认不在Anaconda的安装包中,读者可在Jupyter中直接使用!pip install jieba命令安装即可。安装成功之后,使用import jieba导入。有关结巴分词的安装和更多信息,具体查阅https://github.com/fxsjy/jieba/

(2)Gensim

Gensim是一个专业的主题模型(主题模型发掘文字中隐含主题的一种统计建模方法)Python工具包,用来提供可扩展统计语义、分析纯文本语义结构以及检索语义上类似的文档。Gensim默认不在Anaconda的安装包中,读者可在Jupyter中直接使用!pip install gensim命令安装。安装成功之后,使用import gensim导入。更多信息请查阅http://radimrehurek.com/gensim/

4.数据库连接库

数据库存储是企业数据存储的基本方式,数据库类型包括MySQL、Oracle、SQL Server、DB2、Sybase等,基于大数据场景下还会包括Hive、Hbase、MongoDB、Redis等的数据存储。

(1)MySQL连接库

为了方便读者练习和应用,本书使用MySQL数据库进行数据存储、查询等操作。MySQL连接库需要自己安装。要使Python连接MySQL,既可以通过MySQL官方连接程序,也可以使用第三方库来实现。

1)使用MySQL官方程序。到https://dev.mysql.com/downloads/connector/python/直接下载对应版本Python的程序。由于在笔者撰写此书时,Windows官方对Python 3的支持仅到3.5版本,而笔者的Python程序是3.7版本,因此暂时没有官方支持的程序版本。

2)使用第三方库PyMySQL。在Python 2中,我们可以使用第三方库MySQLdb,而在Python 3中,我们使用PyMySQL连接MySQL数据库。直接在Jupyter中使用!pip install pymysql命令即可完成安装。安装成功之后,使用import pymysql导入。更多信息请查阅https://pypi.python.org/pypi/PyMySQL

(2)MongoDB连接库

由于不同企业的大数据平台的数据存储不同,并且即使是同一种存储方案,也会由于系统环境和存储组件的版本不同导致适配和连接的差异,本节仅以MongoDB连接包为例进行说明。

MongoDB是由C++语言编写的分布式文件存储的数据库,它是以Key-Value(键值对)形式面向文档存储的非关系型数据库。Python连接MongoDB需要手动安装,可以使用PyMongo(MongoDB官方驱动程序),在Jupyter中可通过!pip install pymongo命令进行安装。安装成功之后,使用import pymongo导入。有关PyMongo的安装和更多信息,具体查阅http://api.mongodb.com/python/current/tutorial.html

5. HTML处理库

网络是企业重要的外部数据来源,因此获取和处理HTML的信息是Python数据接入和处理的重要能力。

Beautiful Soup

Beautiful Soup是网页数据解析和格式化处理工具,从严格意义上来讲它不是一个纯抓取类的工具,因为它不具备抓取能力,通常配合Python的urllib、urllib2等库一起使用。Beautiful Soup默认已经在Anaconda的安装包中,读者环境没有该包可在Jupyter中直接使用!pip install beautifulsoup4(注意后面有个“4”)命令完成安装。安装成功之后,使用import bs4(注意导入的库名与安装的库名不一致)导入。有关Beautiful Soup的安装和更多信息,具体查阅https://www.crummy.com/software/BeautifulSoup/

6.图形展示库

图形展示是数据可视化的必要内容,在Python中,通常使用Matplotlib实现图形展示。

(1)Matplotlib

Matplotlib是Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形,开发者仅编写几行代码,便可以生成绘图、直方图、功率谱、条形图、错误图、散点图等。Matplotlib默认已经在Anaconda的安装包中,如果读者环境没有该包,可在Jupyter中直接使用!pip install matplotlib命令完成安装。安装成功之后,使用import matpl-otlib导入。更多具体信息请查阅http://matplotlib.org

(2)Pyecharts

在Web端流行的Echart几乎是图形展示的代名词。它支持众多的图形展示,功能非常强大。Pyecharts则可以调用Echart来生成各种各样的图形,例如关系图、树形图、地图、瀑布图等,本书也会用该库做展示。Pyechart需要读者手动安装,在Jupyter中执行!pip install pyecharts命令安装即可,通过from pyecharts import Bar导入特定的库,本代码导入的是条形图。有关该库的该库的更多信息,请访问pyecharts.org。

7.图像处理库

图像处理提供针对视频和图像数据的输入、分析、处理和挖掘的功能,Python最常用的图像和视频处理库是Pillow和OpenCV。

(1)PIL和Pillow

PIL(Python Imaging Library的简称)是一个常用的图像输入、处理和分析的库,提供了多种数据处理、变换的操作方法和属性。但是由于PIL仅支持到2.7版本且已经很久没有更新,因此一群志愿者基于PIL发布了其新的分支Pillow。Pillow同时支持Python 2和Python 3,并且加入很多新的功能,因此我们可以直接使用Pillow来代替PIL。Pillow默认已经在Aanconda的安装包中,读者环境中如果没有,可在Jupyter中使用!pip install pillow命令安装。安装成功之后,在Jupyter中使用import PIL(注意大小写且注意导入的包名称)导入。有关该库的更多信息,请查阅https://pillow.readthedocs.io/en/latest/index.html

(2)OpenCV

OpenCV是一个强大的图像和视频工作库。它提供了Python、C、C++、和Java接口,支持Windows、Linux、Mac OS、iOS和Android。OpenCV的设计效率很高,它以优化的C / C ++编写,库可以利用多核处理。除了对图像进行基本处理外,还支持图像数据建模,并预制了多种图像识别引擎。OpenCV默认不在Anaconda的安装包中,读者可通过!pip install opencv-python和!pip install opencv-contrib-python两个命令分别安装OpenCV开发包及扩展。上述操作完成后,在Jupyter中使用import cv2(注意库名)导入。有关OpenCV的安装和更多信息,请查阅http://opencv.org

提示

截至本书终稿前,OpenCV 4.0仍然不支持Python 3.7版本,无论使用pip、easy_install以及其他whl文件安装都无法正常使用,请读者留意。另外,在导入3.4版本的OpenCV时仍然有可能提示缺少DLL文件,此时请找到压缩包中的DLL.zip压缩包,将其中的4个dll文件解压,并放到C:\Windows\System32路径下即可。

8.其他库

本书中根据实际案例,还会安装不同的第三方库/包,具体会在场景中说明,在此不一一列出。

1.2.4 数据库和客户端

在本书中,大多数案例数据都会直接从数据库中读取,这是因为实际应用中的运营数据基本上也是在数据库中直接获取并进行初步的数据探查工作,因此数据库是开展数据工作的基础工具。为了提高数据库的操作和使用效率,并能使更多读者开始入门数据库应用,我们会使用客户端工具,通过界面化的方式降低数据库的应用难度。数据库我们选择MySQL,客户端使用Navicat。

关于MySQL和Navicat软件的下载,网络资源非常丰富,请读者自行寻找并下载安装,笔者的MySQL为64位、5.7.21版本。

数据库安装并配置完成之后,通过Navicat客户端进行连接。方法是:单击顶部菜单“文件-新建连接-MySQL”,在弹出的对象框中输入如下信息,如图1-26所示。

图1-26 新建数据库连接

❑ 连接名:用来识别不同连接的名称。

❑ 主机名/IP地址:本地使用127.0.0.1,远程服务器填写实际IP地址。

❑ 端口(埠):在配置MySQL时设置的端口,默认为3306(具体取决于配置MySQL时的设置)。

❑ 用户名和密码:在配置MySQL时创建的用户名(默认为root)和密码(配置过程中自定义输入的)。

输入完成后,单击“连接测试”,如果信息配置正确并且MySQL服务可用,那么会返回“连接成功”字样。

如果返回状态提示无法连接,如“Can't connect to MySQL server on 'localhost' (10061) (2003)”,那么可能是MySQL没有启动。具体启动方法是:

单击电脑左下角的“开始-运行”,输入命令services.msc,在打开的“服务管理器”中找到MySQL并双击。在打开的属性窗口中,单击“启动”按钮,服务便可启动,如图1-27所示。

图1-27 启动MySQL服务

有关使用客户端以及Python直接操作数据库的具体应用,会在后续案例中陆续介绍。

1.2.5 SSH远程客户端

对于数据工作而言,如果只是在本机上做数据分析处理和建模工作,通常只能利用有限的个人电脑性能实现有限规模的数据计算能力。当数据计算量或数据规模很大时,通常会选择在本地进行数据测试,然后到服务器上运行Python程序。此时,我们需要一个能在本机和服务器之间进行数据、信息和指令交互的SSH远程客户端工具。

对大多数数据工作者而言,本地电脑操作系统以Windows居多,而服务器操作系统以Linux系统居多,因此SSH远程客户端工具的主要作用就是连接Windows和Linux。此类工具很多,包括XShell、SecureCRT等,笔者使用的是SecureCRT,如图1-28所示。

图1-28 启动SecureCRT