Python数据科学实践指南
上QQ阅读APP看书,第一时间看更新

第1章 Python介绍

本书主要介绍数据科学所使用的工具,但因为每一种语言都有自己的生态系统,而笔者多用Python,所以本书主要会从Python的角度来介绍这些工具。阅读本书的读者,不管之前的基础如何,如果对Python这门编程语言有一定的了解,将能更好地掌握书中内容。可能有很多读者曾经在学校里学过C/C++或是VB,又或者听说过Java、PHP等这样广泛使用的编程语言,初闻Python的时候可能会对这个名字略感陌生,不过这一点并不能阻碍Python成为数据科学领域的“一等公民”。从本质上来说,编程语言都是类似的,即通过计算的方式表达人类大脑中的想法,可能读者现在还想象不出来在电脑上浏览网站的动作是如何转换成公式,并通过电脑进行计算的。这个看似简单的动作其实包含了一系列从低级到高级的抽象,也就是我们常说的算法、设计模式等内容。现在的编程语言有上千种之多,虽然各有各的特色,但是都脱离不了基本的算法和设计模式。很多有用的框架都在多种编程语言上实现过,他们的功能几乎是一致的。不过这些种编程语言中也有着一些明显的区别,表1-1提供了区分不同编程语言的一些维度。

表1-1 区分编程语言的一些维度

表1-1中灰色部分就是Python所对应的特性。总的来说,Python是一门高级语言,使用者并不需要关心计算机底层是如何工作的。而且Python的使用不仅局限于数据处理,它还可用于Web开发、嵌入式开发等领域,是一门被广泛使用的高级语言。

由于Python是解释运行的,因此并不需要提前编译,省去了大量的麻烦,并且可以在大多数常见的操作系统上执行。

1.1 Python的版本之争

笔者非常希望这本书是你的第一本Python书,这样本书就不用去解释为什么Python会有两个不兼容的版本了。但是,这个问题必须解释清楚!因为这是一本入门类图书,不仅应该讲授当下必须了解的知识,还应当适当地回顾历史、展望未来。Python之父吉多·范罗苏姆是在一个圣诞节的假期为了打发无聊时光而开发的Python早期版本,不过当时由于电脑性能太差,而Python的设计又强调通过消耗电脑的时间来节约人力的时间,导致Python程序运行缓慢,因此在早期并没有受到太多关注。2001年Python才发布了2.0版本,实际上在2.4版本发布的2004年之后Python的使用才开始快速增长。Python 2.5版本在以前是一个非常流行的版本,以至于这个版本被维护了很多年,至今仍然能够看到很多以这个版本撰写的图书。在这个时期电脑的性能得到飞速提升,程序员们也慢慢地接受了这种花费计算机的一些时间来节约自己的时间的理念。在Python 2.x发布了9年之后的2009年,Python 3.x发布了,为了解决2.x版本中的一些早期设计缺陷,以及包括字符串编码等Python老大难问题。不过这似乎也带来了更多的问题,在经过了3个版本的补救之后,3.4版对Python3.x进行了大刀阔斧的修改,以至于在3.x的版本中3.4之前和之后的版本也并不兼容。好在当时迁移到3.x的项目并不多,不过这也确实给人以Python 3.x不靠谱的印象,因此也为以后3.x版本的推广增加了一些难度。当然坊间流传的另外一个原因是“Python 3.x比Python 2.x慢”,我不得不承认这是个事实,但Python本来也不是以快为目的而设计的,所以真的不必在意这一点。

目前,常用的Python有两个版本,Python 2.x和Python 3.x(通常指3.4以后的版本,3.0-3.3版本官方已经不推荐使用了)在本书写作时最新的版本是Python 2.7.11和Python 3.5.1。,两个版本在很多方面都不兼容,甚至简单的“打印”输出都不兼容,所以基本上没办法无痛地将写好的Python程序在两个不同版本的解释器上运行。Python 3.0于2009年年初发布,Python社区从版本2向版本3的跨越用了7年时间,但仍然说不上成功,大量有用的库仍然不支持Python 3。即使有这样的问题,新版本的Python仍有不少优点,比如它统一了Python 2中比较混乱的部分,解决了编码问题,增加了新式类,尤其在Python 3.5这个版本中,还增加了异步关键字async、await等,这些改变使得Python 3相比于Python 2有着很大的优势。然而在本书写作之时,仍然有一些重要的库不支持Python 3,所以笔者推荐使用Python 2.7进行本书的学习。不过为了着眼未来,本书会尽量使用Python 3的风格来书写程序,并且会在首次出现时注明,希望能够帮助那些未来会使用Python 3的读者减少一些迁移的痛苦。

1.2 Python解释器

由于Python是一门开源语言,所以只要愿意,任何人都可以为其实现一个解释器。目前官方解释器CPython是绝对主流,如果读者有兴趣,可以了解一下其他的版本,比如支持JIT(即时编译)的PyPy,可以把Python编译成C语言的Cython,拥有notebook这样友好、方便编程界面的IPython等。本书会使用官方解释器CPython进行讲解,并且还会使用到一些第三方的库,本节也将介绍一下如何在主流的操作系统中安装必要的软件。

1.2.1 Mac OS X系统

如果读者使用的是苹果电脑(并且使用的是其自带的系统),那么无须特别安装Python,因为它已经被预先安装在电脑中了。为了验证这一点,读者可以打开Mac OS X的“终端”应用,在打开的终端里输入“python”。如果可以看到如下的输出则证明电脑中已经正确地安装了Python:

          Macbook Pro:~:$ python
          Python 2.7.9 (v2.7.9:648dcafa7e5f,  Dec 102014,  10:10:46)
          [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
          Type "help",  "copyright",  "credits" or "license" for more information.
          >>>

上述代码中第一行的“$”符号是终端的命令提示符,需要在这个符号之后输入“python”这个命令以打开Python,如果一切正常,则终端会输出一些关于Python版本的信息,最后一行以“>>>”结尾。“>>>”是Python交互式解释器的命令提示符,想要使用Python,应当在这个符号后面键入Python命令。若想要退出Python则需要在“>>>”之后输入“exit()”,或者同时按下键盘上的快捷键Ctrl+D。

1.2.2 Linux系统

如果读者使用的是Linux系统,那么与Mac OS X系统一样,无须进行安装即可使用Python。打开终端的方式取决于你使用的Linux发行版本如果读者想学习Linux,并且不知道该如何选择Linux发行版,那么本书推荐选择Ubuntu。,不过读者可以尝试按Ctrl+Alt+T的组合键来启动终端,或者在应用菜单中寻找“终端”或名为“Terminal”的应用。在打开了终端之后在命令提示符(通常来说是“$”)后,键入“python”以确认Python的版本信息,终端输出的内容应当与Mac OS X的相同,并且“>>>”同样代表Python命令提示符,若想要使用Python,则应当在这个符号后面输入Python命令。

1.2.3 Windows系统

由于Windows系统默认没有提供Python不仅是Python,即使Java、C/C++这些常见语言的编程环境Windows都默认没有提供。,因此需要单独安装Python。读者可以尝试访问https://www.python.org/downloads/windows/以获取最新的Python安装包。在写作本书时最新的Python 2.x版本是Python 2.7.11,分为32位版和64位版,下载地址分别如下。

32位版:https://www.python.org/ftp/python/2.7.11/python-2.7.11.msi

64位版:https://www.python.org/ftp/python/2.7.11/python-2.7.11.amd64.msi

如果读者的电脑是较新的操作系统Windows 7以后的系统,包括Windows 7、Windows 8和Windows 10。,并且拥有4GB以上的内存,那么通常来说安装64位的软件应该是没有问题的。如果读者所用的系统较老,或者不确定自己的系统是多少位的,可以选择32位的版本进行安装。因为无论是32位还是64位的系统,都能够运行32位版本的软件,反过来32位的系统却不能运行64位的软件。

下载完成之后双击鼠标进行安装,在该过程中,就像安装普通的应用程序一样连续单击“下一步”,直到出现图1-1所示的界面为止。

图1-1 Windows版Python安装界面

然后在Add python.exe to Path的安装选项中选择Will be installed on local hard driver。接下来通过同时按下Win+R键Win键就是空格键的左边或右边带有微软徽标的按键。打开运行,在弹出的运行对话框中键入cmd,如图1-2所示。

图1-2 Windows“运行”程序界面

操作完成后,就打开了Windows的命令行界面,如图1-3所示。

图1-3 Windows命令行(cmd)窗口

此时在命令提示符“>”后输入“python”会出现两种情况:情况一,会出现与Mac OS X系统一样的Python版本信息,并且以“>>>”结尾。情况二,会出现“‘python’不是内部或外部命令,也不是可运行的程序或批处理文件。”的错误信息。如果是这样,就需要先运行下面的命令只有在安装时需要运行一次,以后无须再次运行。以修正这个错误:

          set PATH=%PATH%; C:/Python27

之后再运行Python,就可以得到正常的输出了,如图1-4所示。

图1-4 在Windows上正确运行Python的界面

至此,读者应该已经能够在自己的电脑上使用Python进行编程了。在Windows下,想要退出Python只能使用输入exit()的这一种方式,Windows的cmd不接受Ctrl+D的命令。

1.3 第一段Python程序

Python程序有时也称为Python脚本,是定义和命令的序列。Python提供了非常方便的交互式解释器,也就是1.2节中提到的在终端输入“python”时启动的程序。很明显,无论是终端还是Python交互式解释器,都需要用户在命令提示符后面输入命令才能工作,通常我们称其为shell、Linux shell、Mac OS X shell或是Python shell。shell对应的中文有“壳”的意思,表示这是计算机核心计算单元的一层外壳,用户可通过这层壳向计算机发送命令。现在请读者打开Python shell,让我们尝试一些例子:

          Macbook Pro:~:$ python
          Python 2.7.9 (v2.7.9:648dcafa7e5f,  Dec 102014,  10:10:46)
          [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
          Type "help",  "copyright",  "credits" or "license" for more information.
          >>>print("Hello Data")
          Hello Data
          >>>print("Hello %s" % "World")
          Hello World
          >>> "Hello Data"
          'Hello Data'
          >>>1 + 2
          3
          >>>

这里分别执行了4条命令,在命令提示符“>>>”之后,我们手动输入了print("Hello Data")、print("Hello %s" % "World")、"Hello Data"、1 + 2。每输入一条命令按一次回车键,Python shell就会在接下来的一行顶格打印出执行完该命令所得到的结果,并换行输出另外一个命令提示符,以等待下一条命令。注意,这里在第一条和第二条语句中分别给print函数在Python 2中print通常是以命令的方式出现的,比如print “Hello Data”,但这里使用的是Python 3打印函数的形式,后续的章节中会讲解打印函数相较于打印命令的优点。传了一个值,如果是一句话这里暂时还不能在shell中输入中文字符,关于如何处理中文会在第2章中详细介绍。,那么print函数会将其打印到屏幕上。接下来的命令中则省略了print函数,直接输入"Hello Data",其结果与前两条语句的结果稍稍有些不同(多了左右的单引号)。这是Python shell特有的功能,无需特殊的命令就能输出Python语句的结果(单引号仅表示结果是字符串类型的,并没有其他的含义)。

最后一条语句中进行了一个简单的数学计算,读者还可以尝试其他的运算。需要特别注意的是,当进行除法计算时,比如下面这个命令:

          >>>10/3
          3

所得到的结果是整除法的结果(省略了小数部分),如果想要得到正常的结果,请用小数表示这个计算,比如:

          >>>10/3.0
          3.3333333333333335

这个问题在Python 3中已经得到了解决,并且在Python 2中也有很好的解决方案,关于这点第2章中会进行详细的介绍。

1.4 使用Python shell调试程序

Python shell不仅为Python初学者提供了一个方便的入门工具,更是提高了专业程序员和数据科学家们的生产力。比如在编写程序时忘记了某个表达式的写法,可以打开Python shell,在里面调试好了之后再写入程序。或者直接在Python shell中探索原始数据文件中的数据,变换数据的结构,执行计数、去重、分组等操作。并且可以随时查看前辈们留给我们的建议,比如在Python shell中输入import this,将导入Python中一个名为this的模块:

          >>> import this
          The Zen of Python,  by Tim Peters

          Beautiful is better than ugly.
          Explicit is better than implicit.
          Simple is better than complex.
          Complex is better than complicated.
          Flat is better than nested.
          Sparse is better than dense.
          Readability counts.
          Special cases aren't special enough to break the rules.
          Although practicality beats purity.
          Errors should never pass silently.
          Unless explicitly silenced.
          In the face of ambiguity,  refuse the temptation to guess.
          There should be one-- and preferably only one --obvious way to do it.
          Although that way may not be obvious at first unless you're Dutch.
          Now is better than never.
          Although never is often better than *right* now.
          If the implementation is hard to explain,  it's a bad idea.
          If the implementation is easy to explain,  it may be a good idea.
          Namespaces are one honking great idea -- let's do more of those!
          >>>

大意是:

          Python之道

          美丽优于丑陋
          明确优于晦涩
          简单胜于复杂
          复杂胜于混乱
          平铺胜于嵌套
          稀疏胜于紧凑
          可读性很重要
          尽管实用性很重要,但也不能破例违背上述原则
          绝不让错误无声无息,除非你想这么做
          面对模棱两可时,不要妄想猜测能解决问题
          应该只有一种最适合的,且显而易见的解决方案
          可能这种方案一开始并不那么显而易见,因为你不是Python之父
          做比不做强,但是随意做还不如不做
          很难向别人解释的方案是不好的
          很容易向别人解释的方案也许是好的
          命名空间是一个令人拍手称赞的好点子,让我们善加利用

通过上面的例子,我们已经知道了Python中模块的概念,模块是Python中最大的代码单位,以后我们还会学到文件、函数、语法块等不同级别的Python代码单位。在一个Python的模块中可能会包含一个到多个不同的功能,Python中随解释器一起分发的标准模块有300多个,可以应付绝大多数的编程任务,也确实有些程序员坚持只使用标准库提供的模块。不过本书提倡的是另外一种编程的哲学,即“不要重复造轮子”,只要某一个功能已经被别人实现为模块了,那么最好拿来就用,而不是自己重新编写。所以我们会安装很多第三方模块,这些模块也是非常优秀的,只是还没有被收录进官方的标准模块中事实上很多官方的标准模块都曾经是第三方模块。,也是基于此,下面将使用pip来安装第三方模块。不过,根据操作系统的不同,安装方式也略有区别,如果读者使用Mac或Linux系统,那么按照之前的教程并没有经历安装Python解释器的步骤,因此这里需要读者确认一下自己的Python版本。可以在终端输入python,比如:

          $ python
          Python 2.7.11 (default,  Jan 282016,  13:11:18)
          [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
          Type "help",  "copyright",  "credits" or "license" for more information.
          >>>

在输出的第一行Python代码之后,由点号分隔的部分就是Python的版本,例如上述代码中显示的版本是2.7.11。如果你的Python版本为2.7.9或高于该版本,那么你无须任何操作就已经拥有了pip程序,可以在终端中输入pip尝试一下,会有类似下面的输出:

          $pip

          Usage:
          pip <command> [options]

          Commands:
          install                    Install packages.
          download                   Download packages.
          uninstall                  Uninstall packages.
          freeze                     Output installed packages in requirements format.
          list                       List installed packages.
          show                       Show information about installed packages.
          search                     Search PyPI for packages.
          wheel                      Build wheels from your requirements.
          hash                       Compute hashes of package archives.
          completion                 A helper command used for command completion
          help                       Show help for commands.

如果很不幸你的Python版本号低于2.7.9,那么需要手动安装pip,可以在网址https://bootstrap.pypa.io/get-pip.py中下载安装脚本。

将脚本下载到某一个目录中,然后使用下面的命令进行安装:

          $sudo python get-pip.py

由于Mac系统和Linux系统权限的要求,这一步需要你输入电脑的开机密码。

对于Windows系统来说,如果是参考本书的安装方式进行安装的,那么你已经获得了最新版本的Python,也就表示你已经拥有了pip,可以直接使用。

使用pip安装Python的第三方模块非常简单,比如我们要安装requests这个第三方模块,可以使用下面的命令:

          $pip install requests

一般来讲,Windows的用户直接运行这个命令就可以安装了,而Mac或Linux用户由于系统权限的原因需要在命令的最前方增加sudo这个命令,代码如下:

          $sudo pip install requests

以后的章节中将不再强调这一区别,请读者根据自己的系统使用相对应的命令。另外有一部分因为历史原因,第三方库是使用C语言编写的,因此很可能还需要你的电脑上装有C/C++编译器。对于Mac和Linux来说,就是GCC编译器,对于Windows来说则是Visual Studio。

在上述过程的实践中,大家可能会遇到各种各样的问题,本书无法穷尽所有可能会遇到的问题,所以当遇到具体的问题时应当尽量求助于搜索引擎。关于使用搜索引擎,笔者自己有一条最基本的原则:我不可能是第一个遇到该问题的人!只要遵守这个原则,绝大多数情况下都能找到令人满意的答案。