首页 > 解决方案 > 同时运行两个 dask-ml 输入器,而不是顺序运行

问题描述

我可以像这样使用 dask-ml 估算平均值和最常见的值,这很好用:

mean_imputer = impute.SimpleImputer(strategy='mean')
most_frequent_imputer = impute.SimpleImputer(strategy='most_frequent')
data = [[100, 2, 5], [np.nan, np.nan, np.nan], [70, 7, 5]]
df = pd.DataFrame(data, columns = ['Weight', 'Age', 'Height']) 
df.iloc[:, [0,1]] = mean_imputer.fit_transform(df.iloc[:,[0,1]])
df.iloc[:, [2]] = most_frequent_imputer.fit_transform(df.iloc[:,[2]])
print(df)


    Weight  Age   Height
0   100.0   2.0   5.0
1   85.0    4.5   5.0
2   70.0    7.0   5.0

但是,如果我有 1 亿行数据,dask 似乎会做两个循环,而它本可以只做一个循环,是否可以同时和/或并行而不是顺序运行两个 imputer?实现这一目标的示例代码是什么?

标签: pythonpandasdaskdask-ml

解决方案


如果实体彼此独立,您可以按照文档和Dask Toutorial 中的建议使用 dask.delayed来并行化计算。

您的代码如下所示:

from dask.distributed import Client

client = Client(n_workers=4)

from dask import delayed
import numpy as np
import pandas as pd
from dask_ml import impute

mean_imputer = impute.SimpleImputer(strategy='mean')
most_frequent_imputer = impute.SimpleImputer(strategy='most_frequent')

def fit_transform_mi(d):
    return mean_imputer.fit_transform(d)
def fit_transform_mfi(d):
    return most_frequent_imputer.fit_transform(d)
def setdf(a,b,df):
    df.iloc[:, [0,1]]=a
    df.iloc[:, [2]]=b
    return df

data = [[100, 2, 5], [np.nan, np.nan, np.nan], [70, 7, 5]]
df = pd.DataFrame(data, columns = ['Weight', 'Age', 'Height']) 
a = delayed(fit_transform_mi)(df.iloc[:,[0,1]])
b = delayed(fit_transform_mfi)(df.iloc[:,[2]])
c = delayed(setdf)(a,b,df)
df= c.compute()
print(df)
client.close()

c 对象是一个惰性延迟对象。这个对象包含我们计算最终结果所需的一切,包括对所有所需函数的引用以及它们的输入和彼此之间的关系。


推荐阅读