首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何并行地将函数应用于Dask数据帧的多列?

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

Stack Overflow用户
提问于 2018-08-31 14:05:54
回答 1查看 1.4K关注 0票数 3

我有一个Dataframe,我想要计算一个列列表的偏度,如果这个倾斜度超过了某个阈值,我就使用日志转换来修正它。我想知道是否有一种更有效的方法,通过删除下面的correct_skewness()函数中的for循环,使correct_skewness()函数在多个列上并行工作:

代码语言:javascript
复制
import dask
import dask.array as da 
from scipy import stats

# Create a dataframe 
df = dask.datasets.timeseries()

df.head()

                      id     name         x         y
timestamp
2000-01-01 00:00:00  1032   Oliver  0.018604  0.089191
2000-01-01 00:00:01  1032  Norbert  0.666689 -0.979374
2000-01-01 00:00:02   991   Victor  0.027691 -0.474660
2000-01-01 00:00:03   979    Kevin  0.320067  0.656949
2000-01-01 00:00:04  1087    Zelda -0.462076  0.513409


def correct_skewness(columns=None, max_skewness=2):
    if columns is None:
        raise ValueError(
            f"columns argument is None. Please set columns argument to a list of columns"
        )


    for col in columns:
        skewness = stats.skew(df[col])
        max_val = df[col].max().compute()
        min_val = df[col].min().compute()

        if abs(skewness) > max_skewness and (max_val > 1 or min_val < 0):
            delta = 1.0
            if min_val < 0:
                delta = max(1, -min_val + 1)
            df[col] = da.log(delta + df[col])
    return df

df = correct_skewness(columns=['x', 'y']) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-31 15:16:59

在这个例子中,您可以做几件事情来提高并行性:

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

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

代码语言:javascript
复制
    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。这仍然需要两次传递您的数据,但这应该是一个很好的改进,您现在有。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52117218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档