在PyData Seattle 2017中,Jake Vanderplas介绍了Python的发展历程以及最新动态。在这里我们把内容分成上下两篇,先给大家带来上篇--Python的发展历程。

主讲人:
Jake Vanderplas是华盛顿大学eScience研究所物理科学研究的负责人。该研究所负责跨学科项目,旨在支持科学领域在数据方面发现。Jake的研究领域包括天文学、天体物理学、机器学习以及可伸缩计算。此外,他是许多开源Python项目的维护者和频繁贡献者,包括scikit-learn、scipy、altair等。

CDA字幕组该讲座视频进行了汉化,附有中文字幕的视频如下:
   


针对不方面开视频的小伙伴,CDA字幕组也贴心的整理了文字版本,如下:

Python究竟是怎样成为了数据科学的发动机?考虑到一开始它的初衷并非如此。

Python的发展历程

我想回顾一下Python的初衷和早期发展情况。




1990s: 脚本时代

在上世纪90年代,我认为Python以及数据科学处于脚本时代。这时的座右铭为"Python是Bash的替代品”。

没有人愿意用Bash编程,那么让我们换成用Python吧。这就是我们90年代的情况。

当时有个从事科学领域的人,名叫David Beasley。你可能通过《Python Cookbook》一书熟知他。在90年代他在一个研究实验室工作,他写了一篇关于使用Python进行科学计算的文章。在文中他说:

“科学家正在使用各种不同的工具,他们倾向于使用自行开发的软件,来实现自己的特定领域语言。或者用命令行界面将它们组合到一起。”

在本文中他提出,为什么我们不使用Python把这些都组合到一起呢?

他提出一个他已进行了4年的案例研究,当中他把Python作为胶水,把许多其他的工具都粘到了一起。他写这个库在当时影响力非常大,SWIG(simplified wrapper and interface generator)。这能够解析整个Fortran或C代码,为你生成一个Python接口。因此为了驱动代码,你不必再去编写Fortran和C语言。

许多早期的SciPy等工具都是建立在SWI上的,我对scikit-learn的第一个贡献是用SWIG加上C++代码。之后我们不再用SWIG而转为Cython,但这是另一回事了。

2000s: SciPy时代

之后是2000年,我认为2000年代是SciPy时代。

这时的座右铭是,Python是MATLAB替代品。



我看到观众中有些点头赞同,当中有很多原因。如果看到2000年代早期有影响力并且发展SciPy堆栈的人群,可以在他们身上发现一些共同点。

例如John Hunter是Matplotlib的创始人,在2012年他去世前的几周,他发表了很棒的SciPy演讲。

当中他谈到了Pre-Python,他有各种工作进程的大杂烩Perl脚本C++。他编写了MATLAB之后他厌倦了MATLAB,开始把东西加载到GnuPlot上。这启发他编写了Matplotlib,这基本上是用Python编写的MATLAB替代品。

同样还有Travis Oliphant。他创建了continuum,在这之前他编写了Numpy和SciPy项目。

他说“在Python之前,我用过Perl。然后是MATLAB、shell、scrip、Fortran以及C++库等。当我发现Python时,我真的很喜欢这个语言。但这个语言是萌芽阶段 缺少很多库。 我认为我可以通过在Python中,连接低等级的库和高等级的usage。从而在世界中献出自己的一份力量。”这启发了SciPy,SciPy取代了MATLAB、Fortran、shell、scrip。

同样的如果你熟悉IPython项目、Jupyter项目,那你肯定知道Fernando Perez,他创建了IPython。他也有类似五花八门的工具,C、C++、Unix(awk/sed/sh)Perl、IDL、Mathematica。

想到Python出现之前的科学就很可怕。接着Fernando创建了IPython项目,他想在Python中做类似IDL或类似Mathematica,以便他能够用一个简单的工具代替这所有。

在21世纪初出现了各种工具,相同的目标是想取代MATLAB,取代所有组合的包。若看到早期的代码,会发现它们都包括可视化、计算以及壳的内容。如果看一下Matplotlib,你仍然可以导入MATLAB的子模块。类似计算周期等部分在MATLAB、Matplotlib中仍然有计算,尽管现在很多已经被移除。

如今我们熟知的库如Matplotlib、SciPy、IPython,它们的目标很清晰。社区一直在演变

我认为在SciPy时代的关键会议是SciPy大会。SciPy大会驱动了很多创新力,从2002年一直到如今。在场我认识的几个人将出席下周的SciPy在奥斯汀的会议,这是非常有意思的会议,如果有机会的话我建议你们参加。

2010s: PyData时代

在20世纪90年代脚本时代和SciPy时代之后,我认为2010年代是PyData时代。这时的座右铭应为"Python是R语言的替代品”。

我认为PyData社区在这点上做的很好。R语言还是有些做的很好且无法超越的地方。我认为其中一个常规数据统计,还有一个是可视化。有些人在致力于解决这些问题。

我认为PyData时代的代表是Wes McKinney,以及他的pandas。还有他的书《利用Python进行数据分析》。

在书的序言中他这样说道“还没有任何一种工具能够很好的处理我的一些需求。例如:具有标记轴的数据结构;综合时间序列功能;算术运算和减少;缺少数据的灵活移交;合并和其他相关操作,我希望最好能够在一种语言中完成这一切。”

且能够符合软件开发的一般用途,这启发了pandas的诞生。可以说若没有pandas库,没有Wes,今天我们不可能坐在这里。在2009〜2011年的时候,他辞掉了本来的工作,吃了2年拉面,这样他就可以天天编写pandas。如果你有天碰到了Wes,请感谢他。因为他真的对我们的社区做出了重大贡献。

还有许多重要的软件这个时期问世。

pandas第一个重大的发布是在2011年左右。

scikit-learn在07年有发布一个早期的指南,但主要的scikit-learn发布于2009年或201年。

Conda的packaging发布于2012年,这真的改变了我使用Python的方式,改变了人们做事的方式。

以及2012年的IPython项目,后来更名为Jupyter。Jupyter项目真正推动了我们处理代码的方式,特别是在这个社区中。

当然当中关键的会议是PyData。

2012年,为期一天的PyData研讨会由谷歌举办,地点位于山景城。这是我影响深刻的一次会议。这次会议上我第一次公开发表了关于Python的演讲,当中我对scikit-learn进行了1小时的讲解。从那之后我就着迷了,想尽可能多的参加这个会议。

PyData遍布世界各地,这一系列会议促进了数据科学的发展。数据科学与数据计算是不同的,之前SciPy时代则是围绕这点的。当然以上这些时代都是同时存在的。有人使用Python写脚本,有人使用SciPy工具,有人使用PyData。

人们热衷于使用Python。因为Python的直观性、美感、哲学性以及可读性。Python从其他语言中得到很多转换,因为它编写起来很有趣。因此人们做的就是结合其他工具,其他社区中习得的内容、编写相应的Python包。

Wes专门写了pandas,因为他想做到R语言对数据框的操作。John Hunter专门写了Matplotlib,因为他想用MATLAB的方式进行绘制,但不必使用MATLAB许可证。

Python真的很擅长从其他工具其他领域摄取知识,并把它们转换到自己的空间内,然后进行运行。

我们还开发了很多自己的东西,例如scikit-learn。在任何语言中,这都是考虑机器学习的首要方式。至少是如何连接机器学习,如何进行机器学习API。我认为没有其他语言比scikit-learn更简洁,更深思熟虑的。

但我们必须认识到在整个过程中,Python并不是数据科学语言。

Python是通用语言,我认为Python的通用本质在于其优势。你可以把它Python想象成瑞士军刀。

使用Python你可以做各种不同的事情。比如你可以做网页编程,可以进行Django,可以做后端,也可以做前端。

但多年来越来越多的人都在用Python,这把瑞士军刀变得复杂起来了。这么多的工具,我们需要选择用哪个记住顺序,从而你能找到你想要的。这里的优势在于Python存在巨大的能力空间,但缺点在于从哪儿下手。

我想强调的是对于刚接触Python的人群,他们说"我想马上开始学习Python”。但是他们会发现,宇宙是如此巨大,有那么多的包,有许多需要学的东西。还有许多人们传递的未记录下来的知识,很难进入其中。

为什么说 Python 是数据科学的发动机(二)工具篇(附视频中字)

毋庸置疑,Python是用于数据分析的最佳编程语言,因为它的库在存储、操作和获取数据方面有出众的能力。

在PyData Seattle 2017中,Jake Vanderplas介绍了Python的发展历程以及最新动态。在这里我们把内容分成上下两篇,在上篇给大家带来了Python的发展历程( 为什么说Python是数据科学的发动机(一)发展历程 )。下篇将给大家介绍Python中的一些重要工具。

主讲人:

Jake Vanderplas是华盛顿大学eScience研究所物理科学研究的负责人。该研究所负责跨学科项目,旨在支持科学领域在数据方面发现。Jake的研究领域包括天文学、天体物理学、机器学习以及可伸缩计算。此外,他是许多开源Python项目的维护者和频繁贡献者,包括scikit-learn、scipy、altair等。

CDA字幕组该讲座视频进行了汉化,附有中文字幕的视频如下:

针对不方面开视频的小伙伴,CDA字幕组也贴心的整理了文字版本,如下:

(文末有彩蛋! )

下面我想快速浏览一下PyData社区的发展过程。

当中有些工具可能你使用过。如果你刚接触这个社区,你可能没用过这些工具。我将简单的总结一下我认为在PyData中,如今十分重要的工具。

安装

安装方面我推荐使用Conda。

基本上Conda是一个跨平台的软件包管理系统,类似于apt-get、yum、homebrew或者MAC端口。但工作方式类似在Linux、OSX或Windows上运行。你能够安装类似的软件包,只需轻轻一点或者一个命令行参数。

它有两种形式,一个是只包括安装程序的Mini Conda。另一个是Conda,包括安装程序以及数百个包。

我推荐MiniConda,更容易上手,下载下来为25M。首先进行安装,然后通过命令行运行,也可以通过图形用户界面运行。之后Python与Conda连接,你已经完全从自己系统的Python,或任何其他Python安装中脱离出来。可以运行如Conda安装等命令,只需输入你需要包的名字。

这是一个很棒的系统。在2012年之前Conda还未问世,那时使用Python要痛苦的多。特别是当你试图让在座的人,从各自的笔记本电脑中拿出工具。他们使用的操作系统各不相同,有Mac、OS X和Windows系统。很庆幸我们不处在那个环境中了,那是黑暗的时代。

Conda另一个惊人之处是可以创建环境,可以在沙箱环境中尝试新的东西。如果你执行创建-n,指名字。我将这个命名为py2.7,这表明我需要的Python版本。一旦激活该环境,你将有一个全新的可执行的Python,以及全新的一组核心包可执行。

我常常使用,在我的计算机上大概有70或80个类似项目。每当我开发一个scikit-learn包,我会切换到scikit-learn开发,然后在master中安装。接着在那儿进行开发工作。一旦让我需要运行代码进行工作,我会切换回Python3.6环境。你可以在不同Python版本中来回无缝切换,Conda是很强大的。

如果你知道pip的话,一定听过pip vs Conda的说法。pip是另一个安装Python包的程序,它连接到Python包索引。两者的区别在于,pip仅用于在任何环境中安装Python包;而Conda可以安装任何包,你可以安装node或R语言包,你可以安装任何东西,但只能在Conda环境中安装。

编程环境

关于编程环境,安装好了Conda之后, 你可以再安装Jupyter和Jupyter Notebook。这个是很强大的,于2012年推出。

我第一次听说该Notebook是在2012年的PyData会议上,当时我在讲解scikit-learn。我演讲的时FernandoPerez在观众席中,他把我的整个演讲输入到Notebook中。演讲结束后他向我走过来说”嗨,我是Fernando。你知道Notebook吗?"之后他给了我演讲的IPython Notebook版本,从此之后我每次演讲都会录入Notebook,这太棒了。

你能够做的是运行Jupyter Notebook,然后得到基于Web的平台,类似一个通过浏览器访问的系统文件。你创建一个新的Notebook,然后获得一个可以运行代码接口。在这儿你可以尝试不同的东西,可以嵌入图形内联,可以利用Notebook做很多事情。

最近我出版了《Python的数据科学手册》。整个是用Jupyter Notebook的形式编写的,这几乎相当于一个发布平台。如果你不想买书的话,可以去我的github主页,所有的Notebook都在那儿。如果为我孩子的大学基金尽一份力,你也可以去买书。(全场笑)

有一个JupyterLab项目,类似JupyterNotebook的迭代。这相当于把Notebook带到未来,当中包括完整的IDE文本编辑器和文件浏览器。我很期待JupyterLab给我们社区带来的成果。这几个月,我所有的工作都会在JupyterLab中进行,这是一个非常酷的项目。

数值计算

什么是数值计算(numerical computation)?

如果你想快速的进行numerical和Python,一切都取决于NumPy。

如果你使用pandas使用scikit-learn,如果使用任何这些库,它们往往是在Numpy的基础上。你可以安装Numpy,在Numpy中可以创建数组,可以有效的进行互动。因此你能够创建数组,并进行元素操作。

如果进行X乘以2,实际上该数组上的每个元素均要乘以2。如果把一个Python列表乘以2,那么整个列表的长度都乘以2,然后加上所有多余的元素。

Python的初衷不是用来进行数据科学的,而是出于其他目的。因此我们在Python上添加了很多数据科学工具。

你可以处理线性代数,取随机矩阵的奇异值分解,还可以进行随机数生成,这边还有一些正态随机数,我们还可以求快速傅立叶变换。

这种类型的核心数值运算很多都是在Numpy中实现的,而且完成的很高效。

其中的一个例子是,如果你之前使用如 C、Fortran或者C#等编译式语言,你可能会习惯手动完成。如果要把数组的数字乘以2,再加1,你可能会写一个这样的循环,如果你写C代码的话你会这么做。

但在Python中这非常慢,对1千万个值进行基础算术需要6秒。这归结与很多原因,基本原因在于Python是解释和动态型的。

但如果使用Numpy,你可以使其更为简洁。从而完成的更快,只需60毫秒而不是6秒。原理在于Numpy数组了解值的类型,因此它推动这些循环分解成编译代码,当中类型推断不需要进行多次,而只需进行一次。

因此每次你想进行快速numerical和Python,考虑一下向量化。如果在大型数据数组上编写循环,存在更快的方法来实现代码。

标注数据

我们说过了pandas是如何开创了PyData时代,pandas库基本上在Python上实现了数据框和关系运算符。

这类似于Numpy的数组,在这些密集数组你有类型数据,但数据框具有标记列和标记指数。你可以用Python的索引语法在数据框中添加列,你还可以用无缝的方式从磁盘中加载数据,从而自动推断所有列的类型。如果你在磁盘上有数据 想把数据载入Python空间,那么pandas是不二之选。

Numpy中还有loadtxt以及genfromtxt,有人用过genfromtxt吗?那太可怕了,你绝对不会想用。pandas基本上可以取代这些。

你还可以进行有趣的SQL操作,比如分组操作,着很快速。在这儿我们有许多ID,还有许多值。我想对ID进行分组,取相同ID对相同ID的值进行求和。你会得到一个数据框,获得想要的答案。这些你无法在SciPy时代的工具中实现,这是pandas提供的是2010年的新事物,所以是pandas是很棒的。

可视化领域

如果在Python中看可视化,你可能会想到matplotlib。

这是因为matplotlib久经考验,从2002年人们就在用它。使用哈勃太空望远镜的空间望远镜科学研究所,在2004、2005年在当中投入了大量资源。你可以用它做任何事情。

看起来很像MATLAB,如果用过你可能很熟悉,如今很多人把它视为bug,当时它被创造出来绝对是一个特征。

SciPy生态系统得以发展的原因在于,它能够在MATLAB和Python之间无缝切换。人们很容易出于API或其他原因抨击matplotlib。但是我们应该从历史的角度来看,如果没有matplotlib的API,我们是不会走到今天的。

如果你想要做一些更复杂的事情,那我会越过matplotlib。如果想做数据框的数据可视化,pandas有很好的绘图程序。你可以生成matplotlib绘图,但是不需要matplotlib API。取一个数据框,比如data.plot.scatter,制定想进行散点的两个列名,则能够得出你想要的图,而不需要调整轴的标签。

Seaborn是一个类似的包,这是用于统计可视化的包。你可以做很复杂的图和一些代码,这是值得一试的库。

除了matplotlib还有Bokeh。它有很多互动功能,可以做很多不同类型的图。这里不做过多的介绍。

类似Bokeh的还有Plotly。它在浏览器中呈现图,能够进行互动的可视化。

对于R语言使用者来说,我们正处于Python取代R的时代。R语言中超越Python的是ggplot库。我认为目前在Python中没有什么能超越这个,有个类似的是plotnie库。基本上是给你ggplot的API从而得出matplotlib的图。如果你是ggplot的粉,而且想继续用Python,这值得一试。虽然这还不是很成熟和完备,当这很有前景。

还有Altair库,在这里我不会介绍。可以在我其他关于可视化的演讲中看到。

在Python中进行可视化很复杂,这个幻灯片来自几周前我在PyCon上的演讲。

当中的每个节点都是Python中用于可视化的库。如果你想看我花40分钟讲这个图,可以去YouTube看相关视频。

数值算法

SciPy是用于这方面的包。一开始SciPy是net-lib的添加,net-lib是进行整合和插值优化的一系列Fortran库,而且非常迅速高效。因此SciPy包括许多不同的子模块,基本上Fortran操作的包装、运行迅速。但基本上任何数值运算SciPy都可以完成。

这里有一个例子,我们在导入特殊的库,这里是特殊的函数,并且导入优化的库。我们可以看到第一个贝塞尔函数的最小值,这就是SciPy做的。

特别是如果你是一个物理学家SciPy是很出色的,它拥有所有需要的程序。

如果你想进行机器学习,scikit-learn值得一提。

由于其API,这是个很棒的库。想象你有一些2D数据,需要放入机器学习模型中。机器学习模型是线性拟合的一种高大上的方式。

如果你使用机器学习驾驶汽车,你手上有庞大的参数空间,需要拟合给数据的直线从而避免撞车。

如果想通过scikit-learn把数据拟合到直线上,你可以使用该模型API。你创建一个模型拟合到数据,然后在新的数据和图上预测模型。相当于这个数据的随机森林。

如果你想使用不同模型,只需改变模型的实现。所以这里,我从一个随机森林换成了支持向量机的回归元。你只需要改变上面的模型定义,其余部分的代码保持不变,这是scikit-learn的优点。

给你一个单一的API从而探索重要的机器学习算法,而不必写一大堆的样板。这是scikit-learn的优势所在。我们实际上写了关于scikit-learn API的论文。

如果你想用parallel的话,有一个问世一两年的库称为Dask。

Dask很有意思,如果你使用Numpy的话,这是你会使用的工具。取一个数组a,乘以4,记住把所有的元素乘以4。取最小值,然后输出。

Dask所做的是,能够让你做相同的事情,但不需进行实际的计算。保存了定义计算的任务图。当你将数组乘以4时,它会保存起来构建出类似这样的图。

因此在底部我们得到数据和数组,在五个不同的核心 我们将数据乘以4,取当中的最小值。当然最小值中的最小值,即为最小的。Dask知道这些操作和聚合的关联性,最后你得到该任务图,但没有进行任何计算。

然后你可以把任务图转换成任何内容,可能是你计算机上的在多个内核,可能是簇上的多个机器上,可能亚马逊云或者Azure云上的内容,最后你可以进行计算。

在数据科学领域使用Dask可以实现很多有趣的内容。可以把Dask放到scikit-learn的后端,你可以关注一下,这很棒,

如果你想优化代码的话,有一个有趣的项目问世五六年了,称为Numba。

将Python代码编译成LLVM字节码,运行的非常快而且是真正无缝隙的。当你在写一个算法,当中有for循环。我说过for循环不太好,你应该尽可能用Numpy。但有一些算法没办法简单的转换矢量化代码。

如果有这样的代码,每个人都使用斐波拉契。这需要2.7毫秒获得1万个斐波拉契数。只需将数据添加到即时编译器,然后给代码提供500倍的加速。实际上它经过并分析所有的Python代码,迅速的编译成LLVM。之后你需要该函数可以获取它的快速版本。

在此基础上有很多很棒的项目,比如datashader项目。这是一个连接Bokeh的可视化项目,在后端采用Numba,能够对数十亿点进行快速的可视化。

我们来看看这些演示,datashader对十亿个出租车上客情况进行可视化。实时进行滚动、缩放、以及渲染

这都基于后端的Numba。

另一种优化代码的方式是Cython。

Cython不太一样,它是Python的超集合。它能让你将Python编译的到快速C代码中。

这里有个例子,我们拿出相同的fib函数2.73毫秒。如果我们在Cython中运行,当中的%可以在Jupyter notebook中进行。你会得到约10%的加速,这稍微快一些。

它做的是把Python代码编译到C语言代码中,然后运行C语言代码,而不是Python代码。

但要真正获得Cython的优势,你需要做的是增加些类型。看看这里的区别,我所做的是顶部为int n 比起a,b=0,1,我输入的是cdef int a=0 b=1。现在编译器知道这些是整数,它会优化这些代码。然后仅通过在Cython中运行该代码,加之一些格外的语法糖。你会得到500倍的加速。

Cython是一个很出色的项目,如果看到NumPy、SciPy、pandas、scikit-learn、astropy、SymPy的源代码。基本上PyData生态系统中的所有numerical代码,

其核心均使用Cython。所有这些工具都是建立Cython之上的。

这就是你如何在这些库中获得快速numerix,这就是你如何包装其他的C语言库。

比如Lib、SVM和scikit-learn,你使用Cython连接这些。如果你使用任何超出基本Python的部分,试试Cython,因为这很有意思。

这就是我对所有包的介绍,希望能有所帮助。我试图在整个幻灯片加入引用,如果你想深入了解的话,大部分的包都有很棒的网站,并附有相关教程。

结语

在使用Python时请记住,Python并不是数据科学语言。

有时候这会导致事情变得复杂,有时这意味着存在完成任务的许多不同方法。因为每个人都在这个他们喜爱的语言上创建自己的API,但我认为这也是最大的优势。因为我们可以从很多不同的社区中吸取优势,从而让我们可以使用Python完成众多超越数据,数据科学的内容。

回顾这些Python的不同发展阶段是很有意思的,但更有意思的是在于未来,2020年又会出现什么呢?

虽然在数据时代中,Python的独立性仍存在很多挑战。但我很确信,在未来的10年内Python还是很有前景的。

因为社区中,人们与时俱进的把其他地方学到的内容

带入到Python中。因此我认为直到2029年我们还会在使用Python,我们走着瞧吧。

非常感谢大家!


共同关注 数据分析,是技术,也是艺术。

加关注
喜欢 | 1

登陆后发表文章

  • 0条回应给“为什么说 Python 是数据科学的发动机(发展历程(附视频中字)”的评论