为什么说 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,包括安装程序以及数百个包

我推荐Mini Conda,更容易上手,下载下来为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之后, 你可以再安装JupyterJupyter Notebook。这个是很强大的,于2012年推出。

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

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

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

有一个JupyterLab项目,类似Jupyter Notebook的迭代。这相当于把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,我们走着瞧吧。

原文发布于微信公众号 - CDA数据分析师(cdacdacda)

原文发表时间:2017-10-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Crossin的编程教室

【每周一坑】图像的指纹:数字水印 + 【解答】鸡兔同笼

曾经有过这样的新闻:某公司的员工将内网论坛上的言论截屏发布到互联网上,引发了热议。于是公司通过截图定位到了员工的身份,将其开除。

1942
来自专栏前端布道

JavaScript设计模式与开发实践 - 策略模式

引言 本文摘自《JavaScript设计模式与开发实践》 在现实中,很多时候也有多种途径到达同一个目的地。比如我们要去某个地方旅游,可以根据具体的实际情况来选择...

3888
来自专栏Aloys的开发之路

OOAD与UML笔记

UML基础介绍 1.UML的定义 统一建模语言(UML)是一种图形化的语言,它可以帮助我们在OOAD过程中标识元素、构建模块、分析过程并可通过文档说明系统中的重...

1998
来自专栏宏伦工作室

基于维基百科的中文词语相关度计算

1953
来自专栏点滴积累

geotrellis使用(四十二)将 Shp 文件转为 GeoJson

原因很多,最重要的原因是我转行了。是的,我离开了开发岗位,走向了开发的天敌-产品经理。虽然名义上是产品经理,但是干的事情也很杂,除了不写代码,其他的都干,经常还...

1922
来自专栏三丰SanFeng

基于Linux整形时间的常用计算思路

上一次分享了Linux时间时区详解与常用时间函数,相信大家对Linux常见时间函数的使用也有了一定的了解,在工作中遇到类似获取时间等需求的时候也一定能很好的处理...

21810
来自专栏数据结构与算法

洛谷P2439 [SDOI2005]阶梯教室设备利用(带权区间覆盖)

1064
来自专栏数据科学与人工智能

【陆勤践行】Python和数据科学的起步指南

Python拥有着极其丰富且稳定的数据科学工具环境。遗憾的是,对不了解的人来说这个环境犹如丛林一般(cue snake joke)。在这篇文章中,我会一步一步指...

25210
来自专栏数据结构与算法

P1064 金明的预算方案

题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布...

3678
来自专栏封碎

两个最容易被人忽略的基本代码优化技术 博客分类: 经典文章转载 算法Android编程D语言工作

      本文转载自http://sd.csdn.net/a/20100921/279732.html

903

扫码关注云+社区

领取腾讯云代金券