Python与R语言数据科学实践

978-7-115-61071-3
作者: [加拿大/意大利]里克·J.斯卡韦塔(Rick J. Scavetta)[保加利亚] 博扬·安格洛夫(Boyan Angelov)
译者: 黄德滨
编辑: 郭泳泽

图书目录:

详情

本书从数据科学的角度,讲解了Python和R的语言特性以及各自的优缺点,介绍了包括包、框架和工作流在内的开源生态系统,分析了Python和R分别适用于哪些业务场景,并通过真实的案例演示如何在单个工作流中集成Python与R,使两种语言充分发挥优势,改善业务应用的效果。本书还提供了Python和R的对照翻译,帮助读者在两种语言间快速切换。 本书适合数据科学领域有一定Python或R基础的开发人员阅读,能够帮助读者探索完成数据科学任务的新方法并改善应用效果。

图书摘要

版权信息

书名:Python与R语言数据科学实践

ISBN:978-7-115-61071-3

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

版  权

著    [加]里克·J.斯卡韦塔(Rick J. Scavetta)
       [保]博扬·安格洛夫(Boyan Angelov)

译    黄德滨

责任编辑 郭泳泽

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内容提要

本书从数据科学的角度,讲解了Python和R的语言特性以及各自的优缺点,介绍了包括包、框架和工作流在内的开源生态系统,分析了Python和R分别适用于哪些业务场景,并通过真实的案例演示如何在单个工作流中集成Python与R,使两种语言充分发挥优势,改善业务应用的效果。本书还提供了Python和R的对照翻译,帮助读者在两种语言间快速切换。本书适合数据科学领域有一定Python或R基础的开发人员阅读,能够帮助读者探索完成数据科学任务的新方法并改善应用效果。

O'Reilly Media,Inc.介绍

O’Reilly以“分享创新知识、改变世界”为己任。40多年来我们一直向企业、个人提供成功所必需之技能及思想,激励他们创新并做得更好。

O’Reilly业务的核心是独特的专家及创新者网络,众多专家及创新者通过我们分享知识。我们的在线学习(Online Learning)平台提供独家的直播培训、图书及视频,使客户更容易获取业务成功所需的专业知识。几十年来,O’Reilly图书一直被视为学习开创未来之技术的权威资料。我们每年举办的诸多会议是活跃的技术聚会场所,来自各领域的专业人士在此建立联系,讨论最佳实践并发现可能影响技术行业未来的新趋势。

我们的客户渴望做出推动世界前进的创新之举,我们希望能助他们一臂之力。

业界评论

“O’Reilly Radar博客有口皆碑。”

      ——Wired

“O’Reilly凭借一系列非凡想法(真希望当初我也想到了)建立了数百万美元的业务。”

      ——Business 2.0

“O’Reilly Conference是聚集关键思想领袖的绝对典范。”

      ——CRN

“一本O’Reilly的书就代表一个有用、有前途、需要学习的主题。”

      ——Irish Times

“Tim是位特立独行的商人,他不光放眼于最长远、最广阔的领域,并且切实地按照Yogi Berra的建议去做了:‘如果你在路上遇到岔路口,那就走小路。’回顾过去,Tim似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。”

      ——Linux Journal

资源与支持

资源获取

本书提供如下资源:

补充代码;

本书思维导图;

异步社区7天VIP会员;

要获得以上资源,扫描下方二维码,根据指引领取。

提交勘误

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区(www.epubit.com),按书名搜索,进入本书页面,点击“发表勘误”,输入勘误信息,点击“提交勘误”按钮即可(见下页图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。

如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

异步社区”是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。

异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域30余年的发展与积淀。异步图书面向IT行业以及各行业使用IT技术的用户。

前  言

为什么编写本书

我们想要向数据科学家呈现,为什么深入了解、更加熟悉和反复思考所使用的工具是提高数据科学生产力的最佳策略。为了达到这一目标,本书并非只是写一册两种编程语言的词典(但是可以在附录中很方便地找到相应的资源)。关于Python与R的持续争论(所谓的“语言战争”)早已失去了意义。这些争论让我们想起马斯洛(Maslow)的锤子:“如果有一把锤子,那么一切看起来都像钉子。”这是一种绝对幻想的世界观,认为单一的工具就能提供一个包罗万象的解决方案。现实世界的情况取决于使用环境,好的工匠知道应该选择恰当的工具。我们的目标是呈现一种全新的工作方式,这种方式可以使用所有优秀的数据科学工具本身(而与这些工具是用什么语言编写而成无关)来拓展现代数据科学家的思维和工作模式。

在书名[1]中选择现代一词不仅仅是为了表示方法的新颖性,也能够在讨论工具时体现更为细致入微的立场。那这里的现代数据科学是什么意思?现代数据科学应该具有以下特性。

[1] 英文书名为Python and R for the Modern Data Scientist,直译为“现代数据科学家的Python和R”。——译者注

全面,即数据不是孤立存在的,而要融入更为广阔的关系网,如团队或组织。我们应当避免使用一些行业术语来制造障碍,努力搭建桥梁拥抱整个数据科学(具体参阅前言中的“技术交互”一节)。

简单,即降低方法、代码和交流中不必要的复杂程度。

无障碍性,即这是一个开放的设计过程,是可以评估、理解和优化的。

可推广性,即这些基本工具和概念应该能够适用于很广阔的领域。

外向型性,即融合了其他各种领域的发展成果,并能够接受这些领域的影响。

道德和诚实性,即以人为本,参考了道德领域内的最佳实践,以及各种各样的观点,这些观点在社区和社会领域内都具有广泛影响。需要避免为了短期效益而进行炒作、追时尚和赶潮流。

虽然未来几年数据科学家的实际工作内容会发生变化,但是我们仍然可以预期这些永恒的原则特性仍然会成为数据科学坚实的基础。

技术交互

这是一个最好立刻马上应对的挑战,即接受这个世界是一个范围更为广阔、更为多样化、更为复杂的世界,不可能使用任何单一的工具解决全部的问题。

这种视角的拓宽会导致技术交互的增加。我们必须考虑采用最适合当前情况下的编程语言、第三方库、命名约定、项目文件体系结构、集成开发环境、文本编辑器等。多样性必然会导致复杂和混乱。

生态系统变得越多样化,我们就越需要考虑我们的选择是充当桥梁还是障碍。必须始终努力做出与其他同事和社区建立桥梁的选择,而不是那些缺乏灵活性创建障碍的选择。应留出足够的空间用来容纳将要遇到所有选择。每种情况下的挑战都是在平衡个人偏好和大众无障碍中做出选择。

这种挑战存在于所有技术交互中。除了工具选择(“硬”技能),还包括沟通(“软”技能)。交流的内容、方式和媒介,仅仅举几个需要考量的因素,看看它们是充当了特定受众桥梁还是障碍?

成为Python和R的双语者[2]是在更广泛的数据科学社区成员之间建立桥梁的第一步。

[2] 双语者在本书中的含义为Python和R两种编程语言的使用者。——译者注

本书适用读者

本书面向处于职业生涯中期的数据科学家。因此,不会尝试教授数据科学。尽管如此,在致力于陈述任何主题、工具或编程语言之前,了解现代数据科学环境中的各种可能性也是必要的,因此早期职业数据科学家也可以从这本书中获益。

我们的目标是弥合Python和R两个社区之间的鸿沟,希望摆脱组织隔绝的、将“我们与他们”对立起来的心态,转向一个统一、高效的社区。因此,这本书适合那些想要扩展技能的数据科学家,从而拓宽他们的视野和工作范围,并为各种数据科学项目提升价值。

忽视可以使用的强大工具是一种疏忽。应努力采用新的、富有成效的方式来实现编程目标,并鼓励公司同事走出舒适区。

此外,当你只需要快速将一种语言中熟悉的内容翻译成另一种语言时,第II部分和附录也可作为参考资料使用。

前提

为了达到本书的目的,我们假设读者至少熟悉数据科学领域的主要编程语言Python和R中的一种,当然了解与它们类似的语言(如Julia或Ruby)也可以。

基本熟悉数据科学领域一般的工作内容,例如,数据处理、数据可视化和机器学习,对于理解示例、工作流程场景和案例研究非常有帮助,但并非必需。

本书的组织

本书的组织方式模拟了一名成年人学习第二语言的过程。

在第I部分,首先回顾了这两种编程语言的起源,并介绍一些关键性的事件,以及这些事件是如何影响到当下的。通过与自然语言的类比,介绍一些不规则动词和复数结尾等怪异现象的来龙去脉。词源学[3]很有趣,可以帮助我们了解一门自然语言,如德语中看似无穷无尽的复数名词形式,但对于口语来说肯定不是必需的。如果想直接了解这些编程语言,请直接跳到第II部分。

[3] 词源学是研究词的来源和意义的学科。

第II部分通过提供一个互为镜像的视角,带领大家更深入地了解两种编程语言。首先介绍Python用户应该如何使用R,然后反过来。了解两种语言的运作方式,不仅能扩展技能,还能扩展思维方式。

在这一部分,开始成为编程语言双语者之前要区别对待每种语言。就像在自然语言中成为双语者一样,我们需要抵制两种可能导致失败的冲动。第一个冲动是总想着在母语中有多少更直接、更优雅,或者在某种程度上“更好”的东西。这虽然是值得夸赞的学习品质,但这不是学习一门新语言的重点。学习每一种语言都应该使用它自己的方式,尽管会在学习过程中进行比较,但不应该把母语变成我们的包袱。第二个冲动是不断尝试在两种语言之间逐字逐句翻译,有时这是不可能的。这会阻止我们使用新语言进行思考(甚至是做梦时也使用新的语言)!我喜欢使用的例子是德语中的das schmeckt mir或意大利语中的ho fame的措辞,比较差的翻译是根据字面的意思,直译为“这对我来说很美味”(味道很好)和“我有饥饿感”(我很饿)。关键是,不同的语言使用不同的结构。一旦意识到无法将所有内容一对一映射到以前的知识上,就会拥有新的工具和新的思维方式。这一部分的几个章节可以作为一种语言知识“翻译”到另一种语言的第一步。

第III部分涵盖了两种编程语言应用的当下现实环境,包括开源第三方库的广泛生态,以及各种特定工作流程方法的介绍。这部分将展示如何选择一种语言以及为什么做出这种选择。此时,我们仍然把两种语言分别对待。明白选择的方法可以帮助你在大型数据科学项目的各个阶段选择不同的语言提供帮助。

在自然语言中,翻译迷失是真实存在的。有些事情在一种特定的语言中表达效果会更好。德语中的mir ist heiß和ich bin heiß都是“我很热”的意思,但德语使用者会将热区分为到底是天气热还是身体热。再如Schadenfreude,它是源自“schaden”(伤害)和“freude”(快乐)的复合词,意思是从某人的痛苦中获得快乐,或者Kummerspeck,一个源自“Kummer”(悲伤)和“Speck”(肥肉)的复合词,指由于情绪化进食而增加的体重,它们的含义很精确,直译是达不到效果的。

第IV部分详细介绍了两种编程语言之间当前存在的一些接口。要变成双语者,首先要孤立地使用每种语言,然后要确定如何选择一种语言而不是另一种语言。现在将探索如何使用工具,这些工具将孤立的Python和R的多个脚本串联在一起,转化为在单条工作流中两种编程语言编织在一起的单个脚本。

当我们不仅会说双语,而且在双语社区中工作时,真正的乐趣才开始。我们不仅可以独立地用每种语言进行交流,而且还可以以只有其他双语人士才能欣赏和理解的新颖方式,结合两种编程语言一起使用。双语制不仅是进入新社区的途径,而且其本身也创造了一个新社区。对于纯粹主义者来说,这将是一种折磨,但希望我们能够超越这一点。双语者可以理解“Ordnungsamt今天正在监视Bergmannkiez”的警告。理想情况下,这不是因为忘记了单词而用原单词替换,而是因为它是当前情况的最佳选择。Orgnungsamt(类似一种监管机构)没有很好的英文译文,而且Bergmannkiez是柏林的一个街区,无论如何都不应该被翻译。有时,使用一种语言的词语更容易传达信息,如Mundschutzpflicht,即在疫情期间必须佩戴口罩。

这一部分末尾的第 7 章提供了一个案例研究,该案例将概述如何基于本书所涵盖的材料实施现代数据科学项目。在这里我们将看到前面叙述的所有内容都归纳到同一工作流程中。

对话

数据科学领域在不断发展,希望这本书能帮助你在Python和R之间轻松地遨游。我们期望聆听你的想法,了解你工作中发生的变化。欢迎广大读者通过本书的配套网站Modern Data Design与我们联系,在这里我们提供了更新的补充材料和方便的Python/R双语互译备忘清单。

本书中使用的约定

本书使用了以下排版约定。

这个图标表示带有建议性质的注意事项。
 
 
 

这个图标表示一般的提示。
 
 
 

这个图标表示带有警告性质的注意事项。
 
 
 

使用示例代码

补充材料(代码示例、练习等)可从GitHub上的本书资源库moderndatadesign/PyR4MDS下载。

如果在使用代码示例时遇到技术问题或其他问题,请发送电子邮件至bookquestions@ oreilly.com。

本书的目的是帮助你完成工作。一般来说,本书提供的示例代码可以直接在你个人的程序和文档中使用,除非要复制大部分代码,否则无须联系我们以获得许可。例如,编写程序使用本书中几段代码不需要许可,但出售或分发O’Reilly书中的示例代码需要获得许可;通过引用本书和示例代码来回答问题不需要获得许可,将本书中的大量示例代码合并到你个人的产品文档中需要获得许可。

本书不强制署名,但若你在引用本书内容时署名,我们对此表示感谢。署名通常包括书名、作者、出版商和ISBN。例如,标注“Python and R for the Modern Data Scientist by Rick J. Scavetta and Boyan Angelov (O’Reilly). Copyright 2021 Boyan Angelov and Rick J. Scavetta, 978-1-492-09340-4”。

如果你认为对代码示例的使用不属于合理使用或超出上述许可范围,请随时通过permissions@oreilly.com与我们联系。

O’Reilly在线平台学习(O’Reilly Online Learning)

 近40年来,O’Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。

我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O’Reilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。

如何联系我们

如果读者对本书有任何的评论或疑问,可以与出版社联系。

美国:

  O’Reilly Media, Inc.

  1005 Gravenstein Highway North

  Sebastopol, CA 95472

中国:

  北京市西城区西直门南大街2号成铭大厦C座807室(100035)
     奥莱利技术咨询(北京)有限公司

我们为本书提供了一个网页,其中包含勘误表、示例和其他的额外信息,读者可以通过http://oreil.ly/learn-algorithms进行访问。

如果你对本书有什么评论或技术上的建议,请发送电子邮件到bookquestions@oreilly.com。

关于我们的图片和课程的新闻和信息,可以访问http://oreilly.com。

致谢

在此感谢所有对本书的出版提供帮助的人。

感谢Michelle Smith,一位资深内容采集编辑,拥有无与伦比的热情、广博的知识和远见卓识,我们有幸与之共事。感谢内容开发编辑Angela Rufino在写作过程中引导我们前进,并向我们展示了由模范人物和亲切的鼓励话语组成的宣传墙来提振士气。感谢制作编辑Katie Tozer对手稿耐心细致的整理。感谢Robert Romano和O’Reilly的设计团队,他们不仅帮助重新绘图,而且还按照我们的意愿选择了一只充满活力、威风凛凛、令人印象深刻的乌贼作为封面!还要感谢Chris Stone和工程技术团队的帮助。

特别感谢在O’Reilly幕后无数默默无闻的工作人员。感谢他们为了提供更为出色的内容而付出的努力。

我们还要感谢技术审阅者,他们慷慨地贡献了宝贵时间、经验和有见地的评论:RStudio的Eric Pite和Ian Flores,O’Reilly的同事Noah Gift和George Mount,以及无可挑剔的作者Walter R. Paczkowski。他们的意见极大地提升了本书的质量。

Rick还要感谢他过去10年来所有线上和线下的学生。每一次传递知识和见解的机会都会重申教学的价值,并对伟大的科学事业做出贡献,无论这样的贡献多么微不足道。Rick还要感谢专业的行政部门支持,使他能够与世界各地的基础科学家保持积极的联系。

最后,我们不仅要衷心感谢Python和R的开发人员,还要感谢广大的、互相联合的开源开发人员社区,他们的创造力、奉献精神和热情令人印象深刻。如果没有数以千计的开发人员一起工作,跨越国界、跨越数十年的集体努力,很难想象数据科学的前景会是什么样子。没有他们的贡献,本书几乎不可能有任何内容!

第I部分 探索新的语言

首先,我们将回顾Python和R的历史。通过比较它们的起源,可以更好地了解每种编程语言在数据科学领域当下的状态。如果想马上开始编写代码,随时可以跳到第II部分。

第1章 概述

本章作者:里克·J. 斯卡韦塔

作为本书的开始,我想引用一句名言:“这是最好的时代,这是最坏的时代……”但老实说,现在是最好的时代——数据科学正在蓬勃发展!随着时间的推移,数据科学不断成熟,就像许多学科所经历的一样,数据科学也开始分裂成细分的话题。这种成熟是计算科学早期就开始的漫长旅程的结果。相信了解Python和R的一些起源故事将有助于了解这些编程语言在当今环境中的不同之处,从而了解如何充分使用它们。

我们不会假装自己是科学史学家,我们只是那些追踪伟大发现和人物所处环境的小众学者。我们能做的只是提供一张精彩的画卷,说明Python和R的来源,以及它们如何走到了今天。

1.1 R的起源

每当想到R,我就会想起FUBU,一家成立于20世纪90年代的街头服饰公司。它是一个让我立刻爱上的短语的首字母缩略词:For Us, By Us。FUBU是“社区”的意思,表示理解员工和客户的需求和愿望,并确保为他们提供良好的服务。R就是FUBU[1],到本章结束时,相信你也会有同样的感觉。一旦承认R就是FUBU,R就开始变得更有意义了。

[1] 其实更像是由统计学家为统计学家服务(For Statisticians,By Statisticians),但没有一个品牌叫FSBS。

R的起源可以追溯到现在具有传奇色彩的(美国)新泽西州贝尔实验室。1976年,约翰·钱伯斯(John Chambers)率先开发了统计编程语言S。一年后,他出版了《数据分析的计算方法》(Computational Methods for Data Analysis,John Wiley & Sons),他的同事约翰·塔克(John Tukey)也在贝尔实验室发表了《探索性数据分析》(Exploratory Data Analysis,Addison-Wesley)。1983年,Chambers等人出版了《数据分析的图形方法》(Graphical Methods for Data Analysis,CRC Press)。这些书提供了一个开发计算系统的框架,使统计学家不仅可以探索、理解和分析他们的数据,还可以交流他们的成果。在这里谈论的是全明星的FUBU阵容!Chambers的合著者包括Paul A. Tukey和William Cleveland。Cleveland关于感知的实证实验,总结在两本有见地的书中,至今仍在为更广泛的数据可视化领域提供参考。在他们对科学计算和统计的众多贡献中,Tukey开发了一些新颖的可视化方法,如经常被误解的箱线图(也称箱须图),而Cleveland开发了局部加权回归散点平滑法(Locally Weighted Scatterplot Smoothing, LOESS)。

这里选择从S语言开始叙述,是因为S最终会成为R语言的基础。其实从上面一段的描述中可以了解到很多关于S与R语言的基础。首先,统计学家是非常实际的人(S就是“统计数据”一词的英文单词“statistics”的首字母,非常简单直接),这是一个非常实用的特点。其次,统计学家需要一种专门用于数据分析FUBU的编程语言,他们对开发通用编程语言或操作系统不感兴趣。另外,简单地说,那些关于计算统计和可视化的早期书籍,就是教学之美和精确阐述相结合的绝妙例子[2],尽管由于时间久远,这些技术已经明显过时。我认为这些书为统计学家,尤其是R社区,对如何以开放、清晰和包容的方式进行技术交流播下了种子。相信这是R社区根深蒂固的一个杰出而独特的标志。最后,早期对于图形化方式的强调告诉我们,S语言已经开始关注灵活高效的数据可视化,这对于理解数据和成果的交流来说是必不可少的。因此,S语言旨在以真正的FUBU方式尽可能轻松地完成最为重要的事情。

[2] 《数据分析的计算方法》可能是个例外。因为我还没有读过这本书。

S语言的初始发行版运行在UNIX系统上并且可以免费获得。最终,S语言采取了名为S-PLUS的许可证。这促使奥克兰大学的Ross Ihaka和Robert Gentleman于1991年实现了另一个开源和免费的S语言版本,并且保留了使用单个字母命名编程语言的传统。R 1.0.0的第一个官方稳定Beta版于2000年2月29日发布。在此期间,有两个重要的进展:首先是CRAN项目,全称是全面R归档网络(The Comprehensive R Archive Network),用来在镜像服务器上托管和归档R第三方库的安装文件;其次是R语言核心团队的成立。这群志愿者(目前由20名成员组成)实现了基础R,包括文档、构建、测试和发布,以及使这一切成为可能的基础设施。值得注意的是,一些初始成员仍然在热情地参与R社区的活动,包括John Chambers、Ross Ihaka和Robert Gentleman。

自2000年R 1.0.0发布以来发生了很多事情,但到目前为止的故事应该已经让你了解R作为拥有FUBU精神的统计计算工具的独特背景。在继续R的故事之前,再来说说Python的故事。

1.2 Python的起源

1991年,当Ross Ihaka和Robert Gentleman开始研究后来的R语言时,荷兰程序员Guido van Rossum发布了Python。在当时,Python的核心愿景实际上是为了着手解决个人所面临的常见计算问题。事实上,van Rossum多年来被亲切地称为仁慈的终生独断者,这个头衔直到他在2018年辞去Python指导委员会的职务时才消失。

看到了S语言是如何从统计学家对数据分析的需求中产生,R如何从开源实现的需求中产生,那么Python解决了什么问题?这个问题确实不是数据分析——那是很晚才出现的概念。当Python出现时,C和C++这两种抽象级别较低的编程语言正在流行。Python作为一种解释性的、抽象级别较高语言的替代品慢慢地出现,特别是在2000年Python版本2发布之后(同年R 1.0.0发布)。Python的目的明确,首先是成为一种易于使用和学习、广泛采用且语法简单的编程语言。Python非常成功地扮演了这个角色!

这就是为什么你会注意到,与R相比,Python无处不在,而且用途广泛,如Web开发、游戏、系统管理、桌面应用程序、数据科学等领域。可以肯定的是,R的功能远不止数据分析,但请记住,R是拥有FUBU精神的。如果说R是FUBU,那么Python就是“瑞士军刀”。它无处不在,好像每个人都会用到它。但即使Python提供了很多工具模块,其实大多数人只是在特定范围内使用其中的某一种工具模块。尽管数据科学家在广泛的各种各样的环境中使用Python,但他们更倾向于找到特定的第三方库和工作流并专注于自己的工作需求,而不是使用这种通用语言的方方面面。

Python在数据科学领域的广泛流行并不完全归功于它的数据科学处理能力。我认为Python进入数据科学领域的原因是部分依赖于作为通用语言的现有用途,毕竟,好的开始是成功的一半。试想,分析师和数据科学家可以与系统管理和Web开发的同事共享和实施脚本,这将多么轻松惬意,因为他们都已经了解如何使用Python脚本。Python的广泛应用在其中发挥了重要作用。Python非常适合应用在高性能计算中,并有效地实现了众多深度学习算法。R曾经,也许现在仍然是,一门小众编程语言,某种程度上对于更为广泛的计算领域来说确实是一门“外语”。

尽管Python版本2于2000年发布,但直到2005年,随着一个广泛的用于处理数组数据NumPy第三方库的发布,Python才开始在数据科学领域生根发芽。从2001年开始一直为数据科学提供基本算法(如优化、积分、微分方程等)的第三方库SciPy,在这时也开始使用基于NumPy库的数据结构,SciPy同时还提供专门的数据结构,如k维树。

一旦解决了核心数据结构和算法的标准第三方库问题,Python就开始在科学计算中得到广泛应用。低级别的NumPy和SciPy第三方库为2009年的pandas等高级别第三方库奠定了基础。pandas为数据操作和数据结构提供了工具,如数据帧(data frame)。这些第三方库有时被总称为PyData,有了它们一切才能正常运转起来。

1.3 语言战争的开端

21 世纪初期发生的一些事件为后来被某些人称为语言战争的事件埋下了伏笔。随着 PyData栈开始成形,Python和R中的一些里程碑事件开始升温。其中有4个事件特别突出。

第一件事是,2002年BioConductor的建立。它作为新的R第三方库存储和框架,用于处理各种新兴的生物数据(尤其是大规模数据的读取)。在此之前,生物信息学家依赖MATLAB和Perl,以及经典的命令行工具和一些手工Web界面工具。MATLAB在特定学科(如神经科学)中仍然受到青睐,然而 Perl 大部分已经被 BioConductor所取代。BioConductor对生物信息学的影响再怎么强调也不过分,它不仅提供了一个用于处理远程基因序列数据库、数据表达、微阵列等第三方库的存储,还提供了处理基因序列的新数据结构。BioConductor 不断扩展并深深植根于生物信息学社区。

第二件事是,2006年发布了IPython第三方库。这是在交互式笔记本(notebook)环境中使用Python的开创性方式。从2012年开始,在得到各种支持之后,IPython最终在2014年成熟,成为Jupyter项目,现在包含在JupyterLab集成开发环境中。用户经常忘记Jupyter是“Julia、Python和R”的缩写,因为Jupyter现在实在太以Python为中心了。笔记本已经成为使用Python进行数据科学处理工作的主要方式了,2018年谷歌发布了Google Colab,一个免费的在线笔记本工具。第3章将深入探讨这一点。

第三件事是,2007年Hadley Wickham发表了他的博士论文,其中包含两个R第三方库,这些库从根本上改变了R的格局。第一个是reshape,成为后来正式版本的Tidyverse的基础(稍后会详细介绍)。尽管reshape早已“退役”,但它第一次让我们领略了数据结构是如何影响思考和处理数据的方式[3]。第二个是ggplot2,这个库代码实现了Leland Wilkinson等人的开创性著作《图形语法》(Springer Press),提供了直观、高级的绘图功能,大大简化了以前R中的实现方式(更多内容请参见第5章)。

[3] 我认为可以将这种关系追溯到R的早期,证据就是公式符号和各种内置数据集。尽管如此,仍缺乏一致且直观的框架。

最后一件事是,2008年发布了Python版本3。多年来,关于使用哪个版本的Python的问题一直存在,版本2还是版本3。这是因为Python版本3不向后兼容[4]。幸运的是,自从Python版本2于2020年停止使用以来,这个问题已经解决了。但令人惊讶的是,仍然可以在这个日期之后购买预装Python版本2的新MacBook Pro,因为很多旧的脚本仍然依赖这个版本,所以Python版本2仍然存在。

[4] 这甚至让一些著名的开发人员对Python 4.0的最终开发表示反感。但Python的发展过程仍值得期待!

1.4 数据科学主导权之战

到目前为止,Python和R都拥有了适用于构建各种数据科学应用程序的强大工具。随着所谓的“语言战争”的继续,其他关键性的发展使每种语言都找到了自己的定位。

Python和R都有特定的发行版。对于Python,有仍然流行的Anaconda 发行版(参见第3章)。对于R,数据科学软件开发商Revolution Analytics发布了Revolution R Open。尽管他们的R发行版从未被社区广泛采用,但该公司还是被微软收购了,这表明了企业界对R语言的强烈支持。

2011年,随着scikit-learn第三方库的发布,Python社区预见了机器学习的繁荣,随后于2016年发布了用于深度学习的TensorFlow和Keras,也得到了企业界的大力支持。这也凸显了Python作为高性能平台上的高级解释语言的优势。例如,你会发现Python不仅应用于Amazon Web Services(AWS)Lambda服务的大规模高并发编程,还在Numba用于高性能计算,以及前面提到的TensorFlow用于调用高度优化的C++。因为Python在数据科学领域之外的广泛采用,所以在机器学习模型部署阶段赢得赞赏也就不足为奇了,这些都是R所无法企及的。

2011年,RStudio IDE也由同名公司发布,在接下来的几年里,R社区成员开始聚焦在这个工具上。在这个时间点,使用R在很大程度上就是使用RStudio。RStudio对促进R作为一种适用于各种以数据为中心用途的编程语言的影响也很重要。

在这一切发生的同时,越来越多的R社区开始转向一系列的第三方库,其中许多库是由Hadley Wickham创建或带头创建的,目的是开始重构和简化典型的数据工作流。这些库所做的大部分工作是标准化R函数语法,以及输入和输出数据存储结构。最终,这套第三方库开始被通俗地称为“Hadleyverse”。2016年,在斯坦福大学的useR!会议主题演讲中,Wickham摒弃了这个称呼,就像是点燃了一团数字火焰一样烧掉了自己的名字,并创造了“Tidyverse”这个词。自从Wickham加入RStudio以来,该公司一直在积极开发和推广Tidyverse生态,可以说它已经成为R语言中的主导方言。第2章将更深入地探讨这一点。

可以想象,R至少包含两个“范式”或“方言”。这两种范式可以混合使用,但每种都有其独特的风格。基础R曾经并且可能仍然是大多数R的风格。Tidyverse在广泛的、包罗万象的第三方库和函数中重新构建了R的基础。这些库和函数可以很好地协同工作,通常依赖于管道(piping)[5],并且偏爱表格型数据[6]。我认为BioConductor提供了另一种方言,它专注于一个特定的学科——生物信息学。毫无疑问,你会发现一些大型第三方库如果包含足够多的特性,可能也会认为它们本身就是一种方言,但不要钻牛角尖。R现在处于一些用户只知道(或被教导)Tidyverse处理方式的关键节点上。基础和Tidyverse R之间的区别可能看起来微不足道,但也看到了许多新的R学习者也在试图努力理解:为什么Tidyverse会存在。部分是因为多年以来的基础 R 代码仍在广泛使用中,不容忽视。尽管Tidyverse的拥护者认为Tidyverse第三方库使初学者的生活变得更轻松,但相互竞争的方言可能会造成不必要的混乱。

[5] 也就是说,使用一个函数的输出作为另一个函数的输入。

[6] Python用户可能不熟悉术语“基础”。基础意味着只使用编程语言的内置功能,没有任何额外的第三方库安装。基础R本身具备良好的数据分析能力。而在Python中,数据科学家默认会导入PyData堆栈。

可以想象到,Python也包含不同的方言。Python的vanilla安装是基本安装,其运行方式与导入PyData堆栈的环境不同。但大多数情况下,数据科学家在PyData栈中操作,因此方言之间的混淆较少。

1.5 合作与社区建设的融合

有一段时间,编程语言战争中的主流态度似乎取决于对待这些语言的心态。不经意瞥了一眼某人的计算机屏幕,好像Python或R最终会在数据科学领域决一死战!虽然一些数据科学家仍然支持这一点,但我猜测你不是其中之一。也有一段时间,Python和R似乎试图互相模仿,只需要移植工作流,这样编程语言就无关紧要了。幸运的是,这些努力没有取得效果。Python和R都有独特的优势,试图模仿对方可能会丧失各自的优势。

今天,Python和R社区中的许多数据科学家认识到这两种语言都是杰出的、有效的、互补的。回到前言中的一个关键点,数据科学界已经汇聚到了合作和社区建设的这一点上——造福于每位参与者。

我们已准备好迎接新的Python和R并存的数据科学家社区。挑战在于,许多使用一种语言的用户并不十分了解两种编程语言之间如何互补或何时使用哪种语言。多年来这个问题已经有了一些解决方案,我们将在第IV部分对此进行讨论。

1.6 最后的想法

现在,我们应该对2021年数据科学所处的位置,以及如何走到现在有了一个很好的了解。第Ⅱ部分,我们将向两类不同的用户介绍一种新语言。

最后一点:Python用户称自己为Pythonista,这是一个非常“酷”的称呼!R就没有跟它等价的词,也没有真正“酷”的动物[7]形象,当用单字母语言时,这就是生活。R用户通常被称为“useR!”(可以带感叹号或不带感叹号)。确实,其官方年会被称为useR!(必须带感叹号),我们将从现在起使用这些称呼[8]

[7] python一词在英文中有“蟒蛇”之意。——编者注

[8] 本书英文原文从此开始,分别以“Pythonista”和“useR”称呼Python用户和R用户,二者都使用了英文的双关语。为了保持本书的可读性,中文版依旧保留“Python用户”和“R用户”的称呼。——编者注

图1-1总结了在本章中强调的一些主要事件,以及其他一些重要的里程碑。

图1-1 Python和R数据科学里程碑时间表

相关图书

Python极客项目编程(第2版)
Python极客项目编程(第2版)
动手学自然语言处理
动手学自然语言处理
Python财务应用编程
Python财务应用编程
Web应用安全
Web应用安全
深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
Python量子计算实践:基于Qiskit和IBM Quantum Experience平台
Python量子计算实践:基于Qiskit和IBM Quantum Experience平台

相关文章

相关课程