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

Pandas2.0简介及速度测评

时间:2023-03-25 21:02:25 Python

Pandas是机器学习中最常用的库之一,我们基本上每天都用它。而pandas使用了一个“NumPy”作为后端,这个大家都知道,不过最近Pandas2.0的RC版本最近发布了。此版本主要包括错误修复、性能改进和添加ApacheArrow后端。在使用DF时,Arrow比Numpy有很多优势。PyArrow可以有效地处理内存中的数据结构。它可以提供一种标准化的方式来表示复杂的数据结构,尤其是在大数据环境中,并使不同应用程序和系统之间的数据交换更加容易。在本文中,我们将简要介绍和回顾,为什么pandas选择Arrow作为后端,以及如何在pandas2.0中开始使用Arrow(虽然它不是默认选项)。Pandas<2.0和Pandas2.0有什么区别?Pandas2.0不仅支持NumPy作为后端,还支持PyArrow。建议新开一个虚拟环境作为测试,先安装pipinstallpandas==2.0.0rc0pipinstallpyarrow然后查看版本:importpandasaspdprint(pd.__version__)Arrowbackend不是默认的,所以我们正在使用Arrow,但也明确指定:>>>pd.Series([5,6,7,8],dtype='int64[pyarrow]')05162738dtype:int64[pyarrow]可以看到,dtype参数现在是Arrow。数据类型也变为int64[pyarrow]而不是我们使用Numpy时的int64。我们也可以默认设置Arrowimportpandasaspdpd.options.mode.dtype_backend='pyarrow'。这是RC版本,将来可能会更改。例如,如果要使用PyArrow读取CSV,则必须使用以下代码。importpandasaspdpd.options.mode.dtype_backend='pyarrow'pd.read_csv("file_name.csv",engine='pyarrow',use_nullable_dtypes=True)速度对比根据官方介绍,我们都知道使用Arrow是主要是为了提高速度,我们来做个简单的测试:使用NumPy和PyArrow读取同一个CSV文件,比较两者的区别。%%time#Pandas+Numpydf_with_numpy=pd.read_csv("randomDF.csv",sep=";")%%time#Pandas+PyArrowdf_with_pyarrow=pd.read_csv("randomDF.csv",sep=";",engine='pyarrow',use_nullable_dtypes=True)通过执行这几行代码,我们将看到PyArrow只占用NumPy的10%左右的时间!再看看其他的测试,比如读取parquet文件,求和,求平均等:以上测试结果来自这里:https://datapythonista.me/blog/pandas-20-and-the-arrow-revolu...你可以看到Arrow总是更快。在字符串的情况下,差异更大,这是有道理的,因为NumPy实际上并不是为处理字符串而设计的(尽管它可以支持字符串)。Pandas2.0的一些优点1.速度不用说了,有了Arrow的优势,如上所见快多了2.缺失值pandas表示缺失值的方法是将数字转为浮点数数字并使用NaN作为缺失值。>>>pd.Series([5,6,7,None])0516273NaNdtype:float64这不是最好的方案,因为NaN也有类型,比如Int的NaN和Int的NaNfloat64在某些方面仍然不同。虽然Arrow可以处理缺失值,但让我们看一下同一个示例,但现在使用Arrow支持的类型。pd.Series([5,6,7,None],dtype='int64[pyarrow]')0516273dtype:int64[pyarrow]3.像CSV文件一样的互操作性可以作为读取通过pandas或在Excel中打开,Arrow也可以通过不同的程序访问,例如R、Spark和Polars。这样做的好处是在这些程序之间共享数据简单、快速且内存效率高。4.Copy-on-Write这是一种内存优化技术,用于在处理大型数据集时提高性能并减少内存使用。它是这样工作的:当您复制一个pandas对象(例如DataFrame或Series)时,pandas不会立即创建数据的新副本,而是创建对原始数据的引用并推迟创建新副本,直到您修改数据某种程度上来说。这意味着如果相同数据有多个副本,它们都可以引用相同的内存,直到对其中一个进行更改。这种方法可以显着减少内存使用并提高性能,因为不需要进行不必要的数据复制。5.更好的索引,更快的访问和计算索引现在可以是NumPy数值类型,Pandas2.0允许索引保存为任何NumPy数值类型的dtypes,包括int8、int16、int32、int64、uint8、uint16、uint32、uint64、float32,和float64。在2.0之前,只支持int64、uint64和float64类型。这样也可以节省内存空间,提高计算效率。总结虽然Pandas2.0的正式版还没有发布,但是pandas2.0添加Arrow后端标志着该库的重大进步。通过Arrow实现提供更快、更节省内存的操作,pandas现在可以更好地处理复杂和广泛的数据集。正式版尚未发布,因此本文内容也可能与发布的正式版有所不同。我们这里只是做了一个简单的评测,待正式版发布后我们再做更详细的对比和介绍。https://avoid.overfit.cn/post/dd0d9e9417634625be08d9faa9411644