在数据分析流程中整合Python和R(一)

发布时间: 2015-11-08 阅读数: 1140

EARL 是一个关于 R 语言的会议。今年的会议中却出现了大量关于Python的讨论。我认为,这个现象部分归功于在会议前一天举办的,关于整合 Python 和 R 的三小时研讨会。
本文是此系列三篇文章的第一篇。这个系列的文章旨在:

  • 介绍整合 Python 和 R 的基本策略
  • 盘点此过程涉及的各个步骤
  • 用实例说明如何/为何这么做

作为这个系列的开篇,本文将:

  • 阐述在同一个流程中使用 Python 和 R 的原因
  • 介绍通过命令行使用 R 和 Python 的方法
  • 展示如何将输入内容作为参数,并将输出内容写成多种文件格式

为什么要“整合”而不是“二选一”?


在网上简单搜索有关“R Python”的文章,前十条结果里只有两条是讨论同时使用 R 和 Python 的好处,其余的讨论都将它们置于竞争对立之中。这件事并不难理解,从创立之初,两种语言就拥有各自鲜明的优点/缺点。从历史上看,Python 和 R 的分界有关学科背景:统计学家倾向于 R ,而程序员选择 Python 。不过,随着数据科学家这个职业的兴起,原有的分界变得模糊起来。 “数据科学家 (名词): 比软件工程师更擅长统计,比统计学家更擅长软件工程的人。”-twitter 网友 @josh_wills R 和 Python 都有丰富的资源库,而数据科学家越来越需要学会平衡利用它们各自的优势。
在以下领域 Python 的表现比 R 更优异:

  • 网络爬虫/抓取:尽管 rvest 已经让 R 的网络爬虫/抓取变得容易,但 Python 的 beautifulsoup 和 Scrapy 更加成熟、功能更强大。
  • 连接数据库: R 提供了许多连接数据库的选择,但 Python 只用 sqlachemy 一个包就可以解决,且在生产环境中广泛使用。

在以下领域 R 比 Python 表现更优异:

  • 统计分析: 尽管 Python 里 Scipy、Pandas、statsmodels 提供了一系列统计工具 ,R 本身是专门为统计分析应用建立的,所以拥有更多此类工具。
  • 互动式图表/面板: 近来 bokeh、plotly、 intuitics 将 Python 的图形功能扩展到了网页浏览器,但 R 的 shiny 和 shiny dashboard 速度更快,所需代码更少。

此外,当今数据分析团队拥有许多技能,选择哪种语言实际上基于背景知识和经验。对于一些应用,尤其是原型设计和开发类,工作人员使用已经熟悉的工具会比较快速。

策略:使用没有相对结构的文件格式作为中转


在本系列的文章中,我们探讨最简单的整合 R 和 Python 的方法。使用没有相对结构的文件格式作为中转需要执行如下步骤。

  1. 重构 R 和 Python 的脚本使其在命令行可执行,并能接受命令行的参数。
  2. 将共享的数据输出为一种通用的文件格式。
  3. 在一种语言中执行另一种,需要的情况下传递参数。

此策略的好处:

  • 最简单,通常也最快。
  • 容易查阅中间的输出。
  • 常用的文件格式 CSV, JSON, YAML已有解析器。

此策略的坏处:

  • 需要对一种通用结构或文件格式达成共识。
  • 如果流程变复杂,管理中间输出会很麻烦。
  • 在数据量大的情况下,硬盘读写会成为一个瓶颈。

命令行脚本


对于 R 和 Python ,用在 Windows /类 Linux 终端环境运行脚本是相似的。要执行的命令可以被分解成下面这种形式: <命令> <脚本路径> <附加参数> 这里: <命令>是要运行的可执行文件类别 (对于 R 代码来说是 Rscript ,对于 Python 代码来说是 Python ) <脚本路径> 是脚本的完整或相对路径。如果路径名有空格,整个路径必须加双引号。 <附加参数> 是一组用格分隔的参数的list,由脚本文件自己解析。注意,它们会作为字符串被传入。 举例说明,一个 R 脚本要在终端环境打开,运行方式如下:

 Rscript path/to/myscript.R arg1 arg2 arg3

常见小问题

  • 可执行文件必须已经存在于当前路径。否则需要供系统位置的完整路径。
  • 有空格的路径名称会出现问题,尤其在Windows系统,因此必须加双引号使其被视作“一个”路径。

在R中获取来自命令行的参数


在上面的例子中,arg1, arg2, arg3 是 R 脚本要解析的参数。这些参数可以用 commandArgsfunction 获取。

# myscript.R
# 获取来自命令行的参数
myArgs <- commandArgs(trailingOnly = TRUE)
# myArgs是个包含全部参数的字符向量 
print(myArgs)
print(class(myArgs))

设定 trailingOnly = TRUE ,则向量 myArgs 只包含你加入命令行中的参数。如果此项是 FALSE (默认设置),则向量中会有其他的参数,比如刚刚执行的脚本路径。

在Python中获取来自命令行的参数


用这种方式在命令行中执行的 Python 脚本,可以通过事先 import sys 模块获取参数 arg1, arg2, arg3。这个模块有关各系统特有的参数和功能,但这里我们只关心其中的 argv 属性。argv 是传递给当前脚本的一组完整参数。第一个元素永远是脚本文件的完整路径。

# myscript.py
import sys
# 获取来自命令行的参数
my_args = sys.argv
# my_args是一个list,第一个元素是所执行的文件(路径)。
print(type(my_args))
print(my_args)

如果想要只保留参数,可以把第一个元素去掉。

# 选取除了第一个元素以外的全部内容
my_args = sys.argv[1:]

像上面关于 R 的例子一样,这里所有参数是作为字符串被解析的。如果有其他需要,须自行转换成想要的类型。

将输出内容写成文件


R 和 Python 的中介文件有几种备选格式。对于一般的无相对结构的文件格式,CSV 适合表格数据。JSON 或 YAML 适合更缺乏结构的数据(或元数据),数据可能包含许多不同的字段或是网状结构。
这些都是很常见的数据序列化格式,两种语言都有相应解析器。R中推荐使用下列几个包:

  • CSV 使用 readr
  • JSON 使用 jsonlite
  • YAML 使用 yaml

Python:

  • CSV 使用 csv
  • JSON 使用 json
  • YAML 使用 PyYAML

csv 模块和 json 模块是标准的 Python 库的组成部分,Python 语言本身自带。PyYAML 需要单独安装。至于上面提到的各 R 包,用正常方式安装即可。

总结


综上所述,同一个流程中,R 和 Python 相互传递数据可使用如下方式:

  • 使用命令行传递参数,以及
  • 用一个通用的,无相对格式的文件传递数据

然而,在一些情况下,使用文件作为中介存储会产生麻烦,且不利于表现。下一篇文章中,我们会探讨如何让R和Python直接相互调用,并把输出返回到内存中。

本译文转载自数据工匠,原文作者Chris Musselle & Kate Ross-Smith。转载请注明译文链接http://datartisan.com/article/detail/56.html

分享到:
热门文章

REmap发布,用R绘制百度迁徙图

2015年07月23日更新 21043次阅读

学习R语言,一篇文章让你从懵圈到入

2016年05月09日更新 14656次阅读

清华大学教授:大数据时代 统计学依

2015年08月07日更新 11281次阅读

在R中填充缺失数据—mice包

2015年12月31日更新 10705次阅读

精通 R plot—第一部分:颜色

2016年01月20日更新 9497次阅读

非统计学专业的人该如何学习 R 语

2015年07月24日更新 8102次阅读
热门课程

R语言初级课程

2015年02月20日发布 3230名学员

R语言高效数据清理工具包dplyr

2015年08月30日发布 1687名学员

R语言数据分析入门

2016年05月10日发布 1563名学员

如何用R做数据预处理

2016年06月03日发布 1160名学员

全栈数据工程师养成攻略

2016年11月08日发布 1019名学员

R语言大规模数据分析实战

2015年12月17日发布 952名学员
登录 注册