深度對比:Python和R之爭

2021-02-13 表哥有話講


概述

在真實的數據科學世界裡,我們會有兩個極端,一個是業務,一個是工程。偏向業務的數據科學被稱為數據分析(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 速度更快,所需代碼更少。

數據流編程對比

接著,我們將通過下面幾個方面,對Python 和 R 的數據流編程做出一個詳細的對比。

參數傳遞

數據讀取

基本數據結構對照

矩陣轉化

矩陣計算

數據操作

參數傳遞

Python/R 都可以通過命令行的方式和其他語言做交互,通過命令行而不是直接調用某個類或方法可以更好地降低耦合性,在提高團隊協作的效率。

參數PythonR命令行輸入Python path/to/myscript.py arg1 arg2 arg3Rscript path/to/myscript.R arg1 arg2 arg3腳本識別import sys my_args = sys.argvmyArgs <- commandArgs(trailingOnly = TRUE)數據傳輸與解析

對於數據傳輸與解析,我們首推的格式是csv,因為一方面,csv格式的讀寫解析都可以通過 Python 和 R 的原生函數完成,不需要再安裝其他包。另一方面,csv格式可以很快的轉化為 data frame 格式,而data frame 格式是數據流分析的核心。

不過,實際情況中,我們需要傳輸一些非結構化的數據,這時候就必須用到 JSNO 或者 YAML。

數據傳輸與解析PythonRCSV(原生)csvread.csvCSV(優化)pandas.read_csv("nba_2013.csv")data.table::fread("nba_2013.csv")JSONjson(原生)jsonliteYAMLPyYAMLyaml基本數據結構

由於是從科學計算的角度出發,R 中的數據結構非常的簡單,主要包括 向量(一維)、多維數組(二維時為矩陣)、列表(非結構化數據)、數據框(結構化數據)。而 Python 則包含更豐富的數據結構來實現數據更精準的訪問和內存控制,多維數組(可讀寫、有序)、元組(只讀、有序)、集合(唯一、無序)、字典(Key-Value)等等。

矩陣操作

實際上,Python(numpy) 和 R中的矩陣都是通過一個多維數組(ndarray)實現的。

矩陣轉化PythonR維度data.shapedim(data)轉為向量data.flatten(1)as.vector(data)轉為矩陣np.array([[1,2,3],[3,2,1]])matrix(c(1,2,3,3,2,1),nrow=2,byrow=T)轉置data.Tt(data)矩陣變形矩陣變形data.reshape(1,np.prod(data.shape))matrix(data,ncol=nrow(data)*ncol(data))矩陣按行拼接np.r_[A,B]rbind(A,B)矩陣按列拼接np.c_[A,B]cbind(A,B)矩陣計算PythonR矩陣乘法np.dot(A,B)A %*% B矩陣冪指np.power(A,3)A^3全零矩陣np.zeros((3,3))matrix(0,nrow=3,ncol=3)矩陣求逆np.linalg.inv(A)solve(A)協方差np.cov(A,B)cov(A,B)特徵值np.linalg.eig(A)[0]eigen(A)$values特徵向量np.linalg.eig(A)[1]eigen(A)$vectors數據框操作

參考 R 中的 data frame 結構,Python 的 Pandas包也實現了類似的 data frame 數據結構。現在,為了加強數據框的操作,R 中更是演進出了 data table 格式(簡稱dt),這種格式以 dt[where,select,group by] 的形式支持類似SQL的語法。

數據框操作PythonR按Factor的Select操作df[['a', 'c']]dt[,.(a,c),]按Index的Select操作df.iloc[:,1:2]dt[,1:2,with=FALSE]按Index的Filter操作df[1:2]dt[1:2]groupby分組操作df.groupby(['a','b'])[['c','d']].mean()aggregate(x=dt[, c("v1", "v2")], by=list(mydt2$by1, mydt2$by2), FUN = mean)%in% 匹配操作 返回T/Fpd.Series(np.arange(5),dtype=np.float32).isin([2, 4])0:4 %in% c(2,4)match 匹配操作 返回Indexpd.Series(pd.match(pd.Series(np.arange(5),dtype=np.float32),[2,4],np.nan))match(0:4, c(2,4))tapplydf.pivot_table(values='a', columns='c', aggfunc=np.max)tapply(dt$a,dt$c,max)#其中dt$a是numeric,dt$c是nominal查詢操作df[df.a <= df.b]dt[ a<=b ]with操作pd.DataFrame({'a': np.random.randn(10), 'b': np.random.randn(10)}).eval('a + b')with(dt,a + b)plyr操作df.groupby(['month','week']).agg([np.mean, np.std])ddply(dt, .(month, week), summarize,mean = round(mean(x), 2),sd = round(sd(x), 2))多維數組融合pd.DataFrame([tuple(list(x)+[val]) for x, val in np.ndenumerate(np.array(list(range(1,24))+[np.NAN]).reshape(2,3,4))])data.frame(melt(array(c(1:23, NA), c(2,3,4))))多維列表融合pd.DataFrame(list(enumerate(list(range(1,5))+[np.NAN])))data.frame(melt(as.list(c(1:4, NA))))數據框融合pd.melt(pd.DataFrame({'first' : ['John', 'Mary'],'last' : ['Doe', 'Bo'],'height' : [5.5, 6.0],'weight' : [130, 150]}), id_vars=['first', 'last'])melt(data.frame(first = c('John', 'Mary'),last = c('Doe', 'Bo'),height = c(5.5, 6.0),weight = c(130, 150), id=c("first", "last"))數據透視表 pivot tablepd.pivot_table(pd.melt(pd.DataFrame({ 'x': np.random.uniform(1., 168., 12), 'y': np.random.uniform(7., 334., 12), 'z': np.random.uniform(1.7, 20.7, 12), 'month': [5,6,7]4, 'week': [1,2]6}), id_vars=['month', 'week']), values='value', index=['variable','week'],columns=['month'], aggfunc=np.mean)acast(melt(data.frame(x = runif(12, 1, 168),y = runif(12, 7, 334),z = runif(12, 1.7, 20.7),month = rep(c(5,6,7),4),week = rep(c(1,2), 6)), id=c("month", "week")), week ~ month ~ variable, mean)連續型數值因子分類pd.cut(pd.Series([1,2,3,4,5,6]), 3)cut(c(1,2,3,4,5,6), 3)名義型因子分類pd.Series([1,2,3,2,2,3]).astype("category")factor(c(1,2,3,2,2,3))數據流編程對比的示例Python 的 Pandas 中的管道操作

(df   .groupby(['a', 'b', 'c'], as_index=False)   .agg({'d': sum, 'e': mean, 'f', np.std})   .assign(g=lambda x: x.a / x.c)   .query("g > 0.05")   .merge(df2, on='a'))

R 的 dplyr 中的管道操作

flights %>% group_by(year, month, day) %>%  select(arr_delay, dep_delay)  summarise(    arr = mean(arr_delay, na.rm = TRUE),    dep = mean(dep_delay, na.rm = TRUE)) %>%  filter(arr > 30 | dep > 30)

數據可視化對比繪製相關性散點圖

對比數據相關性是數據探索常用的一種方法,下面是Python和R的對比。

Python

import seaborn as snsimport matplotlib.pyplot as pltsns.pairplot(nba[["ast", "fg", "trb"]])plt.show()

R

library(GGally)ggpairs(nba[,c("ast", "fg", "trb")])

然我們最終得到了類似的圖形,這裡R中GGally是依賴於ggplot2,而Python則是在matplotlib的基礎上結合Seaborn,除了GGally在R中我們還有很多其他的類似方法來實現對比製圖,顯然R中的繪圖有更完善的生態系統。

繪製聚類效果圖

這裡以K-means為例,為了方便聚類,我們將非數值型或者有確實數據的列排除在外。

Python

from sklearn.cluster import KMeanskmeans_model = KMeans(n_clusters=5, random_state=1)good_columns = nba._get_numeric_data().dropna(axis=1)kmeans_model.fit(good_columns)labels = kmeans_model.labels_from sklearn.decomposition import PCApca_2 = PCA(2)plot_columns = pca_2.fit_transform(good_columns)plt.scatter(x=plot_columns[:,0], y=plot_columns[:,1], c=labels)plt.show()

R

library(cluster)set.seed(1)isGoodCol <- function(col){   sum(is.na(col)) == 0 && is.numeric(col) }goodCols <- sapply(nba, isGoodCol)clusters <- kmeans(nba[,goodCols], centers=5)labels <- clusters$clusternba2d <- prcomp(nba[,goodCols], center=TRUE)twoColumns <- nba2d$x[,1:2]clusplot(twoColumns, labels)

速度對比Python

import numpy as npxx = np.zeros(100000000)%timeit xx[:] = 1

The slowest run took 9.29 times longer than the fastest. This could mean that an intermediate result is being cached 1 loops, best of 3: 111 ms per loop

R

xx <- rep(0, 100000000)system.time(xx[] <- 1)

user  system elapsed  1.326   0.103   1.433

顯然這裡 R 1.326的成績 比 Python 的 Numpy 3:111 的速度快了不少。

事實上,現在 R 和 Python 的數據操作的速度已經被優化得旗鼓相當了。下面是R中的 data.table、dplyr 與 Python 中的 pandas 的數據操作性能對比:

結論

Python 的 pandas 從 R 中偷師 dataframes,R 中的 rvest 則借鑑了 Python 的 BeautifulSoup,我們可以看出兩種語言在一定程度上存在的互補性,通常,我們認為 Python 比 R 在泛型編程上更有優勢,而 R 在數據探索、統計分析是一種更高效的獨立數據分析工具。所以說,同時學會Python和R這兩把刷子才是數據科學的王道。

文章來源:雪晴數據網

相關焦點

  • 未來,不是【Python vs R】,而是【Python and R】
    原標題:未來,不是【Python vs R】,而是【Python and R】     近年來,一方面,民間對Python與R的對比分析「如火如荼」,給人感覺是「你死我活」;另一方面,業界開始探討Python和R的集成應用,好像是「你中有我,我中有你」。
  • 用R也可以跑Python了
    如果你主要從事數據分析、統計建模和可視化,R大概是你的不二之選。但如果你還想來搞點深度學習,整個自然語言處理,那你可還真得用Python。如果你處於交叉領域,很可能就需要兩種語言切換。」)第二步:在conda環境下安裝「r-reticulate」和「numpy」;conda_install(「r-reticulate」,「numpy」)
  • 用R也可以跑Python了
    如果你主要從事數據分析、統計建模和可視化,R大概是你的不二之選。但如果你還想來搞點深度學習,整個自然語言處理,那你可還真得用Python。如果你處於交叉領域,很可能就需要兩種語言切換。後果是,寫個for loop還出bug真的是家常便飯。報警!面對這種困境的絕不止你一個人!
  • 深度學習框架之pytorch(63)目標檢測R-CNN1
    R-CNN,自2012年AlexNet網絡在ImageNet上大放異彩之後,很多領域逐漸引入了深度學習特別是深度卷積神經網絡的方法。在2014年提出的目標檢測算法R-CNN真正引起世人對深度學習目標檢測的注意,而且R-CNN的性能遠遠優於OverFeat,因此但不道德的默認R-CNN算法是深度學習目標檢測算法的開山之作。R-CNN出自論文《Rich feature hierarchies for accurate object detection and semantic segmentation》。
  • rPython:在R語言中調用python命令
    經常使用Python和R語言的人都知道,如果R中有某些功能Python不容易實現時,則可以安裝加載rpy2包,從而實現在python中調用R語言命令的功能
  • 深入對比數據科學工具箱:Python和R之爭
    當我們需要更多複雜的統計分析和數據處理時,我們就需要轉移到 Python 和 R 上。在確定工程實施和大數據集操作時,我們就需要依賴 Scala 的靜態類型等工程方法構建完整的數據分析系統。Scala 和 Excel 是兩個極端,對於大多數創業公司而言,我們沒有足夠多的人手來實現專業化的分工,更多情況下,我們會在 Python 和 R 上花費更多的時間同時完成數據分析(A型)和數據構建(B型)的工作。而許多人也對 Python 和 R 的交叉使用存在疑惑,所以本文將從實踐角度對 Python 和 R 中做了一個詳細的比較。
  • python應用之基於tensorflow的數據擬合:深度學習之預測入門篇
    實驗目的:1、了解python在深度學習領域的應用2、學習安裝python第三方依賴庫實驗環境:已正確安裝python3.5以及依賴庫tensorflow、matplotlib預測過程展示:1、應用領域
  • [原]深入對比數據科學工具箱:Python和R 非結構化數據的結構化
    }\')".format(id=getMongoData(i,"_id"),value=getMongoData(i,"value"),datetime=getMongoData(i,"datetime"),stock_code=getMongoData(i,"stock_code"),share=getMongoData(i,"share"))sql = r"INSERT INTO `FinanceR
  • Python 和 Ruby 的對比
    最近在考慮學習一門後端語言,在ruby和python直接猶豫,然後自己做了一些對比,希望能幫到有同樣問題的你。一、異同對比選擇1、Python和ruby的相同點:都強調語法簡單,都具有更一般的表達方式。python是縮進,ruby是類basic的表達。都大量減少了符號。都是動態數據類型。都是有豐富的數據結構。都具有C語言擴展能力,都具有可移植性,比perl的可移植性更好。也都可以作為嵌入語言。
  • python學習與PHP對比總結(二)之函數
    python的內置函數python提供了一些內置函數,可以直接調用即可,這些內置函數的用法和PHP的類似,直接調用傳入參數即可,舉幾個例子:abs取絕對值的函數:>>> abs(10)
  • 特徵工程總結:R與python的比較實現
    但本人將依據python代碼的實習,總結用R來實現,以方便對特徵工程全面的總結和理解。本文總結主要依據jasonfreak的「使用sklearn做單機特徵工程」總結,在此對其的深刻總結表示感謝。,來對比兩種語言的差異。
  • 經典目標檢測方法Faster R-CNN和Mask R-CNN|基於PaddlePaddle深度...
    機器視覺領域的核心問題之一就是目標檢測 (object detection),它的任務是找出圖像當中所有感興趣的目標 (物體),確定其位置和大小。作為經典的目標檢測框架 Faster R-CNN,雖然是 2015 年的論文,但是它至今仍然是許多目標檢測算法的基礎,這在飛速發展的深度學習領域十分難得。
  • 1500r和1800r曲率對比分析 淺談曲率的變化
    1500r和1800r曲率對比分析 淺談曲率的變化 工程師譚軍 發表於 2018-09-05 09:18:41   本文主要是關於1500r和1800r曲率的相關介紹
  • Python輸入,輸出,存儲器和異常
    輸入/輸出程序與用戶的交互需要使用輸入/輸出,主要包括控制臺和文件;對於控制臺可以使用input和print。input(xxx)輸入xxx, 然後讀取用戶的輸入並返回。In [1]: input()1Out[1]: '1'文件輸入/輸出可以使用file類打開一個文件,使用file的read、readline和write來恰當的讀寫文件。對文件讀寫能力取決於打開文件時使用的模式, 常用模式讀模式("r")寫模式("w")追加模式("a")文件操作之後需要調用close方法來關閉文件。
  • 數據科學探索(python 與 R 的比較)
    R1 數據科學探索(python 與 R 的比較)        首次嘗試使用jupyter notebook來實現python 和 R,感覺在R的部分兼容性方面還是與rmarkdown有些差距。#設置mirrorlocal({r <- getOption("repos")r["CRAN"] <- "http://mirrors.xmu.edu.cn/CRAN/"options(repos=r)})library(ggplot2)library(dplyr)library(psych)library(Hmisc
  • R語言做深度學習
    《Deep Learning With Python》這本書使用Python語言和強大的Keras庫帶您進入深度學習領域。 本書由Keras創建者和Google AI研究員FrançoisChollet撰寫,通過直觀的解釋和實際的例子幫助您構建對深度學習的理解。您將在計算機視覺,自然語言處理和生成模型中應用和實踐。
  • 搞機器學習,Python 和 R 哪個更合適?
    接下來的文章將進一步討論兩種語言的細節之處,這將非常有助於你選擇最適合你當前項目的程式語言。PythonPython誕生於上世紀80年代,並且在Google內部框架中承擔重要角色。另外,數據研究者使用基於python構建完成後續的工作並不難。促進生產效率 —— Python語法非常容易理解,並且和其它程式語言一樣,反正跟R不相伯仲。這保證了開發團隊的高效率生產。Python的劣勢:通用倉庫的缺失,某些R庫沒有對應的python包。
  • Python3 與 C# 基礎語法對比(String專欄)
    python在這方面簡化了)NetCore,其實你用Python跟其他語言對比反差更大,net真的很強大了。補充(對比看就清楚Python的step為什麼是2了,i+=2==》2)  #分割:split(按指定字符分割),splitlines(按行分割),partition(以str分割成三部分,str前,str和str後),rpartition說下split
  • R 和 Python,為什麼不能二者兼得?
    你說想同時使用 R 和 Python?prython 就可以滿足你的願望!你是否同時使用 R 和 Python,或者是在不同的項目中,或者是在同一個項目中?請看一看 prython,一個專門為滿足你這種需求而設計的 IDE。忘掉 R 與 Python 之間的網絡論戰吧。如果 R 和 Python 都被使用可能是合理的時候,那麼在實際情況中會發生什麼情況呢?
  • Python 和 R語言那個好?
    我說的是自己的使用感覺和經驗,不代表真理。先是R 語言非常火,可以做分析,挖掘,爬蟲,算法。類似的語言Python 後來居上,Python 在數據分析領域可以做爬蟲, 統計分析,數據結構處理,ETL,數據挖掘,機器學習,深度學習,人工智慧,圖像處理,推薦系統 等。