如果您用R语言工作,并且对使用Python感到好奇,但您却不太了解如何开始,这篇博文就很适合你。我遇到了很多想要尝试Python的R用户,但是他们却没有时间来确定他们需要了解哪些软件包以及使用哪种编码环境。
在本文中,我将介绍在Python中建立统计计算所需的所有基本软件包,并尽可能直接与R语言进行比较。
在本文的末尾,您应该已经具备了一个编程环境。为此,我将跳过许多Python语言特性和包,您稍后可能会发现这些特性和包很有用,不过在相关的地方,我将链接到更广泛的文档。我希望这篇文章能提供足够的基础,让您知道如何在这个基础上构建更高级的用例。
我假设您熟悉R语言、熟悉命令行,但不熟悉Python。
安装Python(通过Anaconda)
安装Python最简单的方法是安装Anaconda。就我们的目的而言,您可以将Anaconda视为Python的容器。特别是,它包括numpy,scipy,jupyter,以及许多其他有用的软件包,其中一些将在稍后使用介绍。
要安装anaconda,请访问其下载页面并按照操作系统的说明进行操作。它们的安装包下载需要一段时间才能完成,运行也需要一段时间(因为它会下载所有相关的软件包)。在最后时刻,它会询问您:
一定要选择yes。这将会给您打开一个新的终端窗口,当您在命令行中引用python,jupyter或任何其他包含python的安装包时,都会被发送到Anaconda中去安装这些包。
在Jupyter编辑器中编写Python代码
Jupyter编辑器提供了一个令人难以置信的交互式环境来编写Python代码。无需知道太多的细节,您就可以使用jupyter编辑器运行和编辑您的python代码。它允许您对你的代码排版,并按照您的排版显示。浏览器将它们呈现为漂亮的文档,并且可以将它们导出为PDF或HTML文件。R语言中不太注意排版,这点差异还是很明显的。
开始时,请为您的Python代码创建一个新的目录。在终端中导航到该目录,然后键入jupyter notebook。这将启动一个新的jupyter编辑服务器,您可以用localhost:8888在你的机器上访问。然后,您可以在该服务器上创建一个新的文本文件。这将在您的文件系统中创建一个*.ipynb文件,它将映射到您的浏览器中显示。
要关闭jupyter服务器,请返回到您的终端并点击 Ctr-c Ctr-c。
下面是我经历所有这些步骤的GIF,并显示已创建的.ipynb文件。
最后您会注意到在浏览器中弹出连接失败的提示。那是因为我们关闭了jupyter服务器,所以没有什么可以连接的了。
现在您知道如何让一个jupyter编辑的程序运行起来。当我们看更多的帖子时,我们将学习更多jupyter编辑器的功能。
List
最基本的一种python数据结构被称为list。就像在R中一样,Python列表可以由不同类型的元素组成,只是表示一个有序的集合。
我听R族人说,您不能用Python来矢量化操作,他们可能已经从列表中尝试这样的想法得到了这个结论:
这里所做的事情是,python只是重复您的列表两次,这是对列表的乘法运算相当合理的解释。顺便提一句,R中试图将列表乘以数字的结果是:
好吧,好吧。但是我们真正关心的是将一个R中的向量乘以一个数字:
为了在Python中矢量化操作,我们必须引入numpy包。Numpy包中的“数组”大致等于R向量。
加载包
首先,快速放下。Python是一种通用的编程语言。由于这个原因,它不会自动加载很多Python用户不需要的统计库(同样,它不会加载大量的Web开发库,您可能不会每天都使用它)。这意味着我们将不得不加载软件包以获取R中默认提供的许多功能。
要在Python中加载一个包,我们使用一个import语句:
这大致相当于在R中加载一个包:
在这种情况下,有两点值得指出。首先,当您在R中加载一个包的时候,它将加载所有包到您的全局函数中。换句话说,如果您加载,例如,MASS库,然后您想调用该glm.nb函数,您可以指定该函数来自MASS空间MASS::glm.nb(...)。但是您不需要; 您也可以直接调用该函数的glm.nb(...)。
Python的处理有所不同。为了尽量减少命名冲突,您必须引用特定包中的函数和包的名字。例如,如果我们用import numpy语句加载numpy,为了获得这个array 函数,我们必须输入numpy.array(...)。
因为输入长包名称会很繁琐,所以可以用更简短的名称将包名称化。在这种情况下,通过使用import numpy as np,我们告诉Python,每当我们键入np,我们其实是指numpy,所以我们可以调用numpy的数组函数np.array(...)。
我将在这篇文章中引用的所有软件包的别名,这些别名是社区长期以来已经公认了的别名,我将在这篇文章中使用它们。
Numpy数组(就像R向量)
现在我们已经加载了这个numpy包,我们可以创建numpy数组。在大多数情况下,这些行为与R向量很相似。
为了构建一个简单的numpy数组,我们可以传递一个列表给numpy的数组函数:
让我们来看看numpy数组像R矢量一样的情况:
所以,一般来说,当您认为您需要一个R向量时,就用numpy的数组。
R中的许多数值函数都可以在numpy中找到。所以要取一个numpy数组的平均数,我们可以使用numpy的mean函数。
样本方差,标准偏差,计算协方差等也是如此。如果您需要做任何事情来计算数组中的值,只需在谷歌搜索中输入“用numpy怎么做X”。
另外,这个指导R用户手册的numpy似乎涵盖了更多的内容。
抛开Jupyter
回到您的jupyter编辑器尝试一下。像以前一样启动jupyter编辑服务器jupyter notebook,并开始运行代码。
您可以将上面的Python代码复制到编辑器的第一个单元格中,然后点击 Shift+Enter运行该代码段。我将在下面用GIF进行演示。
矩阵
python中的矩阵只是2维的numpy数组。我们可以通过传递numpy数组函数列表来创建一个矩阵。每个内部列表将被视为矩阵的一行。
您可以用@符号让矩阵乘以矩阵。
生成序列
生成序列的两个非常有用的numpy函数是np.linspace和np.arange。
这些都对应于R的seq函数。
linspace接受开始和结束参数,并且有一个可选参数,可以设置返回数组的长度。默认情况下,它会返回的阵列长度为50,linspace功能类似于使用seq函数,并设置参数length。
arange对应于仅使用起始点和停止点的seq,当然也可以增加一个参数by。
绘制
Python中的核心绘图库是matplotlib,我们用它来绘制一些东西,因为我们还没有读取数据,所以让我们回到numpy来生成一些数据。
我们将使用numpy的sin函数和上面的序列生成函数来绘制正弦波。几乎所有(如果不是全部的话)在基础R(sin,exp,log等)中可用的向量化函数也可以在numpy中使用。
首先,我们必须导入matplotlib。接下来,为了让图形在jupyter编辑器内联显示,我们需要输入一个特殊的符号,如下所示:
接下来,我们生成0到2π的x值,并将这些x值和x的正弦函数值绘制成我们自己的图形。
您也可以通过使用plt.scatter和直方图来轻松绘制散点图plt.hist。
如果您正在寻找一种更高级的绘图包,您可能需要去看看R的seaborn软件包。
Dataframes
Python Dataframes是在pandas包中实现的 ,它提供了将数据读入python的最简单的方法。
pandas文档提供了pandas Dataframes和R Dataframes之间大量的比较,以及如何用pandas完成与普通R包相同的事情。
为此,我们需要读取一些数据。 如您所料,pandas的read_csv函数将把一个csv文件读取到pandas Dataframes中。上述情况,我们是从URL中读取一个csv文件,当然也可以直接读取一个本地的csv文件。
我们使用来自github的数据:https://raw.githubusercontent.com/fivethirtyeight/data/master/most-common-name/new-top-firstNames.csv
我们可以用如下方法读取数据:
我们使用index_col参数是因为我们加载的数据已经在第一列有一个索引列,所以我们不希望pandas默认添加另外一个索引。
我们使用0来表示第一列而不是1的原因是,python与R不同,但与几乎所有其他编程语言一样,python是零索引的,这将会适用所有你要使用索引选择数据的时候。
很好,现在我们有数据了。假设我们只想要超过0.5%的人口的名字。对数据进行子集化的一种方法是创建掩码,就像在R中的做法那样。
这里,data["newPerct2013"] > .005表达式是创建一个True和False值的数组,然后我们使用它来只选择该数组中True值的那些行。
然而,在pandas中查询的方法越来越多,这只是其中的一种方法:
现在我们来说说假如我们想知道一百个最受欢迎的婴儿名字占总人口数的百分比。
当然,我们可能还想对DataFrames做其它的操作,除了上面提到的以R文档外, pandas文档也相当地不错。
统计功能
Python的统计功能和R中的dnorm很相似,qnorm是scipy.stats包中的函数。
对于许多已经发行的版本,这个软件包提供了随机生成变量的方法,计算分布,任意点的pdf和log pdf,计算quatiles等等的函数。就像在R中一样,这些函数是矢量化的。
这几乎适用于任何分布,而不仅仅是正态分布。scipy中的大多数发行版本也提供了更多的方法。请参阅有关正态分布的文档。
统计模型
最后,许多内置于R中的统计模型可以在python statsmodels包中找到。我们来看一下泊松分布的线性模型。
首先,我们生成数据。
其次,我们可以看看我们生成数据的plt.plot(x, y)。
之后,我们加载statsmodels。有一点需要注意的是,与R的glm不同,statsmodels不会自动使用截距的模型。幸运的是,它提供了一个用于向设计矩阵中添加常量的实用函数,我们可以使用该矩阵来拟合具有截距的模型。
最后我们可以看看它是否合适fit.summary()。拟合对象具有许多与R的拟合对象相同的性质,包括偏差、残差,模型对设计矩阵的估计等等。它还具有predict预测新观察结果的方法。
对于来自R的人来说,statsmodels公式api提供了非常类似R的体验(包括默认拟合截距)。我建议看看这个操作指南,如何从R转换到statsmodels。
获得帮助
Jupyter编辑器提供了查看函数的文档,如果在一个函数名称后面写一个问号,然后运行。
例如:
将会弹出numpy的linspace函数的文档。
Jupyter编辑器也有补全名称的功能,所以在输入软件包名称之后,按Tab键就给出所有你可以使用的函数名称的概览。
如果不想在浏览器使用,更喜欢在命令行使用,你可以使用ipython,ipython是一个很好的python编辑工具。在这篇文章中提到的一切都可以用在它上面。
更一般地说,有大量的资源可以用来深入了解这些主题。
结论
对于那些对统计计算感兴趣的人来说,Python和R都有很多工具可供使用。我希望这篇文章有助于降低R开发者的Python入门障碍。我的目标是提供一个总体概述,哪些工具可能使R开发人员感觉更容易使用,并为探索Python系统进行统计计算提供基础。如果您有任何更好的建议,或者发现任何错误,请联系我们!
领取专属 10元无门槛券
私享最新 技术干货