Python 如何将函数并行应用于Dask数据帧的多列?

Python 如何将函数并行应用于Dask数据帧的多列?,python,parallel-processing,dask,Python,Parallel Processing,Dask,我有一个Dask数据帧,我想为它计算列列表的倾斜度,如果这个倾斜度超过某个阈值,我会使用日志转换来纠正它。我想知道是否有一种更有效的方法使correct\u skewness()函数通过删除下面correct\u skewness()函数中的for循环来并行处理多列: 导入dask 将dask.array导入为da 从scipy导入统计信息 #创建一个数据帧 df=dask.datasets.timeseries() df.head() id名称x y 时间戳 2000-01-01 00:00:

我有一个Dask数据帧,我想为它计算列列表的倾斜度,如果这个倾斜度超过某个阈值,我会使用日志转换来纠正它。我想知道是否有一种更有效的方法使
correct\u skewness()
函数通过删除下面
correct\u skewness()
函数中的for循环来并行处理多列:

导入dask
将dask.array导入为da
从scipy导入统计信息
#创建一个数据帧
df=dask.datasets.timeseries()
df.head()
id名称x y
时间戳
2000-01-01 00:00:00 1032奥利弗0.018604 0.089191
2000-01-01 00:00:01 1032诺伯特0.666689-0.979374
2000-01-01 00:00:02 991维克托0.027691-0.474660
2000-01-01 00:00:03 979凯文0.320067 0.656949
塞尔达-0.462076 0.513409
def纠正偏差(列=无,最大偏差=2):
如果列为无:
升值误差(
f“columns参数为None。请将columns参数设置为列列表”
)
对于列中的列:
偏斜=统计数据偏斜(df[col])
max_val=df[col].max().compute()
min_val=df[col].min().compute()
如果abs(偏度)>最大偏度和(最大值>1或最小值<0):
增量=1.0
如果最小值<0:
增量=最大值(1,-最小值+1)
df[col]=da.log(delta+df[col])
返回df
df=正确的倾斜度(列=['x','y'])

在本例中,您可以做一些事情来提高并行性:

您可以使用dask.array.stats.skew而不是statsmodels.skew。您必须显式地
导入dask.array.stats

您可以在一次计算中计算所有列的最小/最大值

    mins = [df[col].min() for col in cols]
    maxes = [df[col].min() for col in cols]
    skews = [da.stats.skew(df[col]) for col in cols]

    mins, maxes, skews = dask.compute(mins, maxes, skews)

然后,您可以执行if逻辑并根据需要应用
da.log
。这仍然需要对您的数据进行两次传递,但与您现在的数据相比,这应该是一个很好的改进。

您可能希望查看多处理模块。^@JackMoody,此人希望使用Dask,而不是直接使用多处理,这是完全合理的。哦,好的。我想你可能会觉得有用。它详细说明了如何一次使用多个worker(因此可以使用4个worker,而不仅仅是1个worker)。