Pandas 备忘录

9 投票
2 回答
4259 浏览
提问于 2025-04-17 18:56

我有一些计算比较复杂,而且需要重复很多次。因此,我想用一种叫做“记忆化”的方法(有一些工具包,比如 jugjoblib),来和 Pandas 一起使用。问题是这些工具包能不能很好地处理作为方法参数的 Pandas 数据框。

有没有人试过这个?有没有其他推荐的工具包或者方法可以做到这一点?

2 个回答

4

我使用了这个基本的记忆化装饰器,叫做 memoized。你可以在这里找到更多信息:http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

数据框(DataFrames)是可以被哈希的,所以应该没问题。下面是一个例子。

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

我觉得看起来不错。

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())

不过,它的效率没有达到最佳,因为它内部只是使用了pickle来处理DataFrame(虽然它在处理时会进行压缩,所以在内存使用上还算可以,只是速度比理想的要慢)。

我愿意考虑一个改进方案,让这些数据像jug目前对待numpy数组那样进行特殊处理:https://github.com/luispedro/jug/blob/master/jug/backends/file_store.py#L102

撰写回答