python - 使用 dask 等价物加速 numpy 'between' 函数
问题描述
我试图想出一种在 DASK 数据框中添加新列的快速方法,其中添加的值是基于条件的。我被推荐了一种使用 numpy 的方法,但它相对来说非常慢。
目前我正在加载一个 11m 行的 csv,添加几个新列,每个列都有公式计算,并在 10 秒内打印头部和尾部。
目前用于慢/麻烦功能的代码如下。我想知道是否存在 dask 原生的等效方法,或者是否可以更好地构造 numpy 查询以提高性能。
这是有问题的代码它 的运行时间是 60 秒+ - 我在默认 = 0 时收到错误,所以我不确定总运行时间是多少。我希望运行时间最多可以缩短到几秒钟。
import dask.dataframe as dd
import dask.multiprocessing
import dask.threaded
import pandas as pd
import numpy as np #I'd like to not use this if possible
# Dataframes implement the Pandas API
import dask.dataframe as dd
ddf["AndHeathSolRadFact"] = np.select(
[
(ddf[ddf['Month'].between(8, 12)]),
(ddf[ddf['Month'].between(1, 2) & ddf['CloudCover']<30])
], #list of conditions
[1, 1], #list of results
default=0) #default if no match
相反(例如), this 的运行时间是 8 seconds。日期转换,日期时间到月份数,以及一个不错的公式。:
import dask.dataframe as dd
import dask.multiprocessing
import dask.threaded
import pandas as pd
# Dataframes implement the Pandas API
import dask.dataframe as dd
from timeit import default_timer as timer
start = timer()
ddf = dd.read_csv(r'C:\Users\i5-Desktop\Downloads\Weathergrids.csv')
ddf['DateTime'] = dd.to_datetime(ddf['Date'], format='%Y-%d-%m %H:%M')
ddf['Month'] = ddf['DateTime'].dt.month
ddf['Grass_FMC'] = (97.7+4.06*ddf['RH'])/(ddf['Temperature']+6)-0.00854*ddf['RH']+3000/ddf['Curing']-30
print(ddf.head())
end = timer()
我希望能大大提高我评估月份的第一个给定代码块的性能,并检查云层。
解决方案
正确答案如下。事实证明我传递的是一个数据框而不是一个布尔数组。
ddf["AndHeathSolRadFact"] = np.select(
[
(ddf['Month'].between(8,12)),
(ddf['Month'].between(1,2) & ddf['CloudCover']>30)
], #list of conditions
[1, 1], #list of results
default=0) #default if no match
推荐阅读
- android - Android跟踪文件描述符在生产中泄漏
- java - 将 json 转换为 xml - 使用 java
- arrays - 在 ngIf 中使用 array.prototype.some
- firebase - 如何在 react-native 中从 Firestore 读取子集合的文档字段
- c# - 由于加密数据而添加到列表性能
- ios - 在 ios 13 中修剪的 Uitextview
- arrays - 如何将二维数组从 Delphi 传递到 Matlab DLL
- java - 如何在java中的抽象类中实现接口和扩展线程
- java - 每当使用java在android studio中滚动回收视图时,我如何隐藏(基本上向下滑动)按钮(在底部对齐)
- firebase - 有多少客户端连接到我的 Firestore?