Python 使用Dask加速参数测试
我有一个时间序列数据框,大约有10列,我在其中对时间序列执行操作,以返回策略数据的结果。我想测试两个参数,因为它们可能相互影响,也可能不相互影响。当独立测试时,每次运行每个单元需要超过10秒(总运行时间超过6.5小时),我希望加快速度。我一直在阅读有关dask的内容,似乎它是正确的模块。 我当前的代码使用嵌套循环遍历每个参数范围。我知道它可以并行,因为每天的数据是互斥的。Python 使用Dask加速参数测试,python,pandas,dask,Python,Pandas,Dask,我有一个时间序列数据框,大约有10列,我在其中对时间序列执行操作,以返回策略数据的结果。我想测试两个参数,因为它们可能相互影响,也可能不相互影响。当独立测试时,每次运行每个单元需要超过10秒(总运行时间超过6.5小时),我希望加快速度。我一直在阅读有关dask的内容,似乎它是正确的模块。 我当前的代码使用嵌套循环遍历每个参数范围。我知道它可以并行,因为每天的数据是互斥的。 代码如下: amount1=np.arange(.001,.03,.0005) amount2=np.arange(.001
代码如下:
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数据帧,以便将数据分块成更小的部分。问题是我是否将函数1、2和3保留为向量运算,还是它们需要移动以完成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])
您可能想要使用或接口 类似于下面的内容可能会很好地工作(未经测试,我建议您阅读上面引用的文档以了解它在做什么)
另外,我会避免调用
df.copy()
如果可以避免的话。理想情况下,函数1不会改变输入数据。是否需要对两个范围进行彻底测试?您是否考虑过至少对其中一个进行半随机采样?我不介意结果返回到热图,以便确定一个值范围。您是否建议使用网格搜索?您应该避免使用dask de在dask延迟函数中进行了设置谢谢我发现了这一点。我很感激。谢谢。我阅读并有了更好的理解。我重新调整了函数,并将其放在上面的更新中。我现在对上面的问题仍然存在。
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()