使用Dask

时间:2018-01-24 16:33:58

标签: python pandas dask

我有一个大约10列的时间序列数据框,我在时间序列上执行操作以返回策略数据的结果。我想测试2个参数,因为它们可能会或可能不会相互影响。当独立测试时,每次运行每个单元需要超过10秒(总运行时间超过6.5小时)并且我希望加快速度。我一直在阅读有关dask的信息,它似乎是正确使用的模块。 我当前的代码使用嵌套循环遍历每个参数范围。我知道它可以并行,因为每天的数据是相互排斥的 这是代码:

amount1=np.arange(.001,.03,.0005)
amount2=np.arange(.001,.03,.0005)


def getResults(df,amount1,amount2):
    final_results=[]
    for x in tqdm(amount1):
        for y in amount2:
            df1=None
            df1=function1(df.copy(), x, y ) #takes about 2sec.
            df1=function2(df1)    #takes about 2sec.
            df1=function3(df1)    #takes about 3sec.
            final_results.append([x,y,df1['results'].iloc[-1]])
    return final_results   

更新

所以看起来改进应该是通过调整函数来从调用中删除迭代并创建一个作业列表(我的理解。这是我到目前为止的地方。我可能需要将我的df移动到一个dask数据帧,这样数据可以分成更小的部分。问题是我将function1,2和3函数作为pandas vector manulipulations还是需要移动到完成dask函数?

def getResults(df,amount):
    df1=None
    df1=dsk.delayed(function1)(df,amount[0],amount[1] )
    df1=dsk.delayed(function2)(df1)
    df1=dsk.delayed(function2)(df1)
    return [amount[0],amount[1],df1['results'].iloc[-1]]


#Create a list of processes from jobs.  jobs is a list of tuples that replaces the iteration.
processes =[getResults(df,items) for items in jobs]

#Create a process list of results
results=[]
for i in range(len(processes):
    results.append(processes[i])  

1 个答案:

答案 0 :(得分:1)

您可能想要使用dask.delayedconcurrent.futures界面。

以下内容可能会运行良好(未经测试,我建议您阅读上面引用的文档以了解它正在做什么)。

def getResults(df,amount1,amount2):
    final_results=[]
    for x in amount1:
        for y in amount2:
            df1=None
            df1=dask.delayed(function1)(df.copy(), x, y ) 
            df1=dask.delayed(function2)(df1) 
            df1=dask.delayed(function3)(df1) 
            final_results.append([x,y,df1['results'].iloc[-1]])
    return final_results   

out = getResults(df, amount1, amount2)
result = delayed(out).compute()

另外,如果可以避免,我会避免致电df.copy()。理想情况下,function1不会改变输入数据。