如何做到R和python的完美配合?
原文地址:深入對比數據科學工具箱:Python和R之爭概述
在真實的數據科學世界裡,我們會有兩個極端,一個是業務,一個是工程。偏向業務的數據科學被稱為數據分析(Data Analysis),也就是A型數據科學。偏向工程的數據科學被稱為數據構建(Data Building),也就是B型數據科學。
從工具上來看,按由業務到工程的順序,這個兩條是:EXCEL &>&> R &>&> Python &>&> Scala
在實際工作中,對於小數據集的簡單分析來說,使用EXCEL絕對是最佳選擇。當我們需要更多複雜的統計分析和數據處理時,我們就需要轉移到 Python 和 R 上。在確定工程實施和大數據集操作時,我們就需要依賴 Scala 的靜態類型等工程方法構建完整的數據分析系統。
Scala 和 Excel 是兩個極端,對於大多數創業公司而言,我們沒有足夠多的人手來實現專業化的分工,更多情況下,我們會在 Python 和 R 上花費更多的時間同時完成數據分析(A型)和數據構建(B型)的工作。而許多人也對 Python 和 R 的交叉使用存在疑惑,所以本文將從實踐角度對 Python 和 R 中做了一個詳細的比較。
應用場景對比應用Python的場景網路爬蟲/抓取:儘管 rvest 已經讓 R 的網路爬蟲/抓取變得容易,但 Python 的 beautifulsoup 和 Scrapy 更加成熟、功能更強大,結合django-scrapy我們可以很快的構建一個定製化的爬蟲管理系統。
連接資料庫: R 提供了許多連接資料庫的選擇,但 Python 只用 sqlachemy 通過ORM的方式,一個包就解決了多種資料庫連接的問題,且在生產環境中廣泛使用。Python由於支持佔位符操作,在拼接SQL語句時也更加方便。
內容管理系統:基於Django,Python可以快速通過ORM建立資料庫、後台管理系統,而R
中的 Shiny 的鑒權功能暫時還需要付費使用。API構建:通過Tornado這個標準的網路處理庫,Python也可以快速實現輕量級的API,而R則較為複雜。
應用R的場景
統計分析: 儘管 Python 里 Scipy、Pandas、statsmodels 提供了一系列統計工具 ,R 本身是專門為統計分析應用建立的,所以擁有更多此類工具。
互動式圖表/面板: 近來 bokeh、plotly、 intuitics 將 Python 的圖形功能擴展到了網頁瀏覽器,甚至我們可以用tornado+d3來進一步定製可視化頁面,但 R 的 shiny 和 shiny dashboard 速度更快,所需代碼更少。
此外,當今數據分析團隊擁有許多技能,選擇哪種語言實際上基於背景知識和經驗。對於一些應用,尤其是原型設計和開發類,工作人員使用已經熟悉的工具會比較快速。
作為分享主義者(sharism),本人所有互聯網發布的圖文均遵從CC版權,轉載請保留作者信息並註明作者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog/harryprinc...,如果涉及源代碼請註明GitHub地址:harryprince (HarryZhu) · GitHub。微信號: harryzhustudio
商業使用請聯繫作者。python是一門標準化的編程語言,結構比較規範,但是很多時候代碼寫起來不如R簡便。因此,在python中用rpy2包(介面)調用R代碼不失為一種兩全其美的辦法。此外,python中直接裝個ggplot的第三方模塊來代替matplotlib來畫圖,可以有效提高工作效率的。
Pipelining R and Python in Notebooksby Micheleen HarrisMicrosoft Data Scientist
As a Data Scientist, I refuse to choose between R and Python, the top contenders currently fighting for the title of top Data Science programming language. I am not going to argue about which is better or pit Python and R against each other. Rather, I"m simply going to suggest to play to the strengths of each language and consider using them together in the same pipeline if you don"t want to give up advantages of one over the other. This is not a novel concept. Both languages have packages/modules which allow for the other language to be used within it (rpy2 in Python and rPython in R). Even in Jupyter notebooks, using the python kernel, one can use "R magics" to execute native R code (which actually relies on rpy2).
I learned R and Python at about the same time. Having pretty equal footing in both languages makes pipelining them together when need be an attractive option as I have my favorite aspects of each. It is agreed R has crisp, clean and journal-quality graphics as well as an incredible arsenal of statistical packages. Python is both a general purpose language and it is agreed in some places it"s really a production-ready coding language. But who says you can"t do the heavy statistics, machine learning and/or graphics in R within Python? This blog is not about comparing the two languages, however, simply about options to pipeline them and maybe a bit on why you would want to do so.
First things first. We need to decide on a platform and here I"m focusing on notebooks. We actually could do all of this outside a notebook environment, but in general notebook systems are more sharable, interactive, and completely appropriate for demonstrations. If I was well-funded and wanted much more than a notebook I"d probably go with Sense, a notebook-like-IDE-like pipelining system (you can demo it here). If I wanted to be daring, I"d go with Beaker notebooks, a promising, new open-source polyglot notebook project: beakernotebook. This time around, however, I"m going to go with the more established Jupyter notebook project, running a python 3.4 kernel, and interacting with R 3.2.3 via "R magics" and rpy2 python module.
Why notebooks? In a nutshell, I"ve found them a great place to learn, teach, share, and test code (see my Aside below for further explanation). It took some getting used to, but notebooks are booming right now in university courses and at conferences, both academic and industry. Why Jupyter notebooks? One reason that I particularly like is that kernels for over 50 languages have been developed for the Jupyter notebook system thus far, including ones for Scala and Julia, two increasingly popular languages in the data science arena.
Getting back to R and Python, here are two notebook snippets I created.
The first demonstrates loading the R ipython extension, creating a python pandas dataframe, passing this as input to R, and graphing the data with R"s ggplot2 package.
The second demonstrates creating some data in python with numpy, passing this as input to R, performing a linear fit, graphing the results with R"s plot, and passing the results of the fit (the coefficients) back to python for printing.
Aside: When I first came across notebook systems, I really disliked them. I"d start writing a chunk of code in a cell and end up switching to my favorite IDE instead, abandoning the notebook. So, what happened? I started teaching. Creating modules in notebook format, for students to enter into, interactively run, modify, test, etc. seemed like an excellent way to learn (and fun). In fact, I started learning this way, looking at notebooks I found online. And I found recently at conferences, workshop presenters are using notebooks to teach. I could grab these notebooks and go back to them over and over on my own notebook server (which is fairly easy to set up). In the end it was a shift in perspective and comfort for me, much like learning a new language. I use notebooks now for teaching, learning, testing, sharing code, and documentation. I might even start blogging in a notebook system soon (this is already a thing people do).
Also, excitingly, Jupyter Notebook had a new release at the time of writing this (4.1 came out January 8, 2016). Check out the announcement. Now, we have multi-cell selection, find-and-replace and "Restart and Run All Cells" and some other nifty stuff.
Note: if you are trying to get the latest rpy2 working on the latest Jupyter notebook on Windows, just be warned you might run into a console-writing issue. That is, print statements might write to the terminal instead of the notebook browser window. If this happens, it must still be an active bug. Contact rpy2 people. This happened to me with rpy2 2.7.6 with Jupyter notebook 4.1 and R 3.2.2 on Windows 10.
Links: My sample notebooks above are here. For a different option for using R in Jupyter see Andrie de Vries"s blog post. For more information on the rpy2 project and downloads look here.
R(又稱R語言)是一款開源的跨平台的數值統計和數值圖形化展現 工具。通俗點說,R是用來做統計和畫圖的。R擁有自己的腳本語言和大量的統計、圖形庫(得益於開源社區),這讓她看起來既美又實用。與其他同類軟體(如 SPSS)相比,R的特點是純命令行的,這倒也好,我們更應該把注意力放在數據本身,而非統計工具的UI。
R雖說有一套自己的語言,還挺完備,但她最專業的還是做統計和畫圖,而像連接資料庫、文本處理、文件操作等這些臟活可不能委屈R來干哪,這些得有其 他語言來負責,我的選擇是咱最熟悉的、做這些臟活最棒的Python。那接下來的問題很清楚了,R和Python如何一起工作?拍拍腦袋,想到可能有下面 幾種辦法:
1. R和Python只共享文件,Python把源數據處理乾淨,生成格式化的文件放在預定的目錄下,做個定時器讓R去讀文件,最終輸出統計結果和圖表。
這種做法一定程度上可行,除了做定時器外,還可以讓Python即時執行」rscript」命令調用R腳本來工作,只是這種辦法限制太大,只能夠交換文件,Python不能對R進行精確的控制。
2. 讓Python直接調用R的函數,R是開源項目,肯定會有一些第三方庫實現Python與R互通。
果然,我找到了rpy2,可以實現使用python讀取R的對象、調用R的方法以及Python與R數據結構轉換等。實際上除了Python,其他語言與R互通的第三方包也大大的有。最後我選擇第2種方法,來讓R與Python共舞。
模塊 rpy2.robjects 是rpy2對R的一個高級封裝,該模塊里包含了一個r對象和一系列的R數據結構。使用rpy2的大多數情況,只需要跟這個模塊打交道即可。rpy2的安裝 在此不多講了,有興趣的同學看文檔去,直接體驗一下R如何與Python無縫整合吧。
了解r實例r實例是指rpy2.robjects.r,它是在Python中的嵌入式R進程,把r當作從python走向R的通道來看就可以了。通過r實例,我們可以讀取R的內置變數、調用R的函數、甚至,直接把它當作R的解析器來用。訪問R的對象在R的命令行中,我們直接輸入對象名來訪問R的內置對象,如pi、letters:在R控制台中訪問R對象而使用r實例,python訪問R對象也很簡單,而且方法很多:
在python中訪問R對象在這段代碼中,我們用了三種方式來訪問R對象,把r實例當作字典,把r實例當作方法,把r實例當 作一個類對象(真是神喻呀~)。在實際中,使用哪一種方式要因習慣而異,我喜歡的方法是使用第三種,把r實例當作自己人,直接使用」.」來訪問R對象。但 這種方法有一個缺陷,就是不能訪問帶名字空間的R對象或函數,而其他兩種方式是可以的,這點將在隨後說明。調用R函數通過r實例,我們可以輕易地實現用Python調用R的函數。下面我們分別在R控制台和python命令行下讀一個數據文件並畫一張點圖。R控制台讀取文件畫點圖代碼解讀:data.csv 的內容就是上面代碼的3到7的內容。data = read.table(『data.csv』) :把文件讀進一個數據框變數data中。mtx = data.matrix(data):把data轉變成矩陣。dotchart(mtx)用矩陣的數據畫點圖。
結果如下:接下來用python來做一遍同樣的事情,我們之前了解到,使用r實例可以直接訪問R對象,還可 以直接調用R的函數,其實在Python看來,對象和函數是相同的東西,函數也是一種對象罷了。現在來試一下調用」read.table()」函數讀入一 個數據文件data.csv:出錯了!怎麼回事?在上面我提到過了,使用「.」引用的方式不能訪問帶有名字空間的R對象和函數,read.table 是表示在read包下面的table函數,通過」.」的形式調用失敗,必須要用字典的方式或參數的方式來獲得:這段代碼得到的結果與在R控制台下畫點圖的效果是一樣的。最後一行 r.dotchart(mtx)是直接通過」.」來調用R的函數dotchart的,在沒有名實空間的情況下,是正常的。如果你為了避免太多不可控制的出 錯機會,你可以統一地使用字典的方式來訪問R對象和方法,這是最保險的方法,雖然我個人認為看起來有點彆扭。r實例就是一R控制台其實r實例就是一個可交互的R控制台,只不過交互對象是Python與R罷了,為了證明r實例具有R控制台的特性,來做個實驗,寫一串R腳本,作為Python一個字元串變數的內容,把該字元串傳給r實例,然後把r實例當作方法來調用:
出來的結果這樣:
注意,把r實例當作控制台,只能夠通過r(r代碼)的方式來使用r實例,字典的方式行不通。
載入自定義函數在實際應用中,使用R語言來編寫自己的函數同樣是不可避免的,在R控制台中,可以使用source(『script_path』)的方法來載入自定 義R腳本。而在Python中使用自己義R腳本中的函數也同樣方便:使用r.source(『script_path』)即可把自定義函數載入到全局環境 中,再使用r.自定義方法名就可以實現調用,我就是這樣做的,在此不再詳述,同學們自己動手玩一下。
R Vector與Python list向量(Vector)是R的一個最重要的也是最常用的數據類型,可以理解為一個二維數據,對應Python的list。在R控制台中,聲明一個變 量:「x &<- 1」,X會被聲明成一個向量,而其第一個值是1。R常常用c()函數來聲創建一個由多個值組成的向量,例如c(1,2,3,4)。Python要與R打交 道,除了訪問R對象和調用R函數,還有就是要學會如何轉換常見的數據類型。
rpy2提供了幾個類,供我們把Python的list轉換成R的Vector。分別是 robjects.IntVector,robjects.Boolvector,robjects.StringVector,robjects.FloatVector. 以IntVector為例,將Python的list轉換成R的Vector:robjects.IntVector([1,2,3,4,5]),畢!
下面來使用剛學到的類型轉換知識畫上一個例子的散點圖來結束此次體驗:
沒有結束rpy2提供的不僅僅是上面這些,上面的知識只是rpy2所提供的20%,但是已經足以解決80%的問題。rpy2還提供了更低級的API,你可以做更多的事情,例如你可以實現另一個robjects對象來支持使用」.」來訪問帶名字空間的對象和函數。更多的知識,請移步官方文檔。
分享來自:守株待兔的博客:讓R與Python共舞jupyter
推薦閱讀:
※財務一名,已經工作兩年,現在想轉數據分析師,有沒有r語言和python學習的教程?
※Python小白想爬取網路數據?
※「男友讓我打十萬個「對不起」,漢字標上多少遍。」這個問題用 R 如何實現?
※你為什麼使用 jupyter ,進行分析,而不是用 python 腳本或僅僅利用 excel ?
※python有大量機器學習庫,但是不能結合hadoop,該如何實現大規模的機器學習?