Python数据科学实践指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-29 09:44:20

点击下载

作者:纪路

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python数据科学实践指南

Python数据科学实践指南试读:

前言

为什么要写这本书

我接触大数据技术的时间算是比较早的,四五年前当大数据这个词火遍互联网的时候,我就已经在实验室里学习编程及算法的知识。那个时候我一心想要做学术,每天阅读大量的英文文献,主要兴趣更多的是在机器人和人工智能上。研究生毕业时我本来想实现早先的愿望,继续攻读博士学位,不过思来想去觉得不应该错过大数据这个机会,所以毅然决定投入大数据行业中。

在工作之初,市面上已经存在一些介绍大数据相关技术的权威著作,其中很多还是很底层的或特定领域的专著。但即使是我这种自诩为“学院派”的人看这些书,头脑也会经常开小差。而大数据相关的技术又特别庞杂,包括计算框架、网络爬虫、机器学习算法、编程语言、数据库、文本分析、数据流水线的架构,甚至还包括前端可视化等众多方面,只有对它们都有涉猎,才能更好地胜任相关的工作。所以我读过很多的相关图书,这确实为我以后的工作打下了坚实的基础,不过随着工作内容的增加,以及新同事的到来,更多的问题相继涌现。首当其冲的就是,并不是每个人都有足够的基础来阅读这些专业著作,而且每个人的情况各不相同,有的是编程基础差,有的是数学基础差,有的是英语基础差,这也导致我的这套学习方法难以推广开来。所以我想写一本关于大数据技术的手册,其目的并不是为读者讲明白所有技术背后的原理,而是告诉读者某项技术可以用于哪些工作中,哪些工作需要哪些工具。

读完这本手册,可以帮助读者建立一个相对完整的大数据生态的概念,其中所讲的每一个工具都值得读者进行更深入的研究(你也可以像我一样,对其中的两三项进行非常深入的研究),也许在研究过程中,你会成为该领域的专家。如果现在正在看这本书的你是一位技术决策者,那么我希望本书的介绍能帮助你下定决心使用其中的某项技术,比如写作全书的Python语言就是一门非常好的数据处理语言,它能快速编码,且具有强大的字符串处理能力,拥有大量成熟的大数据类库,这些都使Python成为数据科学领域无可争议的No.1语言;或许你的团队可以仅用Python编写大规模分布式爬虫程序(虽然本书介绍的是单机的简化版)就能大幅度地提升工作的效率。Scrapy可能是爬虫领域最有名的框架了,你也可以像我一样实现属于你自己的版本。当然这本书也是一本Python入门书,所以读者无须担心阅读门槛,你可以从零基础开始学习,并体验整个学习过程所带来的愉悦。

读者对象

根据工作职责的不同,我为本书划分出了一些可能的读者,具体如下。

·想要了解大数据生态的学生。

·需要快速入门大数据的技术人员。

·需要了解技术细节以做决策的技术管理者。

·希望入门Python但不知如何下手的编程爱好者。

如何阅读本书

本书分为三部分,其中第1~4章是Python基础,这个部分会介绍阅读本书所必须掌握的Python知识,但并不会包含很复杂的编程知识,比如面向对象编程就不是必要的,因为Python支持过程式编程,可以直接编写函数,使用这种方式编程更适合教学,因为所有的执行步骤都是线性的,方便逐步讲解。第5~7章讲解的是Python直接提供的数据处理工具,这些工具包括一些易用的数据结构、标准库和第三方工具。学习这些工具可以让我们快速地实现某些简单的算法,而不用花费大量的时间“重复造轮子”,Python处理数据的高效性在此处将体现得淋漓尽致。第8~12章是一些实际的案例,将会涉及Python主要擅长的几个领域:统计、爬虫、科学计算、Hadoop&Spark中的集成、图计算等。最后的三个附录分别介绍了关于Python的一些扩展知识,比如如何编写同时兼容Python 2和Python 3的代码,如何安装完整Python开发环境,以及一些常用的Python技巧,如处理时间、文件I/O等。

勘误和支持

由于笔者的水平有限,编写的时间也很仓促,书中难免会出现一些错误或不准确的地方,恳请读者批评指正。另外本书的部分代码会上传到Github上,其网址为:https://github.com/magigo/data_science_tool_book_code。你可以将书中的错误发布在Issues中,或者向我提问,我会尽可能地回答你的问题。当然如果是比较好的问题我也希望你能在知乎上邀请我回答,这样就能有更多的人受益于你的问题,我的知乎主页为:https://www.zhihu.com/people/ji-lu-15-70。如果你有更多的宝贵意见,也欢迎你发送邮件至我的邮箱magi-go@126.com,我很期待能够听到你们的真挚反馈。

致谢

首先要感谢“仁慈的独裁者”吉多·范罗苏姆(Guido van Rossum),他在我出生的那一年(1989年)发明了Python编程语言,不仅为我带来了一份全职的工作,还为我带来了无尽的乐趣。而且我与Python似乎真的有着某种缘分,不仅出生年份相同,生肖也相同,不知道吉多是否知道1989年正好也是我国的农历蛇年呢。

感谢机械工业出版社华章公司的编辑Lisa邀请我写作本书,刚开始时我乐观地估计本书很快就能写作完成。不过就像大多数软件项目一样——它延期了。感谢Lisa在百忙中适时地督促我写作,没有她我想这本书与读者见面的时间还会延后。

最后我要特别感谢我的爸爸、妈妈和前女友(你知道我要强调“前”这个字),感谢你们促进了我的身心成长,是你们促使我变得像现在这般强大!

谨以此书,献给我最亲爱的家人,以及众多热爱Python的朋友们。纪路中国,北京,2017年1月第0章发现、出发

最近一年里,知乎社区有不少朋友邀请我回答关于数据挖掘的问题,其中提问最多的是关于“如何改行做数据挖掘”。我想他们之所以邀请我回答这类问题,不是因为我做数据挖掘做得好,而是好奇我是如何改行做数据挖掘的?说来也巧,我本科是学电子的,研究生是学控制的,而我的职业理想是成为一个“先知”,但我并不知道如何才能实现这一职业理想。自公元632年人类最后一位先知默罕默德去世之后,将近1400年没人做先知了,既没有人可以指导我,也没有可以效仿的对象。2011年到2013年发生了一系列事件,包括IBM的沃森在“危险边缘”节目中击败了人类选手、Google Brain某些成果的展示、美国统计学家Nate Silver对于总统大选的预测等,这些事件都有一个共同点,那就是让“数据科学”从学术研究蜕变为实际的应用。这也让我意识到也许我可以做得更好—通过“数据科学”建造一个“先知”,虽然直到现在我还没有实现这个目标,不过我愿意把这一路积累的经验拿出来与大家分享,希望这些东西能够帮助各位读者实现自己的目标,或者找到自己的目标。现在,就让我们出发吧!0.1 何谓数据科学

在家用计算机普及之前,数学、逻辑学、哲学及自然科学研究的目的都是为了追求完美的理论证明,或者是提供某种确定性的规则,用以解释某种自然现象,或者为某些技术提供理论依据。那个时候人类产生数据的能力和收集数据的能力还很有限,或许公司的经营账目和计算导弹发射弹道的演算纸就属于数据最集中的地方了。在那个年代,这些数据分析和处理的工作大都是由人工完成的,最多也只会借助某些由机械或电子构成的计算装置罢了。在互联网兴起之后,人类将现实世界中的很多信息以数据的形式存储到网络空间中,比如生活中发生的一段故事,或者旅行中家人的照片,这些数据记录了人类的行为和社会的发展,甚至包括了自然环境的变化。当今,大量的、各种各样的数据快速产生,并存储在互联网中,而这些数据自然而然地构成了一个人造的环境,称为数据界(data nature)。通过对数据界中数据的研究,我们不仅可以了解数据本身的种类、状态、属性及变化形式和规律,还能从中洞悉人类的某些行为,了解人类的某些社会属性。并且这些研究方法还能扩展到其他依赖数据的学科中,比如气象科学、地震科学、金融学、基因科学,等等。在可以预见的未来,我相信,不仅在互联网行业中会有数据科学家的身影,在各行各业中,只要与计算机打交道,我们就不得不为已经产生和将要产生的数据做好充分的准备。所以,我认为在这个数字化的时代,不同的专业领域,都需要从大量的数据中寻找到一系列的理论和实践,这就是数据科学。0.1.1 海量的数据与科学的方法“如何才能成功?”无数成功学方面的书本和布道者都没法给出一个方程或流程图来向所有人解释这一过程。最多只能根据统计学(或者是臆想)列举出一些可能的必要条件,比如努力、机遇、贵人或仅仅只是运气好。我们能否对人类的行为做一个精确的建模?太难了,比如,不同的人对于成功的定义不同,有的人认为挣钱是成功,有的人认为出名是成功。再比如就算大家都认为成为企业家可以算作某种意义上的成功,但是企业的种类又各有不同,有的人是在电商领域成功的,有的人是在金融行业成功的,他们的成功经历也各不相同。

事实上,关于“成功”的变量我可以列举无数个,但即使穷尽了所有可能的变量,也还会遇到数据缺失的问题—一个人成功之前的数据又该如何准确地记录?这个世界有60亿人,如果每个人出生时就携带一个电子记录仪,那么就可以记录这个人生活中发生的所有事情。这有可能么?可能,不仅是可能的,而且我们现在就在做类似的事情,智能手机正源源不断地收集人类的数据并且存储到网络中,我们购物的数据、兴趣的数据、人口统计学的数据等都将用作描述我们每一个人的“数字化身”,这是存在于网络中的我们。并且随着智能硬件、物联网、工业4.0的推进,整个现实生活中的人类社会在网络中都会有一份“副本”。为了处理这些数据,并且从中找到对我们有价值的结果,需要更先进的技术与方法,其中将会涉及数据的收集、转换、存储、可视化、分析与解释等内容,这将会是一项非常有价值的课题。0.1.2 数据科学并不是新概念

在过去的几年中,大数据、人工智能、数据挖掘等词汇被媒体炒得热火朝天,一方面我乐于见到我所从事的工作受到人们的关注,另一方面我也发现越来越多的人开始疑惑。就像本书开篇中所提到的那样,我每天都会收到来自不同工作领域的人(有时候是记者或化工专业的从业者,有时候是程序员或数学系的学生,有时是一些在实际工作中遇到困难的工程师)的提问,有的是希望能澄清一些概念,有的是问如何入门,有的是希望我针对他遇到的麻烦提一些建议。我很乐意帮助他们,顺便抱怨一下某些不负责任的媒体,是它们把大数据吹得天花乱坠,把各种神秘的力量都赋予数据科学,好像数据科学家就是新时代的先知一样,能够预测未来,改变人类的命运。而且媒体给公众传递的信息是这样的:大数据是上个月才出现的,Google在上周才提出了深度学习方法,一举解决了人工智能难题。我担心在这样冒进的社会氛围下,这些被扭曲的报道掩盖了事实的真相,那些对这个领域感兴趣的人会被吓跑,这颗科学史上的新星会陨落(在我收到过的提问里,甚至有人问:大数据的浪潮是不是过去了,现在学还来得及么?)。如果要追溯数据科学的起源,可以从1974年在美国和瑞典同时出版的《计算机方法的简明调查》一书中看到,作者彼得·诺尔对数据科学下过这样的定义“数据科学是处理数据的科学,一旦数据与其所代表的事物的关系被建立起来,就能为其他领域与科学提供借鉴”。

在“大数据”出现以前,统计学家觉得他们所做的就是数据科学,他们会通过分析一些数据来为公司或政府提供一些决策上的帮助。比如,大型上市公司的财报,或者每一次美国大选之前所做的民意调查就属于此类范畴。当然,不能认为互联网时代的数据科学是新瓶装旧酒,经历了这么多年的沉淀和积累,加上广泛的需求,数据科学发展出了一套与之相适应的理论和方法。我也希望能帮助更多的人了解数据科学,促进数据科学的发展。0.1.3 数据科学是一个系统工程

现代工业界喜欢谈生态和闭环,其实数据科学也要贯穿数据的整个生命周期。下面将数据的生命周期简单地划分为如下几个阶段。

·数据采集

·数据清洗

·数据处理

·数据查询与可视化

数据采集传统的手段主要来自于经营数据和网络爬虫采集的数据。现在还包含一些“数据化”的过程,2013年一篇题为“The Rise of Big Data”(大数据的崛起)的文章中提到了“数据化”的概念,即数据化是一种流程,可以将生活中的方方面面转化为数据。各种手机上的传感器,智能穿戴等设备采集数据的过程都属于数据化。

数据清洗主要负责处理数据中的噪声或缺失数据。由于填写表单时的疏忽,或者是爬虫程序的故障,再或者是传感器失灵等原因,总是会产生一些我们意料之外的数据,这些数据可能不符合某些格式的要求,或者会缺失部分数据,需要通过数据清洗来剔除或修正这些数据。如果数据量巨大,这就需要我们有处理海量数据的能力。

数据处理可以使用统计学的方法或机器学习的方法从数据中发现我们想要的价值,通常所说的数据挖掘就是在这一步中进行的。之所以这里没有使用“数据挖掘”这个词,是因为有些时候,在某些项目中仅仅使用简单的统计方法就可以得出很有价值的结论,并没有使用数据挖掘的专门技法。而且,与普通人的直觉相反,数据挖掘结果的价值往往是通过与业务的紧密结合才能体现出来的,胡乱套用算法往往得不出任何有价值的东西。比如,通过历史房产中介的销售数据(包括房屋的价格、面积、层数、每层住户数等信息)来为新的楼盘定价、预测目标客户群体就是两个不同任务,前者通常只需要简单统计(实际上我们过去一直就在这么做)即可,而后者可能就要使用分类预测算法了。

数据查询与数据可视化这两项是为了将处理过后的数据呈现给需要的人。有的时候是需要索引巨量的数据,比如搜索引擎。有的时候是规律性的结果需要以图表的形式呈现,比如一些信息图(尽管目前大多数信息图都是人工统计的数据),或者在处理之前对大数据集进行探索。

上面列举的几个阶段,每一个都面临着巨大的挑战,虽然工业界有一些解决方案,但离成熟还远得很。并且在面对不同的公司、不同的开发人员、不同的业务需求时,要将这几个阶段有机地整合起来更是难上加难。在其中起到核心作用的人就称为“数据科学家”。0.2 如何成为数据科学家

读者应该知道这个问题很难回答,失败的原因总是相似的,成功的经历却各有不同。从来没有人靠复制他人的经历就能获得同样的成就,就像“人不能两次踏入同一条河流”的哲学观点一样,没有人可以复制别人的经历,更何谈成就。因此在回答这个问题时,我只假设一些概念上的前提条件:良好的计算机科学基础,较高的英文读写水平,极强的自学能力,还有一些个人品质比如耐心、毅力、乐于分享,等等。不过最重要的还是“兴趣”,我相信能花上几十块钱购买这本书的读者一定是有兴趣的,因为这本书是给那些对数据科学有一些了解,希望学习具体方法的人准备的。所以,即使上面所说的前提条件你一个都不具备,只要有兴趣,那么让我们从现在就开始吧。

我需要数学或计算机科学的学位吗

最好有!如果你恰好是在校大学生,又碰巧学习数学或计算机相关专业(在这个程序员匮乏的年代,所有必修C语言的专业都称为“计算机相关专业”),希望你能学习好学校的课程,下面是一份技能清单,如果其中有一些技能没有在你的课程安排里,那么最好是通过选修或自学的方式进行补充。

·一门编程语言

·算法、数据库、操作系统

·概率与统计、线性代数

·英语

对于已经错过了花季、雨季的社会人来讲,如果你并非从事计算机程序开发的相关工作,上述几项技能对你来说可能要求太高了。不过,你还是需要多付出一些努力来补上这些知识,当然是在读过本书之后。得益于互联网的发达,很多教学资源都能够从网上获取,这里也向各位读者推荐一些好的网站。

·编程学习:

https://www.codecademy.com/

https://www.codeschool.com/

这是国外的两家编程学习网站,拥有交互式解释器、美观的讲义,有一些课程还有手把手的视频教程,可能读英文对你来说有点慢,不过这是一个好的开始。

·算法学习:

http://www.brpreiss.com/books/opus7/

这是由布鲁诺·R·普莱斯所著的一系列算法图书的在线版,包括C++版、Java版、C#版、Python版、Ruby版、Lua版、Perl版、PHP版、Objective-C版等,你能想到的常用编程语言都有对应的版本,它们中的一部分有过正式引进的中文版,或者有爱好者翻译的版本,当然推荐阅读原版。

另外,本书会带领读者复习一下概率与统计和线性代数的基本概念,以及介绍一些SQL方面的知识。最后,不要忘记本书的目的是通过数据科学实战学习Python编程。希望读者在读过这本书之后,能有充分的知识来支持后续的学习。0.3 为什么是Python

通过书名,各位读者就应该知道这是一本讲解Python编程的书了。数据科学只是个引子,我希望能通过相关的例子和练习激发出读者的兴趣,帮助读者除掉编程这条拦路虎。在很多非计算机相关专业的人的概念里,编程是要归为玄学分类的,通过一堆意义不明的符号就能驱动计算机完成各种各样的任务,是不是有点像魔法师口中所念的咒语。但事实上,计算机只能做两件事情,执行计算并记录结果,只不过它的这两项能力远远超过人类大脑的能力(读者可能看过一些文章,其中有些研究声称尝试估算过人类大脑的计算能力,发现人脑的计算能力仍然比现今最先进的计算机还要快很多倍。但是人类大脑中有些模块,比如视觉、语言,是人类经过亿万年的演化,大自然进行极致优化所产生的结果。这里对于计算和存储能力的比较仅是指数学计算和文字存储方面)。以我正在使用的笔记本来说,其拥有主频为2.5GHz的双核处理器,总计约等于50亿次/秒的计算速度。而512GB的硬盘则可以存储10万本书(按每本书5MB计算,实际上5MB[1]大小的书应该算是鸿篇巨著了。假如按UTF-8编码,每个中文占3~4个字节(byte),而5MB约有500万个字节,这至少是一本百万字的书)。如果想要使用计算机这种能力强大的工具,就需要掌握一门编程语言,用来和计算机进行沟通。虽然我也想为各位读者科普一下众多的编程语言,不过这毕竟是一本教授Python编程的书,所以这里只通过以下几个方面来阐述一下用Python作为数据科学工具的理由。(1)简单易上手

Python被誉为可执行的“伪代码”,其语法风格接近人类的语言,即使是第一次看代码的人也能很容易理解程序所要实现的功能,读者[2]可以试着阅读下面这段代码:for i in range(0, 10): print(i)

上面的代码中range代表一段区间,0代表下界,10代表上界,通常Python程序的上下界是左闭右开的一个区间。for的含义表示“这其中的每一个数”,print就不言自明了,代表打印结果到屏幕上。

除了优雅的语法之外,Python还属于解释性语言,我们可以不经过编译、链接等步骤直接获得程序执行的结果。而且Python还拥有交互式解释器,可以让我们随时随地测试我们的代码,如图0-1所示。图0-1 初次使用Python(2)资源丰富、应用广泛

已经有很多书讲解了Python相关的技巧,比如《编程导论》是麻省理工学院(MIT)计算机科学导论的课程;《Python编程实战》是一本Python编程技巧进阶的好书,介绍了在Python中如何实践设计模式;《机器学习实战》主要讲解了机器学习的常见算法,其中使用Python编写了全部的代码;《Python高手之路》对如何使用Python构建大型系统提出了很多有益的见解。而且使用Python的知名项目也很多,比如OpenStack开源云计算平台就是由Python编写的,还有世界上最大的视频网站YouTube也是使用Python开发的,等等。当然Python在大数据应用上也有其独特的优势,科学计算库NumPy和SciPy、绘图模块Pylab、统计库Pandas、机器学习库Scikit-learn都是为Python所设计的,现在流行的Hadoop和Spark也都提供了Python接口。可以说在“大数据”“数据科学”领域,如果某一个产品不支持Python,那么其前景将会是难以想象的。(3)跨平台、免费

Python官方提供了多平台的解释器,包括Windows、Mac OS X、Linux甚至更多的其他平台,你所写的Python代码,可以在不经修改的情况下移植,比如在Windows上开发,在Linux服务器上运行,不会有任何问题。而且Python是免费且开源的,不仅标准库可以随意阅读其源码,连官方解释器的C语言实现也可以获得其源码。Python社区是鼓励分享的,读者不仅可以从中学到很多编程的技巧,甚至还可以做出一些贡献。

[1] UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字元编码,可以编码世界上大部分语系的字符,也是使用最为普遍的一种编码方式。除了UTF-8之外还有专门的中文编码—GBK,日文编码—Shift_JIS有在使用。

[2] Python代码的缩进应该总是4 个空格,这是保证程序正确性、可读性的前提。0.4 一个简单的例子

下面是一段用Python编写的有趣的代码,这里所用的模块并不会在本书中进行讲解,仅仅是向购买本书的你表示我的感激。

代码清单如下:# ! /usr/bin/python# -*- coding: utf-8 -*-import sysfrom colorama import initinit(strip=not sys.stdout.isatty())from termcolor import cprintfrom pyfiglet import figlet_formatcprint(figlet_format('welcome', font='starwars'), 'yellow', 'on_blue', attrs=['bold'])

其输出的结果如图0-2所示。图0-2 打印艺术学的Python程序

这段代码非常酷,它会将一个英文单词转换成字符拼接的文字,如果你还看不懂该程序,也没关系,在学完第1章之后你就能明白这段代码的含义了,祝你阅读愉快。第1章Python介绍

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

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

由于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(通常[1]指3.4以后的版本,3.0-3.3版本官方已经不推荐使用了),两个版本在很多方面都不兼容,甚至简单的“打印”输出都不兼容,所以基本上没办法无痛地将写好的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] 在本书写作时最新的版本是Python 2.7.11和Python 3.5.1。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:~:$ pythonPython 2.7.9 (v2.7.9:648dcafa7e5f, Dec 10 2014, 10:10:46) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwinType "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发[1]行版本,不过读者可以尝试按Ctrl+Alt+T的组合键来启动终端,或者在应用菜单中寻找“终端”或名为“Terminal”的应用。在打开了终端之后在命令提示符(通常来说是“$”)后,键入“python”以确认Python的版本信息,终端输出的内容应当与Mac OS X的相同,并且“>>>”同样代表Python命令提示符,若想要使用Python,则应当在这个符号后面输入Python命令。

[1] 如果读者想学习Linux,并且不知道该如何选择Linux发行版,那么本书推荐选择Ubuntu。1.2.3 Windows系统[1]

由于Windows系统默认没有提供Python,因此需要单独安装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[2]

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

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

然后在Add python.exe to Path的安装选项中选择Will be installed [3]on local hard driver。接下来通过同时按下Win+R键打开运行,在弹出的运行对话框中键入cmd,如图1-2所示。图1-2 Windows“运行”程序界面

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

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

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

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

[1] 不仅是Python,即使Java、C/C++这些常见语言的编程环境Windows都默认没有提供。

[2] Windows 7以后的系统,包括Windows 7、Windows 8和Windows 10。

[3] Win键就是空格键的左边或右边带有微软徽标的按键。

[4] 只有在安装时需要运行一次,以后无须再次运行。1.3 第一段Python程序

Python程序有时也称为Python脚本,是定义和命令的序列。Python提供了非常方便的交互式解释器,也就是1.2节中提到的在终端输入“python”时启动的程序。很明显,无论是终端还是Python交互式解释器,都需要用户在命令提示符后面输入命令才能工作,通常我们称其为shell、Linux shell、Mac OS X shell或是Python shell。shell对应的中文有“壳”的意思,表示这是计算机核心计算单元的一层外壳,用户可通过这层壳向计算机发送命令。现在请读者打开Python shell,让我们尝试一些例子:Macbook Pro:~:$ pythonPython 2.7.9 (v2.7.9:648dcafa7e5f, Dec 10 2014, 10:10:46) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwinType "help", "copyright", "credits" or "license" for more information.>>>print("Hello Data")Hello Data>>>print("Hello %s" % "World")Hello World>>> "Hello Data"'Hello Data'>>>1 + 23>>>

这里分别执行了4条命令,在命令提示符“>>>”之后,我们手动输入了print("Hello Data")、print("Hello%s"%"World")、"Hello Data"、1+2。每输入一条命令按一次回车键,Python shell就会在接下来的一行顶格打印出执行完该命令所得到的结果,并换行输出另外一个命令提示符,以等待下一条命令。注意,这里在第一条和第二条[1][2]语句中分别给print函数传了一个值,如果是一句话,那么print函数会将其打印到屏幕上。接下来的命令中则省略了print函数,直接输入"Hello Data",其结果与前两条语句的结果稍稍有些不同(多了左右的单引号)。这是Python shell特有的功能,无需特殊的命令就能输出Python语句的结果(单引号仅表示结果是字符串类型的,并没有其他的含义)。

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

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

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

[1] 在Python 2中print通常是以命令的方式出现的,比如print"Hello Data",但这里使用的是Python 3打印函数的形式,后续的章节中会讲解打印函数相较于打印命令的优点。

[2] 这里暂时还不能在shell中输入中文字符,关于如何处理中文会在第2章中详细介绍。1.4 使用Python shell调试程序

Python shell不仅为Python初学者提供了一个方便的入门工具,更是提高了专业程序员和数据科学家们的生产力。比如在编写程序时忘记了某个表达式的写法,可以打开Python shell,在里面调试好了之后再写入程序。或者直接在Python shell中探索原始数据文件中的数据,变换数据的结构,执行计数、去重、分组等操作。并且可以随时查看前辈们留给我们的建议,比如在Python shell中输入import this,将导入Python中一个名为this的模块:>>> import thisThe Zen of Python, by Tim PetersBeautiful 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多个,可以应付绝大多数的编程任务,也确实有些程序员坚持只使用标准库提供的模块。不过本书提倡的是另外一种编程的哲学,即“不要重复造轮子”,只要某一个功能已经被别人实现为模块了,那么最好拿来就用,而不是自己重新编写。所以我们会安装很多第三方模块,这些模块也是非常优秀的,只是还没有被收录进官方的标准模块中[1],也是基于此,下面将使用pip来安装第三方模块。不过,根据操作系统的不同,安装方式也略有区别,如果读者使用Mac或Linux系统,那么按照之前的教程并没有经历安装Python解释器的步骤,因此这里需要读者确认一下自己的Python版本。可以在终端输入python,比如:$ pythonPython 2.7.11 (default, Jan 28 2016, 13:11:18) [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwinType "help", "copyright", "credits" or "license" for more information.>>>

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

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

[1] 事实上很多官方的标准模块都曾经是第三方模块。第2章Python基础知识

为了开启我们的数据科学之旅,本章会进行一些基础的编程训练。第1章中已经搭建好了Python的运行环境,读者应该已经能够在Python shell中执行简单的打印和四则运算了。接下来我们要完整地学习一遍构成一个Python程序的基本要素。2.1 应当掌握的基础知识

本节会介绍一些学习Python前应当掌握的基础知识,这一部分内容在所有的编程语言学习中基本上都是类似的,Python当然也遵守这些通用的规则,熟悉这些内容的读者可以跳过这一节。2.1.1 基础数据类型

首先,需要明确的是,在Python中,所有的元素都是“对象”。“对象”是计算机科学中的一个术语,本书以后的章节会对其进行介绍,现在读者只需要将对象等同于“东西”就好了。既然是一种东西,那么就要对其进行分类,所有对象都要归属于某个“类型”,比如猫属于动物,电视属于电器,床属于家具等。从这个比喻来看,对象是一个具体的事物,而类型则是一个抽象的分类,并且同一类型的东西总是有很多相似之处,比如动物需要吃东西,可以自由移动,或者趴在你的键盘上妨碍你打字(开玩笑的)。虽然本章并不打算介绍“面向对象”,但还是想强调一下“对象”是Python程序处理的核心事物,而且每个对象都有它所归属的类型,最终会由类型决定Python程序可以对这个对象做什么。

Python有如下5种基本的数据类型。

·None:这个类型表示什么都没有,这是一个特殊的类型,并且也仅有None这一个对象。

·int:表示整数的类型,比如1、2、3、4这样的数字就是int型,当然,负数–1、–2、–3、–4等也都在int的范围之内,范围等同于数学定义中的整数。

·float:代表浮点数,比如1.2,4.5或–72.1,当所要表达的数字过大或过小时可能会用科学计数法来表示,比如1.6E11代表1.6×1011这样的大数。而且1.0或–2.0这样的数也叫作浮点数,虽然它们的值与去掉小数点及后面的0之后的值看起来是相等的,但是它们是不同[1]的类型,Python程序可以对它们做的事情也不一样。比如下面这一[2]小段程序:jilu:~:% pythonPython 2.7.9 (v2.7.9:648dcafa7e5f, Dec 10 2014, 10:10:46) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> 2 == 2.0True>>> 2 is 2.0False>>> type(2)>>> type(2.0)>>>

·bool:表示布尔类型的值,可能有的读者听说过布尔值只有两个,非0即1,在Python中使用False代表0,True代表1,上面的一小段代码试图判断2与2.0之间值的大小时,Python程序的结果是True,而在判断2是不是2.0时返回的却是False。

·str:代表字符串类型,比如“Hello World”就是一个str类型。严格来说,在Python 2中还有一个unicode类型几乎与str类型没有任[3][4]何区别。并且str类型也不是原子类型,而是由多个字符组成的序列类型。实际上str类型并不是基础数据类型,可实际上几乎没有程序能够完全不使用字符串类型的对象(即使是第1章中的示例程序,也用到了字符串类型的对象,那个时候读者也许还不知道什么是对象,就已经知道“Hello World”是字符串了),所以这里将str划为基础数据类型。

现在,我们已经介绍了Python的5个基本类型,接下来就让我们对它们做一些事情。

[1] 比如在Python 2.x中1/2与1/2.0的结果是不同的,当然这里的区别非常微妙,初学者也不用太过在意。

[2] 在Python中“==”表示对左右两边的值进行“值相等比较”,而“is”则代表对类型和值同时进行比较,另外,与不等于比较相对应的版本是“!=”和“is not”,type可以告诉我们传入的对象所归属的类型。

[3] 在Python 3中unicode已经被取消了,所有的字符串都是str类型。

[4] 所谓“原子”类型,就是不能够再进行切分的最小类型单位,之前介绍的4个类型都属于原子类型。2.1.2 变量和赋值

在Python中我们可以随意为对象起一个名字,甚至起好几个名字,比如下面的语句:>>> USD_to_CNY = 6.4855>>> dollar_rate = USD_to_CNY>>> dollar_rate = USD_to_CNY = 6.4855

第一条语句用于将字面量为6.4855的浮点型对象赋值给USD_to_CNY变量;第二条语句是通过变量USD_to_CNY将6.4855传递给了另外一个变量dollar_rate;第三条语句则是前两条的合体。这里需要强调的是,在Python里所有的赋值操作都是起一个别名,对象还是最原始的对象,这种方式叫作引用传递。Python中有一个id()方法,可以将某个对象在Python内部的唯一编号打印出来,为了证明这一点,一起来看一下下面的代码及输出:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载