如何使用dask有效地计算自定义统计信息?

时间:2019-08-21 18:13:24

标签: python dask dask-distributed

问题

我有一个自定义类CachedStatistics,其中包含一个轻松的数据框。它还具有可以依赖于dask方法或其他自定义方法的自定义方法。

此类旨在作为dask.dataframe的扩展,具有dask最初不存在的新操作。

以下是简化的实现方式:

class CachedStatistics:
    def __init__(self, parquet)
        self.df = dd.read_parquet(parquet)
        self.cached = ..

    # method to implement cache
    def _call_method(self, name):
        if self.cached[name] is None:
            self.cached[name] = self.getattr(name).__call__()

        return self.cached[name]

    def nrows(self):
        return len(self.df)

    def count(self):
        return self.df.count()

    def missing_pct(self):
        return self._call_method("nrows") / self._call_method("count")

    def test_missing(self):
        if self._call_method("missing_pct") < 0.5:
            return True
        else:
            return False

    def col_mean(self, col)
        return self.df[col].mean()

    def summary(self):
        df_dict = { 
            'missing_pct': self._call_method("missing_pct") , 
            'mean' : self._call_method("mean")
        }

        return pd.Series(df_dict)

我的主要要求是:

缓存所有计算

例如,我希望能够在dask.compute上调用missing_pct(),并使其不仅保存missing_pct()的结果,还保存每个依赖项的结果({{1}和nrows())。

在尝试实现自定义集合的情况下,我试图找到一种方法来实现此目的,但不知道如何实现。

优化计算

我希望能够通过单个dask.compute()计算多个统计信息,以避免开销并最大化性能。

实施

我试图使每个方法都延迟,但是当我在外部方法上调用compute时,嵌套延迟对象不会被计算,因为dask会解压缩延迟对象。 例: nested delayed objects

从我从文档中读取的内容来看,让所有方法输出一个HighLevelGraph似乎是可行的方法,但是我不确定如何将当前定义的方法转换为依赖项字典,因为我非常喜欢能够像现在一样定义方法。

感谢您的帮助或指导性建议。

0 个答案:

没有答案