python - 同时运行两个 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?实现这一目标的示例代码是什么?
解决方案
如果实体彼此独立,您可以按照文档和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 对象是一个惰性延迟对象。这个对象包含我们计算最终结果所需的一切,包括对所有所需函数的引用以及它们的输入和彼此之间的关系。
推荐阅读
- python - Cronjob 上的 SMTPLIB 电子邮件失败
- c# - GraphicsPath.AddArc() 连接到弧的错误边
- python - 如何在由于库函数而挂起的函数上实现超时?
- css - 使用 CSS 转换构建简洁、可扩展的 CSS 库
- single-sign-on - 使用 Keycloak 的 Bugzilla 的 SSO
- c# - 如何使用 MongoDb .net 驱动程序获取集合中所有文档的少数特定字段
- kubernetes - Kubernetes 在 Windows 上使用 KUBECONFIG 变量访问多个集群
- .net - 从 Azure Functions 向 Azure SQL DB 进行身份验证时使用 Azure Active Directory Interactive
- sharepoint - 如何在 SharePoint Online 的 spfx Web 部件中使用 google 字体
- android - BiometricPrompt:为什么我们应该在启用 setDeviceCredentialAllowed 之前检查 KeyguardManager.isDeviceSecure()?