首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么说 Python 是数据科学的发动机(二)工具篇(附视频中字)

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

作者头像
CDA数据分析师
发布2018-02-05 15:38:27
1.3K0
发布2018-02-05 15:38:27
举报
文章被收录于专栏:CDA数据分析师CDA数据分析师

毋庸置疑,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,我们走着瞧吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CDA数据分析师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档