Pandas记忆化

9
我有一些需要重复多次的长时间计算。因此,我希望使用记忆化(例如 jugjoblib 等软件包)与 Pandas 协同工作。问题是这些软件包是否能够成功地将 Pandas DataFrames 作为方法参数进行记忆化。
有人尝试过吗?还有其他推荐的软件包/方法可以实现这一目标吗?
2个回答

7

我是jug的作者:jug很好用。我刚刚尝试了以下内容,它可以正常工作:

from jug import TaskGenerator
import pandas as pd
import numpy as np


@TaskGenerator
def gendata():
    return pd.DataFrame(np.arange(343440).reshape((10,-1)))

@TaskGenerator
def compute(x):
    return x.mean()

y = compute(gendata())

它并不像可能的那样高效,因为它仅在DataFrame内部使用pickle(虽然它会即时压缩,所以在内存使用方面并不可怕;只是比可能的更慢)。

如果像jug当前对于numpy数组一样将其保存为特殊情况,我会持开放态度:https://github.com/luispedro/jug/blob/master/jug/backends/file_store.py#L102


当您调用 compute(gendata()) 时会发生什么?它是否实际从缓存中加载 DataFrame? - Yariv
如果 gendata() 是在不同的进程中计算的,那么是的。 - luispedro
有没有办法用 python 命令而不是 jug 命令来运行 jug? - Light

4
我使用这个基本的记忆化装饰器memoizedhttp://wiki.python.org/moin/PythonDecoratorLibrary#Memoize 数据框是可哈希的,所以应该可以正常工作。以下是一个例子。
In [2]: func = lambda df: df.apply(np.fft.fft)

In [3]: memoized_func = memoized(func)

In [4]: df = DataFrame(np.random.randn(1000, 1000))

In [5]: %timeit func(df)
10 loops, best of 3: 124 ms per loop

In [9]: %timeit memoized_func(df)
1000000 loops, best of 3: 1.46 us per loop

看起来不错。


谢谢。"DataFrames可哈希"是什么意思?如果你两次调用hash(pd.DataFrame([1,2,3])),它会返回不同的值。 - Yariv
在尝试缓存数据之前,memoized检查collections.Hashable()的代码。但是你的评论让我重新考虑这是否按预期工作。 - Dan Allan
数据框在这种情况下可能会引发异常,我将在Github上提交PR。 - Phillip Cloud
2
它们将在0.11.1中提高(!)。你可能需要覆盖__hash__成为id(我认为这基本上就是它以前的作用了)。 - Andy Hayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接