当前位置: 首页 > 后端技术 > Python

【原创】数据科学工具箱深度对比:Python3与R之战【2020版】

时间:2023-03-26 13:25:25 Python

概述R与Python2/Python3在过去十年间(在熊猫)。随着时间的推移,竞争格局也从混乱变得清晰起来。R从诞生之日起就继承了S语言的统计特性,经历了残酷的成长。2009年ggplot2和data.table的出现,大大提高了数据可视化分析的效率,极大地冲击了早期的数据科学市场。要知道那个时候数据科学也主要被商业软件Excel、SAS、Matlab所统治。作为数据科学开源软件的先驱,R语言在多个商业应用领域不断演进。贝叶斯、空间分析、网络分析、时间序列分析、生存分析等在代码库CRAN和GitHub上开始快速增长,直到2015年RevolutionR被微软公司收购达到高潮。Python最初是一种胶水语言,广泛应用于Web开发、嵌入式开发、运维测试等领域,但在数据科学领域应用并不广泛。不过自2015年大数据和深度学习的人工智能革命以来,Python中的两大开源框架PySpark和Tensorflow开始大放异彩,全民学习Python的热情也随之高涨。Python成功实现了在数据科学领域的逆袭。生态比较DomainPython3R基础数据处理Pandas/DplythonTidyverse/Dplyr基础数据处理(py)datatabledata.table并行计算(数据密集型)Koalas/PySparkSparklyr/SparkR并行计算(计算密集型)Dask/ModinDisk.frameNetworkminingNetworkx/Graph-toolTidygraphGeographyMiningGeopandas/RasterioSf/RasterTimingMiningSktime/BacktraderFable/QuantstratImageProcessingOpenCVmagickTextProcessingSpaCytidytextBasicStatisticalToolsStatsmodelstidymodelBayesianStatisticsPyMC3/PyStanBrms/Rstanarm/ShinystanMachineLearningSklearnMlrDeepLearningTensorflow/MxnetTensorflow/MxnetReinforcementLearningRLlib/GymReinforcementSimulationModelingSimpySimmerOperationalResearchOptimizationCvxpylayers/Ortools/PyomoCVXR/omprPrototypingDash/DjangoShiny/FlexdashboardDataExplorationPlotly/Matplotlib/PlotninePlotly/Ggplot2/Esquisse一、数据处理工具对比数据处理工具目前大致分为两个方向:1、高性能单机2.分布式处理从2016年开始,Python和R的数据处理工具不断融合,取长补短,取长补短,易用性和生产力也相媲美。基本上已经形成了以pandas(Python)和tidyverse(R)为核心的两个前端语法体系,后端计算引擎包括Spark、Dask、data.table等。单机版Pandas章节中的术语在单机处理的基础上,Python形成了以Pandas为核心的主流基础数据流处理框架,涵盖了从数据IO、CRUD、数据透视、数据可视化的全流程,并通过Dplython可以实现类似于R.Tidyverse的管道操作语法。示例如下:尝试读取iris数据集并进行分组计数:PythonversionimportpandasasppdfromDplythonimport*df=pd.read_csv("~/tmp.csv")res=df>>\select(X.Sepal_Length,X.Species)>>\group_by(X.Species)>>\summarize(cnt=X.Species.count())res.plot()R版本库(tidyverse)df=readr::read_csv("~/tmp.csv")res=df%>%select(Sepal.Length,Species)%>%group_by(Species)%>%summarise(cnt=n())%>%plot()Data.table单机数据处理另一个重要的流派是data.table系统,它以其计算性能而闻名。经过10多年的不断优化,基于C语言开发的data.table在单机数据处理的性能和稳定性上已经刷爆了大部分框架。以下是data.table最新的性能测评。在GroupBy算子处理50G数据的性能对比中,data.table以123s的成绩优于同类工具。在评估中,我们看到原始dplyr的性能比data.table慢了20倍(这要归功于data.table在数据处理过程中最大限度地减少了内存复制)。目前data.table开发了data.table(R)和datatable(Python)两个版本,其中data.table(R)在性能上略有优势。同样与iris示例进行比较:Python版本importdatatableasdtdf=dt.fread("tmp.csv")df[:,dt.count(),dt.by("Species")]#|**物种计数**#\--+----------\-----#0|setosa50#1|杂色50#2|virginica50R版本库(data.table)df=data.table::fread("tmp.csv")df[,.N,by=.(Species)]#SpeciesN#1:setosa50#2:versicolor50#3:virginica50但是,很多用户反映data.table的[where,select,group_by]语法不如dplyr好用。幸运的是,通过Hadley在R中开发的dtplyr工具,我们可以直接使用data.table作为dplyr的后端计算引擎,免去了切换框架的麻烦。示例R代码:library(data.table)library(dtplyr)library(dplyr,warn.conflicts=FALSE)iris%>%lazy_dt()%>%select(Sepal.Length,Species)%>%group_by(Species)%>%summarise(cnt=n())#SpeciesN#1:setosa50#2:versicolor50#3:virginica50DistributedPySpark在分布式处理方面,虽然PySpark框架经常被批评易用性,但是得益于先发优势和庞大的码农基数,成为最主流的分布式数据处理框架,涵盖了从数据IO、SQL、UDF定义、数据透视、模型训练全流程,并通过Koalas可以在R中实现类似Sparklyr的流水线操作语法,让用户只需要掌握Pandas,无需学习RDD,即可实现数据操作。这里还是以irisgroupcount为例:PythonversionfrompysparkimportSparkConf,SparkContextconf=SparkConf()conf.set('spark.executor.memory','2g')#Koalas自动复用Spark配置SparkContext(conf=conf)将熊猫导入为pdimportdatabricks.koalasasksdf=pd.read_csv("tmp.csv")sdf=ks.from_pandas(df)sdf[['Sepal.Length','Species']].\groupby('Species').\count()#Sepal.Length#Species#setosa50#versicolor50#virginica50R版本库(sparklyr)sc=spark_connect("localhost",conf=spark_conf())sdf=copy_to(sc,iris,name="iris")#复制数据到sparkclustersdf%>%select(Sepal_Length,Species)%>%group_by(Species)%>%summarise(cnt=n())%>%collect()Disk.frame前面提到过但是,另一种数据处理流派是data.table。基于data.table的分布式处理框架是disk.frame。disk.frame和Spark最大的区别在于disk.frame优先处理计算密集型任务。复杂的模型计算任务,让数据跟着计算;Spark使用Map-Reduce模型,计算跟随数据,因此更擅长数据密集型的简单ETL计算任务。正是因为计算模型不同,disk.frame可以直接运行所有本地安装的模型库,无需额外打包。但是PySpark通常还需要将相关的Python依赖包打包到conda环境的zip文件中,操作过程比较麻烦。所以,相对来说,尤其是在训练数据量很大的模型的过程中,disk.frame在处理几个csv文件夹的时候,是非常流畅的,速度快如闪电!因此,disk.frame特别适用于强化学习、图形模型、模拟计算等计算密集型任务。幸运的是,Python世界中有两个类似disk.frame的工具,一个是Dask,一个是Modin。一方面,它们都提供了类似于Pandas的数据操作语法,另一方面,这两个项目也在不断融合。目前,Dask相对更加成熟。还是以iris为例做对比:R版本:library(disk.frame)setup_disk.frame()#thisallowslargedatasetstobetransferredbetweensessionoptions(future.globals.maxSize=Inf)path_to_data<-"path/to/数据/"ddf<-csv_to_disk.frame(paste0(path_to_data,"combined.csv"),outdir=paste0(path_to_data,"combined.df"),in_chunk_size=2e6,backend="LaF")ddf%>%select(Sepal_Length,Species)%>%group_by(Species)%>%summarise(cnt=n())%>%collect()Python版本importdask.dataframeasddddf=dd.read_csv("tmp.csv")ddf[['Sepal.Length','Species']].\groupby('Species').\count()2.野外数据挖掘比较野外数据挖掘可分为1.序列数据挖掘2.空间数据挖掘根据数据维度3.从2016年开始,网络数据挖掘在领域数据挖掘中也继承了以pandas(Python)和tidyverse(R)为核心的两个前端语法体系,并在此基础上改造了data.frame结构根据不同的领域lds,以便进行数据分析。序列数据挖掘tidyverts自然界中最简单的数据就是序列数据,任何事物都在时间序列维度上留下痕迹。就时序挖掘而言,从2016年开始,在R中形成了以Tidyverts为核心的主流时序数据处理框架,包括数据IO、时序补全、时间索引(tsibble)、时序建模(fable),timeseries半自动可视化(feasts)全过程,其中时间序列建模替代经典工具预测,全面覆盖经典统计(autoarima)、贝叶斯推理(prophet)、深度学习(keras)等。相对而言,Python在时间序列建模方面起步较晚,在宏观经济数据分析方面应用较少,多用于微观行为建模。目前以sktime为主,tsfresh、gluon-ts、pmdarima、prophet等,在工具分散的情况下,生态还在逐渐成熟的过程中,东风借助Tensorflow和LSTM迅速崛起.这里主要介绍R中带有时间索引的tsibble数据结构,tsibble=ts+tibble,利用时序数据的特点,在data.frame中引入了key和group的概念,大大提高了计算效率通过时间索引,支持滑动窗口、固定窗口、永久窗口等窗口功能。R版本库(dplyr)库(lubridate)库(tsibble)weather_tsbl<-nycflights13::weather%>%select(origin,time_hour,temp,humid,precip)%>%as_tsibble(key=origin)weather_tsbl%>%group_by_key()%>%index_by(date=~as_date(.))%>%summarise(temp_high=max(temp,na.rm=TRUE),temp_low=min(temp,na.rm=TRUE))#>#Atsibble:1,092x4[1D]#>#Key:origin[3]#>origindatetemp_hightemp_low#>#>1EWR2013-01-014128.0#>2EWR2013-01-0234.024.1#>3EWR2013-01-0334.026.1#>4EWR2013-01-0439.928.9#>5EWR2013-01-0544.132#>#…还有1,087个rowtidytext篇library(tidytext)library(dplyr)text_df<-c("因为我不能为死亡而停下来-","他亲切地为我停下来-","马车停住了,但只有我们自己-","andImmortality")%>%tibble(line=1:4,text=.)text_df%>%unnest_tokens(word,text)###Atibble:20x2##lineword####11because##21i##31could##41not##51stop##61for##71death##82he##92kindly##102stopped###…还有10行spaCyimportspacyfromdframcyimportDframCynlp=spacy.load('en_core_web_sm')dframcy=DframCy(nlp)doc=dframcy.nlp(u'Apple正在考虑以1收购英国初创公司billion')annotation_dataframe=dframcy.to_dataframe(doc)空间数据挖掘sf文章geopandasvs.CNN文章网络数据挖掘tidygraph文章networkxvs.GNN文章总结R社区的活跃度有所下降,但生产能力的弱点在不断改善而Python2逐渐放弃维护,Python3取代Python2和R成为新一代人工智能的主流编程语言。参考资料https://docs.blazingdb.com/docshttps://www.brodrigues.co/blo...https://rapids.ai/community.html在这个人人拥抱python的时代,R真的out了吗?将Python2迁移到Python3网络包比较2020年https://github.com/r0f1/datas...https://robjhyndman.com/categ...https://www.timlrx.com/2019/0...https://tidyverts.github.io/t...https://robjhyndman.com/hynds...https://github.com/alan-turin...https://spacy.io/usage/facts-...https://www.tensorflow.org/tu...https://eng.uber.com/omphalos/https://eng.uber.com/forecast...https://slides.earo.me/