Python与R语言混合编程方法的研究和应用
2018-02-27宫薇薇齐向春裴世廉
宫薇薇 齐向春 裴世廉
1(中国铁道科学研究院运输及经济研究所 北京 100081) 2(沈阳铁路局信息技术所 辽宁 沈阳 110002)
0 引 言
Python由Guido van Rossum于20世纪90年代编写,是一种面向对象的解释型语言,功能强大、简单易学、完全免费。拥有大量的算法、图库及各种基于Web的应用库,受编程初学者及试验者的广泛欢迎。特别是在大数据时代,Python兼顾算法和应用开发,是Spark三大开发语言之一,是大数据采集、处理及数据可视化的最佳开发语言。但是其在数理统计特别是预测算法方面略显不足,以Holt-Winters算法为例,Python seasonal算法包不够成熟,使用复杂,应用需要大量的编程工作。R语言是一种超强的数理统计算法库,历史悠久,拥有比Python更加成熟的算法包,使用方便,参数简洁,自身不具备Web应用开发的诸多功能,但对Java、.net、Python都具有良好的接口。
因此,本文提出通过Python调用R语言,充分利用各自的优点,发挥Python开发应用程序和粘合的功能,弥补其在算法包方面的不足。讨论本地和远程两种调用方法,并开发基于Echarts可视化数据面板的Holt-Winters算法Web应用。
1 Python对R的调用原理
Python对R的调用方法主要通过第三方库进行。如果将两种语言均安装在同一台PC上,需要在设置完环境变量的基础上,通过rpy2库进行调用。如果分别设置服务器,则需要在R语言的基础上安装RServe,在Python上安装PyRserve进行服务的远程调用。两种方法的调用流程如图1所示。
图1 Python调用R流程图
单机版通过rpy2,服务器版通过RServe/PyRserve进行调用。通过Python进行Flask Web、MySQLdb进行数据库、pySaprk进行大数据、ECharts进行数据可视化等扩展开发,调用R语言pylr、forecast提高应用平台预测算法的能力。
2 环境安装
在混编之前,首先需要对两种软件进行安装和测试。如果采用本地模式,则将两种软件安装在同一台PC机上;如果采用服务器模式则将两种软件分别运行安装。
Python:在https://www.continuum.io/downloads,下载Anaconda软件并安装。与安装Python软件相比,该软件不需要配置Python环境变量,同时已完成大量常用库的更新。cmd进入命令行,输入python(如图2所示),如果能够显示Python和Anaconda的版本号,说明安装成功。
图2 Python安装成功
在http://www.jetbrains.com/pycharm/网站,下载Pycharm软件,进行安装。在File—〉Settings—〉Project—〉Project Interpreter中选择安装目录下的Python作为编译器,如:C:UsersgwwAnaconda2python.exe。如果需要添加更多的库,点击右侧加号进行搜索添加。新建.py文件,输入print('hello'),首次运行,环境需要一段时间进行更新,完毕后执行py文件查看打印结果。
R语言:访问官网https://www.r-project.org/,点击download下载最新版本R语言软件。安装完毕后,在系统环境变量Path中添加R语言的include和bin文件夹的位置,如:
C:Program FilesRR-3.3.0include;C:Program FilesRR-3.3.0in
cmd进入命令行,输入R,如果能够显示R语言版本号,说明安装成功。打开R语言环境,输入命令install.packages安装预测软件包,设置dependencies 为TRUE完成依赖包的安装,完整书写如下:
install.packages(″forecast″, dependencies = TRUE)
在R语言环境中输入以下语句进行测试:
skirts<- scan(″http://robjhyndman.com/tsdldata/roberts/
skirts.dat″,skip=5)
skirtsseries <- ts(skirts,start=c(1866))
plot.ts(skirtsseries)
执行效果如图3所示,说明安装成功。
图3 R语言输出结果
3 Python对R的调用方法
在完成了两种软件的安装及测试后,对于采用本地模式,具体调用步骤如下:
步骤1从http://www.lfd.uci.edu/~gohlke/pythonlibs/#rpy2下载文件rpy2-2.5.6-cp27-none-win_amd64.whl,将其拷贝至新建工程的根目录下,执行pip install命令:pip install rpy2-2.5.6-cp27-none-win_amd64.whl。
步骤2新建用户变量R_HOME,变量值为R语言安装目录,如:C:Program FilesRR-3.3.2。
步骤3新建用户变量R_USER,变量值为rpy2的安装目录,如:C:UsersgwwAnaconda2libsite-packages py2。
步骤4在Pycharm中新建.py文件,引入rpy2库,然后使用ro.r('')执行R语言,通过变量赋值形式获得计算结果,代码如下:
import rpy2.robjects as ro
ro.r(′library(forecast)′)
ro.r(′skirts<- scan(″http://robjhyndman.com/tsdldata/
roberts/
skirts.dat″,skip=5)′) # generate x at R
ro.r(′skirtsseries <- ts(skirts,start=c(1866))′)
ro.r(′skirtsseriesforecasts <- HoltWinters
(skirtsseries, gamma=FALSE)′)
ro.r(′skirtsseriesforecasts2 <- forecast.HoltWinters
(skirtsseriesforecasts, h=19)′)
skirtsseries =ro.r(′skirtsseries′)
print skirtsseries
skirtsseriesforecasts2 =ro.r(′skirtsseriesforecasts2′)
print skirtsseriesforecasts2
远程调用方式,需要在R语言上安装RServe,在Python上安装PyRserve库,具体步骤如下:
步骤1在http://www.rforge.net/Rserve/files/下载Rserve_1.8-0.zip,在R语言中点击程序包->Install package(s) from local files进行本地安装。也可以在使用命令行进行远程安装:
install.packages(′Rserve′,,′http://www.rforge.net/′)
步骤2启动RServe,执行如下命令开启远程访问连接:
> library(Rserve)
> Rserve(args=′--RS-enable-remote′)
输出以下结果,说明启动成功。
Starting Rserve...
″C:ANACON~1LibSITE-P~1 py2RWIN-LI~13.3Rservelibsx64Rserve.exe″ --RS-enable-remote
步骤3在Pycharm环境下,打开File—〉Settings—〉Project—〉Project Interpreter,点击右侧加号,搜索pyRserve,并进行安装。
步骤4在.py文件中编写代码,引入PyRserve,建立conn,进行RServe的远程连接。通过conn.eval和conn.voidEval进行R语言语句的执行。如果想进一步查找更多实用方法及变量互传,访问pyRserve网站http://pythonhosted.org/pyRserve/。使用以下代码进行测试:
import pyRserve
conn = pyRserve.connect(host=′Rserve IP地址′, port=6311)
aa = conn.eval(′13 + 25′)
conn.voidEval(″t <- c(-8.49, 0.99)″)
print(conn.r.t)
print(aa)
conn.close()
使用R语言的HoltWinters方法,执行语句如下:
import pyRserve
conn = pyRserve.connect(host=′ Rserve IP地址′, port=6311)
conn.eval(′library(forecast)′)
conn.eval(′skirts <- scan(″http://robjhyndman.com/
tsdldata/
roberts/skirts.dat″,skip=5)′)
conn.eval(′skirtsseries <- ts(skirts,start=c(1866))′)
conn.eval(′skirtsseriesforecasts <- HoltWinters(
skirtsseries, gamma=FALSE)′)
conn.eval(′skirtsseriesforecasts2 <- forecast.
HoltWinters(skirtsseriesforecasts, h=6)′)
conn.eval(′skirtsseriesforecasts2 <- forecast.
HoltWinters(skirtsseriesforecasts, h=19)′)
conn.voidEval(′func0<-function(){skirtsseriesforecasts2}′)
print(conn.r.func0())
4 程序设置示例
使用ECharts作为测算结果的可视化工具,应用Python Flask作为网站框架,在阿里云平台上申请ECS作为R语言服务器,实现Holt-Winters预测算法的Web应用示例开发。
步骤1布置阿里云ECS R语言服务器。为了R语言运算和使用方便,应用于多用户解决实际问题,在阿里云上申请ECS空间实例,系统选择Windows Server 2012 R2 数据中心版64位中文版(如图4所示),设置白名单,允许远程访问。
图4 阿里云ESC设置
使用mstsc.exe进行远程桌面的连接和登录,安装R语言、更新软件包、完成配置、启动远程访问。如图5所示。
图5 阿里云R语言服务器配置
步骤2配置Flask环境。在本地机器上安装Python,Pycharm,并加载flask、pyRserve等包。新建Flask Web应用,选择Anaconda作为编译器。
步骤3Holt-Winters算法编入。打开Flask项目的.py路由文件,将远程访问步骤4中的语句输入,采用json数据形式进行参数返回,代码框架如下:
from flask import Flask, jsonify
@app.route(′/getResult′)
def getResult():
import pyRserve
conn = pyRserve.connect(host=′ Rserve IP地址′,
port=6311)
…
conn.voidEval(′func0<-function(){skirtsseriesforecasts2}′)
return jsonify(result= conn.r.func0())
步骤4ECharts可视化显示。使用Boostrap框架设计Web界面样式,嵌入需要使用的ECharts图表,通过步骤3中的getResult()函数获取输出结果,进行Echarts图表的数据更新和显示。核心javascript编码如下:
$.getJSON(′/ getResult ′, function(data){
console.log(″从服务器收到:″+data.result[1]);
option.series[0].data.shift();
option.series[0].data = data.result[1];
myChart.setOption(option);}
基于上述方法,使用月度货运量数据进行程序运行,使用Holt-Winters预测未来6个月的运量,输出界面如图6所示。
图6 ECharts输出面板
5 结 语
Python和R语言都是主流的免费计算科学软件,Python的各种应用开发功能是R语言所不具备的,R语言简洁成熟的算法包可以弥补Python软件在该方面的不足。因此,通过使用Python调用R语言,可以发挥R语言算法在Web应用中的大数据挖掘功能,完善Python解决实际问题的运算功能。通过开发基于ECharts的Flask Web应用,嵌入R语言Holt-Winters算法,证明了该方案的有效性和实际应用的可行性。
[1] 孙强,李建华,李生红.基于Python的文本分类系统开发研究[J].计算机应用与软件,2011,28(3):13-14.
[2] 王国强,张贝克.基于Python的嵌入式脚本研究[J].计算机应用与软件,2010,27(3):107-109.
[3] 王晓宇,陈吉红,黄植红.一种基于Python的红外图像分析软件结构[J].计算机应用与软件,2008,25(11):31-33.
[4] 罗霄,任勇,山秀明.基于Python的混合语言编程及其实现[J].计算机应用与软件,2004,21(12):17-18,112.
[5] Grinberg M.Flask Web开发:基于Python的Web应用开发实战[M].安道,译.北京:人民邮电出版社,2015:7-18.
[6] 张若愚.Python科学计算[M].北京:清华大学出版社,2012:1.
[7] http://pythonhosted.org/pyRserve/.
[8] https://cran.r-project.org/web/packages/forecast/.
[9] http://echarts.baidu.com/.