图片来源于网络 文/Python数据科学
之前和大家分享过一篇关于提速pandas的文章,主要是在pandas的具体操作用法上提出了一些改进,
用这几个方法提高pandas运行速度
但方法的改进上难免会遇到上限瓶颈,比如数据非常大的时候。最近看到了一篇也是关于对pandas提速的文章,但是从另一个角度,工具。使用它可以很好的突破操作优化上的瓶颈,而这个工具就是Modin。
Modin存在的意义就是:
更改一行代码来提速pandas工作流程。
Pandas在数据科学领域就无需介绍了,它提供高性能,易于使用的数据结构和数据分析工具。但是,在处理过多的数据时,单核上的Pandas就显得心有余而力不足了,大家不得不求助于不同的分布式系统来提高性能。然而,提高性能的权衡伴随着陡峭的学习曲线。从本质上讲,用户可能只是希望Pandas运行得更快,并不希望对其特定的硬件设置优化其工作流程。这意味着大家希望使用
相同Pandas脚本作用于
10KB数据集和10TB数据集。 Modin对优化pandas提供了解决方案,以便数据科学家可以花更多时间从数据中提取价值,而不是在工具上。
Modin
Modin是加州大学伯克利分校RISELab的早期项目,旨在促进分布式计算在数据科学中的应用。
它是一个多进程Dataframe库,具有与pandas相同的API,允许用户加速其Pandas工作流程。
Modin在8核计算机上将Pandas查询加速4倍,只需要用户更单行代码。该系统专为现有的Pandas用户而设计,他们希望程序能够更快地运行并且无需重大代码更改即可更好地扩展。这项工作的最终目标是能够在云设置中使用Pandas。
Modin是完全开源的,可以在GitHub上找到:
https://github.com/modin-project/modin
Modin可以从PyPI安装:
pip install modin
对于Windows,其中一个依赖项是Ray。在Windows上本身尚不支持Ray,因此为了安装它,需要使用WSL(适用于Linux的Windows子系统)。
Modin是如何加速运行的?
在笔记本电脑上
考虑一款4核现代笔记本电脑,dateframe可以很好地适用其上。pandas只使用其中一个CPU核,但是,modin确使用了所有的核。
pandas vs modin CPU核使用对比
modin所做的基本上就是增加了CPU所有内核的利用率,从而提供了更好的性能。
在一个更大型机器上
在大型机器上,modin的有利用率变得更加明显。让我们假装有一些服务器或一些非常强大的机器。pandas仍将使用单核,而modin将使用全部核。以下是144核心计算机上read_csv操作下,pandas和modin的性能比较。
pandas有一个很明显的线性增长,这是因为它一直只使用一个核。可能很难看到绿色条纹,因为modin的运行时间非常短。
Modin的架构
我们来看看Modin的架构。
DataFrame分区
分区模式沿着列和行分区,因为它在列数和支持的行数方面给Modin
提供了
灵活性和可伸缩性。
Modin被分成不同的层:
modin的标准架构
在Modin中实现pandas API
pandas API是非常多的,这可能是它具有如此广泛的应用的原因。
pandas API
在这么多的操作下,modin遵循了一种数据驱动的方法。意思是说modin的创造者分析了一下大多数人在pandas中所使用的操作。他们去了Kaggle并对那里出现的脚本和笔记进行了大量搜索,并最终弄明白了最受欢迎的pandas方法如下:
pd.read_csv是目前pandas中使用最多的方法,其次是pd.Dataframe。因此,在modin中,他们开始实现这些方法并按照它们的受欢迎程度对它们进行优化:
Modin使用Ray提供了一种省事儿的方式来加速pandas的notebooks,脚本和库。Ray是一个高性能的分布式执行框架,面向大规模机器学习和强化学习应用程序。可以在单个机器上运行相同的代码以实现高效的多进程处理,并且可以在群集上使用它来进行大型计算。你可以在GitHub上找到Ray:
https://github.com/ray-project/ray
Usage
Importing
Modin包装了pandas并透明地分发数据和计算,通过一行代码更改加速了pandas的工作流程。用户继续使用以前的pandas notebooks,同时可以体验到Modin的相当大的加速,即使在一台机器上也是如此。只需要修改import语句,其中需要导入modin.pandas而不是简单的pandas。
import numpy as np
import modin.pandas as pd
我们使用由随机整数组成的Numpy构建一个数据集。注意,我们不必在此处指定分区。
ata = np.random.randint(0,100,size = (2**16, 2**4))
df = pd.DataFrame(data)
df = df.add_prefix("Col:")
当我们打印出类型时,它是一个Modin的数据框。
type(df)
modin.pandas.dataframe.DataFrame
如果我们用head命令打印出前5行,它会像pandas一样呈现HTML表。
df.head()
Modin管理数据分区和洗牌,以便用户可以专注于从数据中提取值。以下代码在具有32GB RAM的2013年4核iMac上运行。
pd.read_csv
read_csv是迄今为止最常用的pandas操作。当我们在pandas vs modin中使用read_csv时,可以快速地比较出来。
%%time
import pandas
pandas_csv_data = pandas.read_csv("../800MB.csv")
-----------------------------------------------------------------
CPU times: user 26.3 s, sys: 3.14 s, total: 29.4s
Wall time: 29.5 s
%%time
modin_csv_data = pd.read_csv("../750MB.csv")
-----------------------------------------------------------------
CPU times: user 76.7 ms, sys: 5.08 ms, total: 81.8 ms
Wall time: 7.6 s
使用Modin,只需更改import语句,read_csv在4核计算机上的运行速度可提高4倍。
df.groupby
pandas groupby编写得非常好,速度非常快。但即便如此,modin仍然胜过pandas。
%%time
import pandas
_ = pandas_csv_data.groupby(by=pandas_csv_data.col_1).sum()
-----------------------------------------------------------------
CPU times: user 5.98 s, sys: 1.77 s, total: 7.75 s
Wall time: 7.74 s
%%time
results = modin_csv_data.groupby(by=modin_csv_data.col_1).sum()
-----------------------------------------------------------------
CPU times: user 3.18 s, sys: 42.2 ms, total: 3.23 s
Wall time: 7.3 s
默认为pandas实现
如果想要使用尚未实现或优化的pandas API,实际上可以默认使用pandas。这使得该系统可用于使用尚未在Modin中实现操作的notebooks,即使性能会因为使用pandas API而
下降
。当默认为pandas时,你会看到一个警告:
dot_df = df.dot(df.T)
一旦计算完成,它将返回分布式Modin DataFrame。
type(dot_df)
-----------------
modin.pandas.dataframe.DataFrame
Modin仍然处于早期阶段,似乎是对pandas非常有前途的补充。Modin处理用户的所有分区和混洗,以便我们可以专注于我们的工作流程。Modin的基本目标是使用户能够在小数据和大数据上使用相同的工具,而无需担心更改API以适应不同的数据大小。
https://towardsdatascience.com/get-faster-pandas-with-modin-even-on-your-laptops-b527a2eeda74
https://rise.cs.berkeley.edu/blog/modin-pandas-on-ray-october-2018/
热 门 推 荐
用Python创建微信机器人
用Python机器人监听微信群聊
用Python获取摄像头并实时控制人脸
开源项目 | 用Python美化LeetCode仓库
推荐Python中文社区旗下的几个服务类公众号
征稿启事 | Python中文社区有奖征文
▼ 点击成为
社区注册会员
「在看」
一下,一起PY!
pip install
modin
如果您没有安装或 ,则需要使用以下目标之一安装 :
pip install
modin
[ray] # Install
Modin
dependencies and Ray to run on Ray
pip install
modin
[dask] # Install
Modin
dependencies and Dask to run on Dask
pip install
modin
[all] # Install all of the above
Modin
将自动检测您已安装的引擎并将其用于调度计算!
熊猫API覆盖率
莫丁的射线引擎覆盖率
Modin
的Dask引擎覆盖率
pd.DataFrame
pd.Series
pd.read_csv
:white_heavy_check_mark:
答案先写在开头,免得你们直接拉到下面看结果~
modin
.
pandas
确实能使得一部分函数使用多核cpu进行加速处理,但是现在有些功能还不完善,有些函数还是用的默认
pandas
处理…
具体哪些函数是可以加速的可以往下看看
主要测试了apply,groupby,read_csv
一、
Modin
.
pandas
在讲
modin
之前,简单介绍一下
pandas
,
pandas
主要是python用来处理数据的时候用到的一个库,并且为了追求效率,并不是用python写的,底层逻辑用的是c语言。而且对于各种计算逻辑已经被开发者开发到相对优秀的程度了。
但是即便如此,由于python本身语言的特点,
pandas
Modin
:用于统一与数据交互方式的库
通过更改一行代码来扩展您的
Pandas
工作
流程
要使用
Modin
,请替换
Pandas
导入:# import
pandas
as pd import
modin
.
pandas
as pd 安装
Modin
可以从 PyPI 安装: pip install
modin
如果您没有 Ray 或 Dask安装后,您需要使用以下目标之一安装
Modin
: pip install
modin
[ray] # 安装
Modin
依赖项和 Ray 以在 Ray 上运行 pip install
modin
[dask] # 安装
Modin
依赖项和 Dask 以在 Dask 上运行 pip install
modin
[ all] # 安装以上所有内容
Modin
将自动检测您安装了哪个引擎并使用它来调度计算!
Pandas
API Coverage
pandas
Object Ray Engine Coverage Dask Engine Coverage pd.DataFrame pd.Series pd.read_* 一些
Pandas
API 比其
通过更改一行代码来扩展熊猫
工作
流要使用
Modin
,请替换熊猫导入:#将
pandas
作为pd导入import
modin
.
pandas
作为pd安装可以从PyPI安装
Modin
:pip ins通过更改一行代码来扩展熊猫
工作
流要使用
Modin
,请替换
pandas
import:#将
pandas
as pd导入import
modin
.
pandas
as pd安装可以从PyPI安装
Modin
:pip install
modin
如果您没有安装Ray或Dask,则需要使用一个安装
Modin
目标的设置:pip install
modin
[ray]#安装
Modin
依赖项并在Ray上运行Ray pip install
modin
[dask]#安装
Modin
依赖项和Dask在Dask上运行pip install
modin
[all]#我
Modin
和熊猫Df的比较
Pandas
是一个图书馆,不需要在数据科学领域进行介绍。 它提供了高性能,易于使用的数据结构和数据分析工具。 但是,当处理大量数据时,单个核心上的熊猫就变得不够用,人们不得不求助于不同的分布式系统来提高其性能。 但是,为了提高性能而进行的权衡需要陡峭的学习曲线。 本质上,用户可能只希望
Pandas
运行得更快,而不希望针对其特定的硬件设置优化其
工作
流程
。 这意味着人们希望为其10KB数据集使用与10TB数据集相同的
Pandas
脚本。
Modin
提供了一种通过优化熊猫来提供解决方案的方法,以便数据科学家花时间从数据中提取价值,而不是花费在提取数据的工具上。
在该存储库中,我分析了kaggle钛酸数据集上的两个数据框,以查看它们在不同df操作下的性能
处理大型Excel文件时,使用
Pandas
可以极大地提高效率。但是,如果Excel文件太大,可能会导致内存不足或程序卡死。以下是一些可能有用的建议:
1. 使用read_excel()函数时,将参数usecols设置为一个列表,只包含需要读取的列。这可以大大减少内存使用和读取时间。
2. 如果Excel文件包含百万空白行,请在读取文件之前使用Excel软件删除这些空行,这样可以显著减少文件大小和读取时间。
3. 尝试使用chunksize参数来分块读取大型Excel文件。chunksize参数指定每个数据块的行数,可以减少内存使用和提高读取速度。例如:
``` python
import
pandas
as pd
chunksize = 100000 # 每个数据块的行数
for chunk in pd.read_excel('large_file.xlsx', chunksize=chunksize):
# 处理每个数据块
4. 如果以上方法仍然无法解决问题,则可以考虑使用其他工具,如Dask、
Modin
等,它们可以处理更大的数据集,并且可以自动并行化和优化计算。