首页 > 解决方案 > 使用 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()

我希望能大大提高我评估月份的第一个给定代码块的性能,并检查云层。

标签: pythonpandasnumpydask

解决方案


正确答案如下。事实证明我传递的是一个数据框而不是一个布尔数组。

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

推荐阅读