在数据科学领域,Pandas库因其数据处理的强大功能而广受欢迎。然而,面对大规模数据集时,Pandas的性能瓶颈变得明显。这是因为Pandas无法并行执行任务,仅利用单个CPU核心运行程序。为了解决这一问题,可能需要转向如Spark这样的分布式计算平台。但这些平台的维护相对复杂,需要理解其计算范式和内部工作原理,对初学者来说门槛较高。Modin库的出现正是为了解决这一问题,它允许用户通过修改一行代码,使Pandas代码并行运行。
Modin是由加州大学伯克利分校RISELab开发的开源库,旨在通过分布式计算加速计算速度。Modin在后端使用Ray/Dask库来并行化代码,用户无需具备分布式计算知识即可使用Modin。Modin DataFrame提供了与Pandas相似的API,因此用户可以继续使用熟悉的Pandas API。Modin在四核笔记本电脑上的速度提升可达4倍,适用于从1MB到1TB大小的数据集。
Modin可以通过pip命令安装,并使用Ray/Dask库作为后端。如果计算机上尚未预安装Ray/Dask库,可以通过以下命令安装Modin及其依赖项:
pip install "modin[ray]" # 安装Modin依赖项和Ray以在Ray上运行
pip install "modin[dask]" # 安装Modin依赖项和Dask以在Dask上运行
pip install "modin[all]" # 安装上述所有内容
Modin的高级架构图如下所示。目前,可以使用Modin与Pandas API一起使用。SQLite API在Modin中处于实验模式。未来,Modin开发者计划为Modin开发独立的API,但目前尚未开发。位于API层下方的查询编译器层将组合查询并根据数据格式执行一些优化。Modin将与Ray/Dask作为后端运行。由于Modin是一个开源库,也可以使其与自己的后端库一起工作,尽管可以直接在Python中运行Modin而不需要后端,但这不会达到目的,因为Modin本身不能并行运行代码。
Modin DataFrame沿行和列进行分区,每个分区是一个单独的Pandas DataFrame。可以通过使用repartition()方法来更改Modin中的默认分区。
可以通过替换Pandas为Modin,仅需一行代码:
import modin.pandas as pd
以下是使用Modin和Pandas读取CSV文件的时间比较:
import modin.pandas as pd
import time
start_time = time.time()
data_modin = pd.read_csv("../input/uwmgi-mask-dataset/train.csv")
end_time = time.time()
duration = end_time - start_time
print("Time taken to run the code " + str(duration))
输出结果:
Time taken to run the code 0.4164540767669678
与Pandas相比:
import pandas
import time
start_time = time.time()
data_pandas = pandas.read_csv("../input/uwmgi-mask-dataset/train.csv")
end_time = time.time()
duration = end_time - start_time
print("Time taken to run the code " + str(duration))
输出结果:
Time taken to run the code 0.6549224853515625
Pandas是一个包含广泛API的大型库。尽管Modin支持Pandas的流行API,但它并不支持Pandas的所有API。对于Modin中未实现的函数,它们会自动回退到Pandas。因此,对于未在Pandas中实现的函数和用户定义的函数(Pandas中的apply函数),Modin会将Modin DataFrame转换为Pandas DataFrame,然后应用这些函数。转换为Pandas DataFrame会有一些性能损失。
Dask、Vaex、Ray、Cudf和Koalas是Modin的一些流行替代品。像Dask和Koalas这样的库试图以自己的方式解决大数据集的性能问题,但它们不会保留Pandas API的行为,必须对Pandas代码进行重大更改,使其在dask/Koalas上运行。此外,Dask/Koalas仅支持行分区,而Modin支持DataFrame的行、列和单元格分区,这有助于Modin支持广泛的Pandas API。由于对分区的控制,Modin支持像transpose()、quantile()和median()这样的Pandas方法,这些方法很难应用于基于行的数据分区。