国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[原]深入對(duì)比數(shù)據(jù)科學(xué)工具箱:Python和R之爭[2016版]

whidy / 2336人閱讀

摘要:概述在真實(shí)的數(shù)據(jù)科學(xué)世界里,我們會(huì)有兩個(gè)極端,一個(gè)是業(yè)務(wù),一個(gè)是工程。偏向業(yè)務(wù)的數(shù)據(jù)科學(xué)被稱為數(shù)據(jù)分析,也就是型數(shù)據(jù)科學(xué)。所以說,同時(shí)學(xué)會(huì)和這兩把刷子才是數(shù)據(jù)科學(xué)的王道。

概述

在真實(shí)的數(shù)據(jù)科學(xué)世界里,我們會(huì)有兩個(gè)極端,一個(gè)是業(yè)務(wù),一個(gè)是工程。偏向業(yè)務(wù)的數(shù)據(jù)科學(xué)被稱為數(shù)據(jù)分析(Data Analysis),也就是A型數(shù)據(jù)科學(xué)。偏向工程的數(shù)據(jù)科學(xué)被稱為數(shù)據(jù)構(gòu)建(Data Building),也就是B型數(shù)據(jù)科學(xué)。

從工具上來看,按由業(yè)務(wù)到工程的順序,這個(gè)兩條是:EXCEL >> R >> Python >> Scala

在實(shí)際工作中,對(duì)于小數(shù)據(jù)集的簡單分析來說,使用EXCEL絕對(duì)是最佳選擇。當(dāng)我們需要更多復(fù)雜的統(tǒng)計(jì)分析和數(shù)據(jù)處理時(shí),我們就需要轉(zhuǎn)移到 Python 和 R 上。在確定工程實(shí)施和大數(shù)據(jù)集操作時(shí),我們就需要依賴 Scala 的靜態(tài)類型等工程方法構(gòu)建完整的數(shù)據(jù)分析系統(tǒng)。

Scala 和 Excel 是兩個(gè)極端,對(duì)于大多數(shù)創(chuàng)業(yè)公司而言,我們沒有足夠多的人手來實(shí)現(xiàn)專業(yè)化的分工,更多情況下,我們會(huì)在 Python 和 R 上花費(fèi)更多的時(shí)間同時(shí)完成數(shù)據(jù)分析(A型)和數(shù)據(jù)構(gòu)建(B型)的工作。而許多人也對(duì) Python 和 R 的交叉使用存在疑惑,所以本文將從實(shí)踐角度對(duì) Python 和 R 中做了一個(gè)詳細(xì)的比較。

應(yīng)用場景對(duì)比 應(yīng)用Python的場景

網(wǎng)絡(luò)爬蟲/抓取:盡管 rvest 已經(jīng)讓 R 的網(wǎng)絡(luò)爬蟲/抓取變得容易,但 Python 的 beautifulsoup 和 Scrapy 更加成熟、功能更強(qiáng)大,結(jié)合django-scrapy我們可以很快的構(gòu)建一個(gè)定制化的爬蟲管理系統(tǒng)。

連接數(shù)據(jù)庫: R 提供了許多連接數(shù)據(jù)庫的選擇,但 Python 只用 sqlachemy 通過ORM的方式,一個(gè)包就解決了多種數(shù)據(jù)庫連接的問題,且在生產(chǎn)環(huán)境中廣泛使用。Python由于支持占位符操作,在拼接SQL語句時(shí)也更加方便。

內(nèi)容管理系統(tǒng):基于Django,Python可以快速通過ORM建立數(shù)據(jù)庫、后臺(tái)管理系統(tǒng),而R

中的 Shiny 的鑒權(quán)功能暫時(shí)還需要付費(fèi)使用。

API構(gòu)建:通過Tornado這個(gè)標(biāo)準(zhǔn)的網(wǎng)絡(luò)處理庫,Python也可以快速實(shí)現(xiàn)輕量級(jí)的API,而R則較為復(fù)雜。

應(yīng)用R的場景

統(tǒng)計(jì)分析: 盡管 Python 里 Scipy、Pandas、statsmodels 提供了一系列統(tǒng)計(jì)工具 ,R 本身是專門為統(tǒng)計(jì)分析應(yīng)用建立的,所以擁有更多此類工具。

互動(dòng)式圖表/面板: 近來 bokeh、plotly、 intuitics 將 Python 的圖形功能擴(kuò)展到了網(wǎng)頁瀏覽器,甚至我們可以用tornado+d3來進(jìn)一步定制可視化頁面,但 R 的 shiny 和 shiny dashboard 速度更快,所需代碼更少。

此外,當(dāng)今數(shù)據(jù)分析團(tuán)隊(duì)擁有許多技能,選擇哪種語言實(shí)際上基于背景知識(shí)和經(jīng)驗(yàn)。對(duì)于一些應(yīng)用,尤其是原型設(shè)計(jì)和開發(fā)類,工作人員使用已經(jīng)熟悉的工具會(huì)比較快速。

數(shù)據(jù)流編程對(duì)比

接著,我們將通過下面幾個(gè)方面,對(duì)Python 和 R 的數(shù)據(jù)流編程做出一個(gè)詳細(xì)的對(duì)比。

參數(shù)傳遞

數(shù)據(jù)讀取

基本數(shù)據(jù)結(jié)構(gòu)對(duì)照

矩陣轉(zhuǎn)化

矩陣計(jì)算

數(shù)據(jù)操作

參數(shù)傳遞

Python/R 都可以通過命令行的方式和其他語言做交互,通過命令行而不是直接調(diào)用某個(gè)類或方法可以更好地降低耦合性,在提高團(tuán)隊(duì)協(xié)作的效率。

參數(shù)傳遞 Python R
命令行輸入 Python path/to/myscript.py arg1 arg2 arg3 Rscript path/to/myscript.R arg1 arg2 arg3
腳本識(shí)別 import sys my_args = sys.argv myArgs <- commandArgs(trailingOnly = TRUE)
數(shù)據(jù)傳輸與解析

對(duì)于數(shù)據(jù)傳輸與解析,我們首推的格式是csv,因?yàn)橐环矫妫琧sv格式的讀寫解析都可以通過 Python 和 R 的原生函數(shù)完成,不需要再安裝其他包。另一方面,csv格式可以很快的轉(zhuǎn)化為 data frame 格式,而data frame 格式是數(shù)據(jù)流分析的核心。

不過,實(shí)際情況中,我們需要傳輸一些非結(jié)構(gòu)化的數(shù)據(jù),這時(shí)候就必須用到 JSNO 或者 YAML。

數(shù)據(jù)傳輸與解析 Python R
CSV(原生) csv read.csv
CSV(優(yōu)化) pandas.read_csv("nba_2013.csv") data.table::fread("nba_2013.csv")
JSON json(原生) jsonlite
YAML PyYAML yaml
基本數(shù)據(jù)結(jié)構(gòu)

由于是從科學(xué)計(jì)算的角度出發(fā),R 中的數(shù)據(jù)結(jié)構(gòu)非常的簡單,主要包括 向量(一維)、多維數(shù)組(二維時(shí)為矩陣)、列表(非結(jié)構(gòu)化數(shù)據(jù))、數(shù)據(jù)框(結(jié)構(gòu)化數(shù)據(jù))。而 Python 則包含更豐富的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)數(shù)據(jù)更精準(zhǔn)的訪問和內(nèi)存控制,多維數(shù)組(可讀寫、有序)、元組(只讀、有序)、集合(唯一、無序)、字典(Key-Value)等等。

基本數(shù)據(jù)結(jié)構(gòu) Python R
數(shù)組 list:[1,"a"] :array:array(c(1,"a"),2)
Key-Value(非結(jié)構(gòu)化數(shù)據(jù)) 字典:["a":1] lists
數(shù)據(jù)框(結(jié)構(gòu)化數(shù)據(jù)) dataframe data.frame

Python dict 操作:dict["key"] 或者 dict.get("key","default_return")
R list 操作: list["key"] 或者 list$key

R 中數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化(plyr) list data frame array
list llply() ldply() laply()
data frame dlply() ddply() daply()
array alply() adply() aaply()
MapReduce
Python R
map Map
reduce Reduce
filter filter
矩陣操作

實(shí)際上,Python(numpy) 和 R中的矩陣都是通過一個(gè)多維數(shù)組(ndarray)實(shí)現(xiàn)的。

矩陣轉(zhuǎn)化 Pyhton R
維度 data.shape dim(data)
轉(zhuǎn)為向量 data.flatten(1) as.vector(data)
轉(zhuǎn)為矩陣 np.array([[1,2,3],[3,2,1]]) matrix(c(1,2,3,3,2,1),nrow=2,byrow=T)
轉(zhuǎn)置 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)
矩陣計(jì)算 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)
協(xié)方差 np.cov(A,B) cov(A,B)
特征值 np.linalg.eig(A)[0] eigen(A)$values
特征向量 np.linalg.eig(A)[1] eigen(A)$vectors
數(shù)據(jù)框操作

參考 R 中的 data frame 結(jié)構(gòu),Python 的 Pandas包也實(shí)現(xiàn)了類似的 data frame 數(shù)據(jù)結(jié)構(gòu)。現(xiàn)在,為了加強(qiáng)數(shù)據(jù)框的操作,R 中更是演進(jìn)出了 data table 格式(簡稱dt),這種格式以 dt[where,select,group by] 的形式支持類似SQL的語法。

數(shù)據(jù)框操作 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))
多維數(shù)組融合 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))))
數(shù)據(jù)框融合 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"))
數(shù)據(jù)透視表 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)
連續(xù)型數(shù)值因子分類 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))
數(shù)據(jù)流編程對(duì)比的示例
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)
數(shù)據(jù)可視化對(duì)比 繪制相關(guān)性散點(diǎn)圖

對(duì)比數(shù)據(jù)相關(guān)性是數(shù)據(jù)探索常用的一種方法,下面是Python和R的對(duì)比。

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

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

雖然我們最終得到了類似的圖形,這里R中GGally是依賴于ggplot2,而Python則是在matplotlib的基礎(chǔ)上結(jié)合Seaborn,除了GGally在R中我們還有很多其他的類似方法來實(shí)現(xiàn)對(duì)比制圖,顯然R中的繪圖有更完善的生態(tài)系統(tǒng)。

繪制聚類效果圖

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

Python
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()

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$cluster

nba2d <- prcomp(nba[,goodCols], center=TRUE)
twoColumns <- nba2d$x[,1:2]
clusplot(twoColumns, labels)

速度對(duì)比
Python
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
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 的速度快了不少。

事實(shí)上,現(xiàn)在 R 和 Python 的數(shù)據(jù)操作的速度已經(jīng)被優(yōu)化得旗鼓相當(dāng)了。下面是R中的 data.table、dplyr 與 Python 中的 pandas 的數(shù)據(jù)操作性能對(duì)比:

我曾經(jīng)用data.table和pandas分別讀取過一個(gè)600萬行的IOT數(shù)據(jù),反復(fù)10次,data.table以平均10s的成績勝過了pandas平均15s的成績,所以在IO上我傾向于選擇使用data.table來處理大數(shù)據(jù),然后喂給spark和hadoop進(jìn)行進(jìn)一步的分布式處理。

結(jié)論

Python 的 pandas 從 R 中偷師 dataframes,R 中的 rvest 則借鑒了 Python 的 BeautifulSoup,我們可以看出兩種語言在一定程度上存在的互補(bǔ)性,通常,我們認(rèn)為 Python 比 R 在泛型編程上更有優(yōu)勢,而 R 在數(shù)據(jù)探索、統(tǒng)計(jì)分析是一種更高效的獨(dú)立數(shù)據(jù)分析工具。所以說,同時(shí)學(xué)會(huì)Python和R這兩把刷子才是數(shù)據(jù)科學(xué)的王道。

參考資料

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科學(xué)計(jì)算操作速查表

知乎:R 和 Python (numpy scipy pandas) 用于統(tǒng)計(jì)學(xué)分析,哪個(gè)更好?

Choosing R or Python for data analysis? An infographic

散大大 寫給Python數(shù)據(jù)科學(xué)家們 : 科學(xué)計(jì)算開發(fā)環(huán)境排雷

作為分享主義者(sharism),本人所有互聯(lián)網(wǎng)發(fā)布的圖文均遵從CC版權(quán),轉(zhuǎn)載請(qǐng)保留作者信息并注明作者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog...,如果涉及源代碼請(qǐng)注明GitHub地址:https://github.com/harryprince。微信號(hào): harryzhustudio
商業(yè)使用請(qǐng)聯(lián)系作者。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/37871.html

相關(guān)文章

  • PythonR、Matlab的對(duì)比

    摘要:我們來看一下美國相關(guān)專業(yè)人員對(duì)兩者的對(duì)比,只是粗略而不精準(zhǔn)的翻譯一下。小結(jié)其實(shí)在寫這篇文章之前,我就問過一下包括清華在內(nèi)的學(xué)校以及一些數(shù)學(xué)專業(yè)的學(xué)生,和還是占主流,但是經(jīng)過一番調(diào)查發(fā)現(xiàn)在美國在數(shù)據(jù)科學(xué)數(shù)學(xué)等方面好像漸成壓倒性的優(yōu)勢。 作為一枚程序員,想要研究Python編程語言與數(shù)學(xué)學(xué)習(xí)(教學(xué))的結(jié)合,就不能不了解以及比對(duì)一下其他數(shù)學(xué)學(xué)習(xí)與應(yīng)用的解決方案,比如R語言、Matlab等數(shù)學(xué)...

    yunhao 評(píng)論0 收藏0
  • []深入對(duì)比數(shù)據(jù)科學(xué)具箱PythonR 的 Web 編輯器

    摘要:概述工欲善其事必先利其器,如果現(xiàn)在要評(píng)選數(shù)據(jù)科學(xué)中最好用的編輯器注意一定是可以通過訪問的,和一定是角逐的最大熱門,正確使用編輯器可以很大地提升我們的工作效率。 概述 showImg(https://segmentfault.com/img/bVAdol); 工欲善其事必先利其器,如果現(xiàn)在要評(píng)選數(shù)據(jù)科學(xué)中最好用的Web 編輯器(注意一定是可以通過Web訪問的),RStudio和Jupyt...

    RobinQu 評(píng)論0 收藏0
  • [] 深入對(duì)比數(shù)據(jù)科學(xué)具箱Python R 的異常處理機(jī)制

    摘要:對(duì)于異常機(jī)制的合理運(yùn)用是直接關(guān)系到碼農(nóng)飯碗的事情所以,本文將具體介紹一下和的異常處理機(jī)制,闡明二者在異常處理機(jī)制上的異同。下面將具體介紹二者的異常處理機(jī)制。 概述 showImg(https://segmentfault.com/img/remote/1460000006760426); 異常處理,是編程語言或計(jì)算機(jī)硬件里的一種機(jī)制,用于處理軟件或信息系統(tǒng)中出現(xiàn)的異常狀況(即超出程序正...

    FreeZinG 評(píng)論0 收藏0
  • []深入對(duì)比數(shù)據(jù)科學(xué)具箱PythonR 非結(jié)構(gòu)化數(shù)據(jù)的結(jié)構(gòu)化

    摘要:則在讀取數(shù)據(jù)時(shí)將兩個(gè)中文字段混淆成了一個(gè)字段,導(dǎo)致整個(gè)數(shù)據(jù)結(jié)構(gòu)錯(cuò)亂。三條路子全軍覆沒,這讓我情何以堪,好在使用的經(jīng)驗(yàn)頗豐,通過中文的轉(zhuǎn)換和切割就輕松解決了這個(gè)問題。 概述 showImg(https://segmentfault.com/img/bVylLL); 在現(xiàn)實(shí)場景中,由于數(shù)據(jù)來源的異構(gòu),數(shù)據(jù)源的格式往往是難以統(tǒng)一的,這就導(dǎo)致大量具有價(jià)值的數(shù)據(jù)通常是以非結(jié)構(gòu)化的形式聚合在一起的...

    leiyi 評(píng)論0 收藏0
  • [譯] 深入對(duì)比數(shù)據(jù)科學(xué)具箱Python R 的 C/C++ 實(shí)現(xiàn)

    摘要:另外一個(gè)我們同時(shí)使用兩種語言的原因是已有的統(tǒng)計(jì)學(xué)工具與包。對(duì)另一些為讀者寫數(shù)據(jù)科學(xué)工具的人來說他們從一開始就考慮了這些跨語言。和實(shí)際上是用實(shí)現(xiàn)的這是條阻力最小的路徑。無論是哪個(gè)贏得這場語言戰(zhàn)爭,和都將保持在數(shù)據(jù)科學(xué)屆的地位。 showImg(https://segmentfault.com/img/remote/1460000006762469); 概述 幾周前,我有幸在 Scipy ...

    jimhs 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<