时间不够?添加这个词,让Pandas Apply更快捷吧
全文共1860字,预计学习时长6分钟
来源:Pexels
数据科学家一般需要具有更多核心和强大计算能力的服务器来支持他们的工作。所以,在设备选择上,他们往往更加青睐于四核、八核、涡轮增压的笔记本电脑。
但是他们真的能百分百利用并发挥出手中这些东西的原始力量吗?
有时他们在处理数据时会受到工具的限制;有时为了节省几分钟的时间,他们不会编写一些无关紧要的代码。最后,或许才意识到从长远来看,时间优化才是真正一定帮助的。
那么,科学家们能够对此进行优化吗?
当然,结果显而易见。
这篇文章是关于科学家们运用手头的计算能力,并使用Swifter软件将其应用到panda数据帧中。
问题陈述
科学家们已经拥有一个巨大的panda数据帧,要对它应用一个复杂的函数,需要很多时间。
针对这篇文章,笔者将生成25万行和4列的相关数据。
使用并行化可以很容易地获得代码的额外性能吗?
- import pandas as pd
- import numpy as nppdf = pd.DataFrame(np.random.randint(0,100,size=(25000000,4)),columns=list('abcd'))
数据如下:
数据样本
仅使用单个更改的并行化
来源:Pexels 放松并并行化!!
接下来进行一个简单的实验。
尝试在数据帧(dataframe)中创建一个新列。这一步骤可以简单地通过在panda中使用 apply-lambda 来实现。
- def func(a,b):
- if a>50:
- return True
- elif b>75:
- return True
- else:
- return Falsepdf['e'] =pdf.apply(lambda x : func(x['a'],x['b']),axis=1)
以上的代码大约需要10分钟才能运行。笔者只是对以上这两列做一个简单的计算。
那能够优化吗?需要做些什么呢?
当然,回答是肯定的,只要加上一个“神奇的词”—— Swifter就能够进行优化。
但是首先,需要安装swifter软件,这十分容易:
- conda install -c conda-forgeswifter
然后只需在 apply 使用它之前导入并附加swifter关键字来进行操作。
- import swifter
- pdf['e'] = pdf.swifter.apply(lambda x : func(x['a'],x['b']),axis=1)
这有效果吗?
当然。与只使用函数本身相比,这一操作可以将运行时间缩短一倍。
这其中到底蕴藏着什么奥秘呢?
来源:增加数据的大小如何影响Dask, Pan
Swifter通过向量化函数或在后端使用Dask并行化函数,再或者在数据集较小的情况下使用简单的panda apply函数,来选择实现函数 apply的最佳方式。
在本例中,Swifter使用Dask将apply函数与默认值并行化npartitions = cpu_count()*2.
对于笔者正在处理的MacBook, 其CPU计数是6,而超线程是2。因此,CPU计数是12,这使得npartitions的值为24。
读者也可以选择自己设置n_partitions的值。笔者注意到默认值在大多数情况下都能正常运作,但读者也可以通过调优它来获得额外的加速。
例如:如果设置n_partitions=12,然后又得到了2x的加速。在这里,减少分区数量会减少运行时间,因为分区之间的数据迁移成本很高。
结论
并行不是什么灵丹妙药,它是一剂炸弹。
并行化并不能解决所有的问题,仍然需要优化函数,但是它是一个很好的工具。
时间一去不复返,时间总是不够用的。在这种情况下,需要在数据处理中用一个词来进行并行处理。
这个词是swifter。
来源:Pexels
工作固然重要,但人生在世,最重要的还是生活。
希望大家阅读完这篇文章后,都能灵活运用它,提高效率,为自己省下“好好生活”的时间。
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范