Python与R语言联合应用的实现*

2017-06-05 14:20南方医科大学公共卫生学院生物统计学系510515
中国卫生统计 2017年2期
关键词:调用运算对象

南方医科大学公共卫生学院 生物统计学系(510515)

平凯珂 陈平雁△

·方法介绍·

Python与R语言联合应用的实现*

南方医科大学公共卫生学院 生物统计学系(510515)

平凯珂 陈平雁△

R语言作为主流趋势的统计软件正在发挥越来越重要的作用。而Python语言作为一种面向对象的高级编程语言[1],易学易用,特别是近年来以Anaconda为首的Python发行版整合了大量的数据科学运算工具,使得Python能在数据处理领域发挥更大的作用。在实际应用中,一方面,R语言统计分析功能强大,但运算速度较慢且内存管理效率不高[2],导致其在大型项目的分析与管理方面处于劣势;另一方面,虽然Python有完善的内存优化系统,且可以方便地完成数据获取、软件接口对接和数据库交换等数据管理工作,但在数据分析方面又需借助R语言得以实现。鉴于此,本研究将结合两者的优势,介绍Python对R语言的调用方法,并通过实例展示其可行性。

Python与R语言合并应用方法介绍

Python对R语言的调用使用的是Python中的一个程序库rpy2[3],它可以实现Python对R语言对象、函数、方法的读取与调用。当操作系统中安装了Python 2.7和R 3.0以上版本时,在命令行中运行pip install rpy2即可安装该程序库[4]。

rpy2提供了两种调用方式,高级接口(high-level interface)和低级接口(low-level interface),高级接口是对R语言的一个高级封装,它将R语言中常见的一些函数和对象封装成了原生Python对象或类,使用户可以像原生语言一样在Python中使用R语言。

1.高级接口

在Python中引入rpy2.robjects模块即可使用该高级接口,例如:

此后rpy2.robjects.r中封装好的R语言对象就可以简写成robjects.r了。下面我们以两样本率比较的χ2检验为例,介绍Python调用R语言的高级接口使用方法。数据如表1所示。

首先我们在Python中创建R语言的矩阵对象。

表1 两组降低颅内压有效率的比较[5]

In[2]:data=robjects.IntVector([99,75,5,21])

test_data=robjects.r.matrix(data,nrow=2,ncol=2)

print test_data

Out[2]:[,1][,2]

[1,]99 5

[2,]75 21

可见,使用rpy2.robjects.IntVector将Python中的list列表元素转换成了R语言中常用的数据结构vector,即向量,这等同于在R语言中使用data=c(99,75,5,21)创建了一个向量。同样,rpy2.robjects.r中已经集成了R语言里matrix这个创建矩阵的函数,我们直接在Python中将创建好的向量作为其参数,定义行数和列数后即可在Python中直接使用R语言中的矩阵对象。类似的,可以使用rpy2.robject.DataFrame来定义一个R语言中的数据框。

In[3]:chisq_test=robjects.r[′chisq.test′]

test_result=chisq_test(test_data,correct=False)

print(test_result)

Out[3]:

Pearson′s Chi-squared test

data:structure(c(99L,75L,5L,21L),.Dim=c(2L,2L))

X-squared=12.857,df=1,p-value=0.0003362

在rpy2.robjects.r[′r_code′]这一句中,若将r_code替换成R语言中的函数名或变量名,并将其赋值给Python变量,就可以创建对应函数或变量的一个Python对象,这里我们把R语言中进行χ2检验的chisq.test函数赋值到变量chisq_test中创建该函数对象,此后只要将chisq_test当做普通的Python函数使用即可,函数的参数设置与R语言完全一致。创建成功后,我们只要将上一步创建的数据放入chisq_test函数作为参数,就可以得到对应的Pearsonχ2检验结果。

由此可见,使用rpy2在Python中调用R语言的统计函数是一个非常简单的过程,且程序具有较强的可读性。

2.低级接口

R语言存在底层基础运算(如加法、减法、乘方、开方、循环等运算)速度较慢的劣势,这主要是因为R语言是一种解释型语言,每一句代码都会被处理器临时编译并下达指令再计算[2]。但是其在矩阵运算的速度上却有着优势,特别是其中的很多统计运算包,直接从C语言层面实现了很多复杂统计方法的运算,有时能达到Python中numpy、scipy这些数值运算库所达不到的运行效率。

rpy2的低级接口主要应用于高级接口没有提供封装,或对运算性能有特殊要求的情况。

在Python中引入rpy2.rinterface模块即可使用该低级接口,例如:

In[4]:import rpy2.rinterface as rinterface

rinterface.initr()

这里注意一定要使用initr()函数来初始化R语言,才可以正确地使用后续接口,还要注意这句代码只用运行一次,以免出现错误。

低级接口的调用方法与高级接口类似,不同之处在于低级接口可以访问当前R语言运行环境中的所有R语言对象,这一过程主要是通过rpy2.rinterface.globalenv类中的get函数来完成,这个函数会在Python中创建一个指向R语言环境的sexp指针对象。我们同样以两样本率比较的χ2检验为例来说明这一过程,数据参见表1。

In[5]:matrix=rinterface.globalenv.get(“matrix”)

data=rinterface.IntSexpVector([99,75,5,21])

test_data=matrix(data,nrow=2,ncol=2)

print test_data

Out[5]:

8/R:0x00000000071CFC30>

在这里我们可以看到,低级接口中无法直接将R语言的结果用print函数打印出来,因为储存在Python中的对象实际是指向了内存地址,要访问具体的数据则需要访问该变量的各个下标,比如进行Pearsonχ2检验后使用下标表示统计量、自由度、P值等检验结果。

In[6]:chisq_test=rinterface.globalenv.get(′chisq.test′)

test_result=chisq_test(test_data,correct=False)

print(“Method:%s Chi-squared=%s,df=%s,p-value=%s”%

(test_result[3][0],test_result[0][0],test_result[1][0],test_result[2][0]))

Out[6]:Method:Pearson′s Chi-squared test

Chi-squared=12.8570699857,df=1,

p-value=0.000336206596885

需注意,与R语言不同,Python中数组的下标是从0开始的。此外,储存在该对象中的数据本质上是一个R语言中的list,储存的顺序和R语言中默认顺序是一样的,所以可以按照原先R语言函数输出的顺序方便地在Python中获取。

实 例

下面以实例来说明如何利用Python+R来完成数据获取及其后续统计分析与绘图的任务。

1.实例背景

利用weather underground网提供的气象数据API接口,获取广州市近五年的每日气温数据(从2011年11月1日至2016年11月1日),再根据此数据利用空间状态模型预测未来的每日平均气温,最后利用R语言的ggplot2包进行时间序列作图。

2.数据获取

使用Python中的urllib2库和bs4库中的BeautifulSoup模块来抓取网页数据,其中urllib2是Python的一个获取URLs的组件,它通过向指定的URL发出请求来获取数据,此处直接使用GET的方式请求该网站的气象数据接口,就可以获取到指定城市在指定日期的气象数据。而BeautifulSoup模块提供了一些专用于处理导航、搜索、修改分析树的函数,通过解析文档为用户提供需要抓取的数据,我们利用此模块可以自由地根据需要提取出urllib2库中已经获取的气象数据,如广州市每日的气温、风力、风向、湿度、日落日出时间等。如果我们仅需要气温数据,可以再利用BeautifulSoup模块单独从urllib2库中提取。

3.数据整理

由于获取到的数据为华氏度,我们需要将数据转换为摄氏度。在Python中需要使用循环语句来逐个转换,而在R语言中我们只需要利用它的矩阵特性,在data.frame数据框中只要一句代码即可批量转换。如前所述,我们使用rpy2.robject.DataFrame来定义一个R语言中的数据框,然后完成数据的转换工作。

4.数据分析

我们使用R语言中的forecast包来进行时间序列数据的生成与预测。首先利用msts函数来创建带有季节效应的时间序列数据,这里为了简便起见,我们直接设定季节效应期为1年,把seasonal.periods参数设置成365.25即可。然后我们将该数据使用tbats函数来进行状态空间模型中的TBATS模型建模。最后利用forecast函数来生成随后的预测数据。

5.可视化作图

分析完成之后,我们可以利用R语言的ggplot2包来进行数据可视化作图,值得一提的是,rpy2中已经封装了R语言中整个ggplot2包,只要在Python中直接引入rpy2.robjects.lib.ggplot2模块,即可在Python中直接使用ggplot2的函数进行作图。

绘制的图形如图1所示,此处我们仅绘制了2016年7月1日至2017年7月1日的数据,其中2016年11月1日之后的为预测数据。

图1 在Python中使用R语言的ggplot2包进行绘图

小 结

本文介绍了Python对R语言的调用方法,并以实例展现了“Python+R”的模式用作数据获取和统计运算的可行性。整个过程中结合了Python和R语言各自的优势,两种语言各司其职,在数据获取和统计运算方面都有着良好表现。该模式现在也已经开始在一些实际研究项目中得到应用,例如Vandenbulcke等[6]在一个饮酒可能是肝癌的危险因素的前瞻性研究中,利用该模式完成了数据管理和统计分析的工作。“Python+R”的工作模式可有效结合二者的优势,既能较好地完成项目管理和数据管理工作,又能利用R语言完成复杂的统计分析,有良好的应用前景。

[1]赫特兰,司维,曾军崴,等.Python基础教程.北京:人民邮电出版社,2010.

[2]Aloysius L,William T著,唐李洋译.R高性能编程.电子工业出版社,2015.

[3]Laurent G.rpy2-R in Python.http://rpy2.bitbucket.org/.

[4]Python Software Foundation.PyPI-the Python Package Index.https://pypi.python.org/pypi.

[5]孙振球,徐勇勇.医学统计学.北京:人民卫生出版社,2014.

[6]Vandenbulcke H,Moreno C,Colle I,et al.Alcohol intake increases the risk of HCC in hepatitis C virus-related compensated cirrhosis:A prospective study.J Hepatol,2016,65(3):543-551

(责任编辑:张 悦)

*广东大学生科技创新培育专项资金资助(pdjh2016a0091)

△通信作者

猜你喜欢
调用运算对象
重视运算与推理,解决数列求和题
涉税刑事诉讼中的举证责任——以纳税人举证责任为考察对象
判断电压表测量对象有妙招
有趣的运算
核电项目物项调用管理的应用研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
攻略对象的心思好难猜
“整式的乘法与因式分解”知识归纳
区间对象族的可镇定性分析
利用RFC技术实现SAP系统接口通信