摘要:概述在真實的數據科學世界里,我們會有兩個極端,一個是業務,一個是工程。偏向業務的數據科學被稱為數據分析,也就是型數據科學。所以說,同時學會和這兩把刷子才是數據科學的王道。
概述
在真實的數據科學世界里,我們會有兩個極端,一個是業務,一個是工程。偏向業務的數據科學被稱為數據分析(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 都可以通過命令行的方式和其他語言做交互,通過命令行而不是直接調用某個類或方法可以更好地降低耦合性,在提高團隊協作的效率。
參數傳遞 | Python | R |
---|---|---|
命令行輸入 | Python path/to/myscript.py arg1 arg2 arg3 | Rscript path/to/myscript.R arg1 arg2 arg3 |
腳本識別 | import sys my_args = sys.argv | myArgs <- commandArgs(trailingOnly = TRUE) |
對于數據傳輸與解析,我們首推的格式是csv,因為一方面,csv格式的讀寫解析都可以通過 Python 和 R 的原生函數完成,不需要再安裝其他包。另一方面,csv格式可以很快的轉化為 data frame 格式,而data frame 格式是數據流分析的核心。
不過,實際情況中,我們需要傳輸一些非結構化的數據,這時候就必須用到 JSNO 或者 YAML。
數據傳輸與解析 | Python | R |
---|---|---|
CSV(原生) | csv | read.csv |
CSV(優化) | pandas.read_csv("nba_2013.csv") | data.table::fread("nba_2013.csv") |
JSON | json(原生) | jsonlite |
YAML | PyYAML | yaml |
由于是從科學計算的角度出發,R 中的數據結構非常的簡單,主要包括 向量(一維)、多維數組(二維時為矩陣)、列表(非結構化數據)、數據框(結構化數據)。而 Python 則包含更豐富的數據結構來實現數據更精準的訪問和內存控制,多維數組(可讀寫、有序)、元組(只讀、有序)、集合(唯一、無序)、字典(Key-Value)等等。
基本數據結構 | Python | R |
---|---|---|
數組 | list:[1,"a"] | :array:array(c(1,"a"),2) |
Key-Value(非結構化數據) | 字典:["a":1] | lists |
數據框(結構化數據) | dataframe | data.frame |
Python dict 操作:dict["key"] 或者 dict.get("key","default_return")
R list 操作: list["key"] 或者 list$key
R 中數據結構轉化(plyr) | list | data frame | array |
---|---|---|---|
list | llply() | ldply() | laply() |
data frame | dlply() | ddply() | daply() |
array | alply() | adply() | aaply() |
Python | R |
---|---|
map | Map |
reduce | Reduce |
filter | filter |
實際上,Python(numpy) 和 R中的矩陣都是通過一個多維數組(ndarray)實現的。
矩陣轉化 | Pyhton | R |
---|---|---|
維度 | data.shape | dim(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.T | t(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) |
矩陣計算 | Pyhton | R |
---|---|---|
矩陣乘法 | 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的語法。
數據框操作 | Python | R |
---|---|---|
按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/F | pd.Series(np.arange(5),dtype=np.float32).isin([2, 4]) | 0:4 %in% c(2,4) |
match 匹配操作 返回Index | pd.Series(pd.match(pd.Series(np.arange(5),dtype=np.float32),[2,4],np.nan)) | match(0:4, c(2,4)) |
tapply | df.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 table | pd.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)) |
(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"))
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的對比。
import seaborn as sns import matplotlib.pyplot as plt sns.pairplot(nba[["ast", "fg", "trb"]]) plt.show()
library(GGally) ggpairs(nba[,c("ast", "fg", "trb")])
雖然我們最終得到了類似的圖形,這里R中GGally是依賴于ggplot2,而Python則是在matplotlib的基礎上結合Seaborn,除了GGally在R中我們還有很多其他的類似方法來實現對比制圖,顯然R中的繪圖有更完善的生態系統。
繪制聚類效果圖這里以K-means為例,為了方便聚類,我們將非數值型或者有確實數據的列排除在外。
from sklearn.cluster import KMeans kmeans_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 PCA pca_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()
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$cluster nba2d <- prcomp(nba[,goodCols], center=TRUE) twoColumns <- nba2d$x[,1:2] clusplot(twoColumns, labels)速度對比
import numpy as np xx = 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
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 的數據操作性能對比:
我曾經用data.table和pandas分別讀取過一個600萬行的IOT數據,反復10次,data.table以平均10s的成績勝過了pandas平均15s的成績,所以在IO上我傾向于選擇使用data.table來處理大數據,然后喂給spark和hadoop進行進一步的分布式處理。
結論Python 的 pandas 從 R 中偷師 dataframes,R 中的 rvest 則借鑒了 Python 的 BeautifulSoup,我們可以看出兩種語言在一定程度上存在的互補性,通常,我們認為 Python 比 R 在泛型編程上更有優勢,而 R 在數據探索、統計分析是一種更高效的獨立數據分析工具。所以說,同時學會Python和R這兩把刷子才是數據科學的王道。
參考資料pandas doucumentation: Comparison with R / R libraries
Comparison – R vs. Python: head to head data analysis
Hacker News: Comparison – R vs. Python
Quora: How does R compare with pandas?
yhat: R and pandas and what I"ve learned about each
Why are pandas merges in python faster than data.table merges in R?
Python和R科學計算操作速查表
知乎:R 和 Python (numpy scipy pandas) 用于統計學分析,哪個更好?
Choosing R or Python for data analysis? An infographic
散大大 寫給Python數據科學家們 : 科學計算開發環境排雷
作為分享主義者(sharism),本人所有互聯網發布的圖文均遵從CC版權,轉載請保留作者信息并注明作者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog...,如果涉及源代碼請注明GitHub地址:https://github.com/harryprince。微信號: harryzhustudio
商業使用請聯系作者。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37871.html
摘要:我們來看一下美國相關專業人員對兩者的對比,只是粗略而不精準的翻譯一下。小結其實在寫這篇文章之前,我就問過一下包括清華在內的學校以及一些數學專業的學生,和還是占主流,但是經過一番調查發現在美國在數據科學數學等方面好像漸成壓倒性的優勢。 作為一枚程序員,想要研究Python編程語言與數學學習(教學)的結合,就不能不了解以及比對一下其他數學學習與應用的解決方案,比如R語言、Matlab等數學...
摘要:概述工欲善其事必先利其器,如果現在要評選數據科學中最好用的編輯器注意一定是可以通過訪問的,和一定是角逐的最大熱門,正確使用編輯器可以很大地提升我們的工作效率。 概述 showImg(https://segmentfault.com/img/bVAdol); 工欲善其事必先利其器,如果現在要評選數據科學中最好用的Web 編輯器(注意一定是可以通過Web訪問的),RStudio和Jupyt...
摘要:對于異常機制的合理運用是直接關系到碼農飯碗的事情所以,本文將具體介紹一下和的異常處理機制,闡明二者在異常處理機制上的異同。下面將具體介紹二者的異常處理機制。 概述 showImg(https://segmentfault.com/img/remote/1460000006760426); 異常處理,是編程語言或計算機硬件里的一種機制,用于處理軟件或信息系統中出現的異常狀況(即超出程序正...
摘要:則在讀取數據時將兩個中文字段混淆成了一個字段,導致整個數據結構錯亂。三條路子全軍覆沒,這讓我情何以堪,好在使用的經驗頗豐,通過中文的轉換和切割就輕松解決了這個問題。 概述 showImg(https://segmentfault.com/img/bVylLL); 在現實場景中,由于數據來源的異構,數據源的格式往往是難以統一的,這就導致大量具有價值的數據通常是以非結構化的形式聚合在一起的...
摘要:另外一個我們同時使用兩種語言的原因是已有的統計學工具與包。對另一些為讀者寫數據科學工具的人來說他們從一開始就考慮了這些跨語言。和實際上是用實現的這是條阻力最小的路徑。無論是哪個贏得這場語言戰爭,和都將保持在數據科學屆的地位。 showImg(https://segmentfault.com/img/remote/1460000006762469); 概述 幾周前,我有幸在 Scipy ...
閱讀 2053·2021-11-22 13:52
閱讀 976·2021-11-17 09:33
閱讀 2708·2021-09-01 10:49
閱讀 2841·2019-08-30 15:53
閱讀 2659·2019-08-29 16:10
閱讀 2432·2019-08-29 11:31
閱讀 1343·2019-08-26 11:40
閱讀 1866·2019-08-26 10:59