如何矢量化Dask应用过程

如何矢量化Dask应用过程,dask,Dask,与类似,我们正在尝试在dask中运行此进程 我们当前的解决方案实现了。因为这是我们流程中的一个瓶颈-还有其他选择吗? 下面是使用dask.datasets.timeseries数据的示例代码 import dask import dask.dataframe as dd import pandas as pd def set_list_att2(x: dd.Series): return list(set([item for item in x.values])) df =

与类似,我们正在尝试在
dask
中运行此进程

我们当前的解决方案实现了。因为这是我们流程中的一个瓶颈-还有其他选择吗?
下面是使用
dask.datasets.timeseries
数据的示例代码

import dask
import dask.dataframe as dd
import pandas as pd

def set_list_att2(x: dd.Series):
        return list(set([item for item in x.values]))

df = dask.datasets.timeseries()
df_gb = df.groupby(df.name)
gp_col = ['x','y' ,'id']
list_ser_gb = [df_gb[att_col_gr].apply(set_list_att2, 
                                           meta=pd.Series(dtype='object', name=f'{att_col_gr}_att'))
                   for att_col_gr in gp_col]
df_edge_att = df_gb.size().to_frame(name="Weight")
for ser in list_ser_gb:
        df_edge_att = df_edge_att.join(ser.compute().to_frame(), how='left')        
df_edge_att.head()

注意 排队

df_edge_att = df_edge_att.join(ser.compute().to_frame(), how='left')  

我们添加了
compute
另一方面,示例代码在最后的数据帧中只返回了一行。

我运行了一些测试,并明确尝试使用
dd.Aggregation
而不是
apply
。见以下结果:

%%timeit
df = dask.datasets.timeseries()
df_gb = df.groupby(df.name)
gp_col = ['x','y' ,'id']
list_ser_gb = [df_gb[att_col_gr].apply(set_list_att2, 
                                           meta=pd.Series(dtype='object', name=f'{att_col_gr}_att'))
                   for att_col_gr in gp_col]
df_edge_att = df_gb.size().to_frame(name="Weight")
for ser in list_ser_gb:
        df_edge_att = df_edge_att.join(ser.to_frame(), how='left')        
df_edge_att.head()
结果是:
每个回路5分钟44秒±11.2秒(7次运行的平均值±标准偏差,每个回路1次)

但是使用
dd.Aggregation运行
有相当大的改进:

%%timeit
df = dask.datasets.timeseries()
custom_agg = dd.Aggregation(
    'custom_agg', 
    lambda s: s.apply(set), 
    lambda s: s.apply(lambda chunks: list(set(itertools.chain.from_iterable(chunks)))),
)
df_gb = df.groupby(df.name)
gp_col = ['x','y' ,'id']
list_ser_gb = [df_gb[att_col_gr].agg(custom_agg) for att_col_gr in gp_col]
df_edge_att = df_gb.size().to_frame(name="Weight")
for ser in list_ser_gb:
        df_edge_att = df_edge_att.join(ser.to_frame(), how='left')        
df_edge_att.head()
结果是:
每个回路2min±1.13s(7次运行的平均值±标准偏差,每个回路1次)

更新

现在也添加了此方法

我运行了一些测试,并明确尝试使用
dd.Aggregation
而不是
apply
。见以下结果:

%%timeit
df = dask.datasets.timeseries()
df_gb = df.groupby(df.name)
gp_col = ['x','y' ,'id']
list_ser_gb = [df_gb[att_col_gr].apply(set_list_att2, 
                                           meta=pd.Series(dtype='object', name=f'{att_col_gr}_att'))
                   for att_col_gr in gp_col]
df_edge_att = df_gb.size().to_frame(name="Weight")
for ser in list_ser_gb:
        df_edge_att = df_edge_att.join(ser.to_frame(), how='left')        
df_edge_att.head()
结果是:
每个回路5分钟44秒±11.2秒(7次运行的平均值±标准偏差,每个回路1次)

但是使用
dd.Aggregation运行
有相当大的改进:

%%timeit
df = dask.datasets.timeseries()
custom_agg = dd.Aggregation(
    'custom_agg', 
    lambda s: s.apply(set), 
    lambda s: s.apply(lambda chunks: list(set(itertools.chain.from_iterable(chunks)))),
)
df_gb = df.groupby(df.name)
gp_col = ['x','y' ,'id']
list_ser_gb = [df_gb[att_col_gr].agg(custom_agg) for att_col_gr in gp_col]
df_edge_att = df_gb.size().to_frame(name="Weight")
for ser in list_ser_gb:
        df_edge_att = df_edge_att.join(ser.to_frame(), how='left')        
df_edge_att.head()
结果是:
每个回路2min±1.13s(7次运行的平均值±标准偏差,每个回路1次)

更新

现在也添加了此方法

我也面临类似问题。我试图创建一个矢量化函数,但不知道在哪里指定新列的数据类型。我也面临着类似的问题。我试图创建一个矢量化函数,但不知道在哪里指定新列的数据类型。也可能有帮助