表是最典型的数据存储方式。在Python环境下操作数据表,没有比Pandas更好的工具了。尽管Pandas具有广泛的功能,但它也有局限性。例如,如果数据集超过内存大小,则必须选择替代方法。但是,如果记忆合适,放弃Pandas并使用其他东西是否有意义?Pandas是一种方便的表格数据处理器,它提供了多种方法来加载、操作数据集并将其导出为各种输出格式。Pandas可以处理大量数据,但受到PC内存的限制。数据科学有一条黄金法则。如果数据完全适合内存(内存足够大),请使用Pandas。这个规定现在还有效吗?为了对此进行测试,让我们在中等大小的数据集上探索一些替代方案,看看我们是否可以从中受益,或者让我们确保只使用Pandas就可以了。您可以在GitHub上查看完整代码pandas_alternatives_POC.ipynb—探索dask、spark、vaex和modinjulia_POC.ipynb—探索julia和julia性能测试Performance_test.py—运行python性能测试控制台运行Results_and_Charts.ipynb—处理性能测试日志并创建图表Pandas替代品让我们首先探讨反对Pandas替代品的论点。1.它们不像Pandas那样普遍1.文档、教程和社区支持较少我们将一一审查几个备选方案,并比较它们的语法、计算方法和性能。我们将了解Dask、Vaex、PySpark、Modin(全部使用Python)和Julia。这些工具可以分为三类:并行/云计算——Dask、PySpark和Modin内存高效利用——Vaex不同的编程语言——Julia数据集对于每个工具,我们将使用Kaggle欺诈检测数据集来比较基本操作速度.它包含两个文件traintransaction.csv(~700MB)和trainidentity.csv(~30MB)我们将加载、合并、聚合和排序以查看性能有多快。我将在具有16GBRAM的4核笔记本电脑上执行这些操作。主要操作包括加载、合并、排序和聚合数据Dask-并行数据框架Dask的主要目的是并行化任何类型的Python计算-数据处理、并行消息处理或机器学习。扩展计算的方法是利用计算机集群的能力。即使在一台PC上,也可以利用多个处理核心来加速计算。Dask处理数据帧的模块化方式通常被称为DataFrame。它的力量源自并行性,但也有代价:1.DaskAPI不如Pandas的API丰富1.结果必须具体化Dask的语法与Pandas非常相似。如您所见,两个库中的许多方法都是相同的。但是dask基本上没有排序选项。那是因为并行排序是特殊的。Dask只提供了一种方法,set_index。按定义索引排序。这个想法是使用Dask来完成繁重的工作,然后将减少的、较小的数据集移动到pandas进行最终处理。这导致了第二个警告。查询结果必须使用.compute()命令具体化。与PySpark一样,dask不会提示您进行任何计算。准备所有步骤并等待启动command.compute()然后开始工作。为什么我们需要compute()来得到结果?你可能会想,为什么我们不像在Pandas操作中那样立即得到结果呢?原因很简单。Dask主要用于数据大于内存的情况,初始操作的结果(例如加载巨大的内存)无法实现,因为你没有足够的内存来存储它。这就是为什么要准备计算步骤,然后让集群进行计算,然后返回一个仅包含结果的较小集合。这是当前分布式计算框架中的常见做法。#dask代码例如这样:df=dd.read_csv(path)d2=dd.read_csv(path2)re=df.merge(d2,on="col")re=re.groupby(cols).agg(params).compute()Dask性能如何比较用于不同目的的两个平台的速度并非微不足道。结果也可能受到数据的影响。一种工具可以非常快速地合并字符串列,而另一种工具则擅长整数合并。为了展示这些库有多快,我选择了5个操作并比较了它们的速度。我重复了7次性能测试,我测得的CPU和内存使用率从未超过PC的50%(i7-5600@2.60Ghz,16GBRam,SSD)。除了操作系统和性能测试,没有其他进程在运行。load_transactions—读取约700MBCSV文件load_identity—读取约30MBCSV文件merge—通过字符串列合并这两个数据集aggregation—将6列分组并计算总和和平均排序—正确合并数据集进行3种排序(如果库允许)它看起来Dask可以非常快速地加载CSV文件,但原因是Dask的惰性操作模式。加载被推迟,直到我在聚合期间具体化结果。这意味着Dask只准备加载和合并,但具体的加载操作是与聚合一起执行的。Dask几乎不支持排序。甚至官方指南也说要并行运行计算,然后将计算结果(和较小的结果)传递给Pandas。即使当我尝试计算read_csv结果时,Dask在我的测试数据集上也慢了大约30%。这仅证实了最初的假设,即当您的数据集太大而无法加载到内存中时,Dask主要有用。PySpark是Spark(分析大数据引擎)的pythonAPI。Spark在Hadoop平台之上发展壮大,可能是最流行的云计算工具。它是用Scala编写的,但是pySparkAPI中的许多方法允许您在不损失python开发速度的情况下进行计算。与Dask类似,首先定义所有操作,然后运行??.collect()命令以获得结果。除了收集之外还有更多选项,您可以在spark文档中阅读它们。PySpark语法Spark使用弹性分布式数据集(RDD)进行计算,操作它们的语法与Pandas非常相似。通常有产生相同或相似结果的替代方法,例如sort或orderBy方法。首先,必须初始化一个Spark会话。然后使用pythonAPI准备步骤,或者使用SparkSQL编写SQL代码直接操作。如果只是为了测试,则不必安装spark,因为PySpark包附带了一个spark实例(独立模式)。但是,必须在PC上安装Java。Spark性能我使用pySpark运行了相同的性能测试,如Dask部分所述,结果相似。区别在于spark读取csv的一部分来推断数据的模式。在这种情况下,它比将整个数据集加载到Pandas中花费更多的时间。Spark是利用大型集群的力量进行海量计算的优秀平台,它可以对庞大的数据集进行快速处理。但是在相对少量的数据上使用Spark不会产生所需的加速。Vaex到目前为止,我们已经看到了将工作分散到更多计算机核心上的平台,并且通常在集群中的多台计算机之间进行。他们还不能打败Pandas,而Vaex的目标就是做到这一点。作者创建这个库是为了更快地对数据集进行基本分析。Vaex虽然不支持Pandas的全部功能,但可以计算基本统计数据并快速创建某些图表类型。Vaex语法Pandas和vaex语法之间没有太大区别。Vaex的性能不同于前两个工具,Vaex的速度非常接近Pandas,在某些地区甚至更快。通常pandas会没事,但也有可能遇到困难,这时候可以试试下面的vaex。JuliaJulia在数据科学界相当受欢迎。虽然尚未取得突破,但已被预测前途光明,被Julia的处理方式所爱的人也不少。与Python不同,Julia是一种编译型语言。这通常会带来更好的性能。两种语言都可以在jupiternotebooks上运行,这也是Julia流行于数据科学证明的原因。Julia语法Julia是专门为数学家和数据科学家开发的。尽管Julia是一种不同的语言,但它以Python的方式做很多事情,并在适当的时候使用自己的技巧。另一方面,在python中,完成同一个功能的库有很多种,这对初学者来说很不友好。但是Julia提供了内置的方法来做一些基本的事情,比如读取csv。我们来比较一下pandas和julia在数据加载、合并、聚合和排序方面的性能。Julia性能衡量Julia的速度并不是那么简单。第一次运行任何Julia代码时,即时编译器需要将其翻译成计算机语言,这需要一些时间。这就是为什么任何代码的第一次运行都比后续运行花费更长的时间。在下图中,您可以看到第一次运行花费的时间明显长于其余六次测量的平均值。我还尝试过在单核(julia)和4个处理器核(julia-4)上运行Julia。通过将环境变量JULIANUMTHREADS设置为要使用的内核数,可以运行具有更多内核的julia。从1.5开始,您可以通过julia-tn或julia--threadsn启动julia,其中n是所需的核心数。使用更多内核的处理通常更快,而且julia对开箱即用的并行化有很好的支持。您可能担心编译速度,但您不需要,代码将编译一次,更改参数不会强制重新编译。例如编译CSV.read(joinpath(folder,file),DataFrame)后,即使更改源文件的路径,下面的调用也不会编译处理。这就是您在load_identity步骤中看不到任何延迟的原因,因为CSV在读取之前已经编译过了。Modin在结束关于Pandas替代品的讨论之前,我必须提到Modin库。它的作者声称modin利用并行性将Pandas函数的速度提高了80%。遗憾的是,作者所声称的速度提升目前还没有找到。有时它会在Modin库导入命令的初始化期间中断。有的时候modin提示:“不支持,默认pandas”,然后运行最后崩溃,只剩下4个python进程,每个都占用大量内存。让我花一些时间之后杀死这些进程。我喜欢modin背后的想法,我希望有一天这些差距会被弥合,以便modin被提升为一个值得考虑的替代方案。结论我们探索了几种流行的Pandas替代方案,看看在数据集小到足以完全放入内存的情况下使用其他替代方案是否有意义。目前,还没有并行计算平台可以在速度上超越Pandas。鉴于它们更复杂的语法、额外的安装要求以及缺乏某些数据处理能力,这些工具并不是pandas的理想替代品。Vaex展示了在数据探索过程中加速某些任务的潜力。这种好处在更大的数据集中变得更加明显。Julia的开发考虑到了数据科学家的需求。它可能不如Pandas受欢迎,也可能没有Pandas提供的所有技巧。对于某些操作,它可以提供性能提升,我必须说,一些代码在Julia中更优雅。即使Julia没有进入前20名最流行的编程语言,我认为它有未来,如果你关注它的发展,你就不会犯错误。最后,如果你想重现这些结果,请查看这段代码:github/vaclavdekanovsky/data-analysis-in-examples/tree/master/DataFrames/Pandas_Alternatives为了评估,让我们继续使用pandas。另外,这里还有一个小技巧。Pandas读取csv的速度非常慢。比如我经常读取5-10G左右的csv文件。这个时候我用topicickle,第一次读取后保存为pickle文件,后面加载的时候用。readpickle读取pickle文件,不仅速度会快10倍,文件大小也会减少2-5倍(减少的程度取决于你的dataframe的内容和数据类型)。最后的总结还是那句话,当所有的数据都可以加载到内存的时候,用Pandas就对了
