繁体   English   中英

熊猫系列参数函数记忆

[英]Pandas Series argument function memoization

我想记住一个具有可变参数的函数(Pandas Series对象)。 有什么办法可以做到这一点?

这是一个简单的斐波那契示例,参数是Pandas Series,其中第一个元素表示序列的索引。

例:

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n.iloc[0] == 1 or n.iloc[0] == 2:
        return 1
    min1 = n.copy()
    min1.iloc[0] -=1
    min2 = n.copy()
    min2.iloc[0] -= 2 
    return fib(min1) + fib(min2)

通话功能:

fib(pd.Series([15,0]))

结果:

TypeError: 'Series' objects are mutable, thus they cannot be hashed

预期的用途更加复杂,因此我发布了这个无用但简单的示例。

几种选择:

  • 将可变对象转换为不可变的东西,例如字符串或元组。
  • 创建可变对象的哈希,并将其用作备注字典键。 哈希冲突的风险。
  • 创建一个实现__hash __()函数的不可变子类。

我写了一个包装程序,用@abarnert和@Calvin建议的元组(冻结的等效项)替换Pandas Series参数。 由于元组是不可变的,因此该功能现在可以被记忆。

def freeze_series(f):
    def wrapper(series):
        return f(tuple(series.to_dict(OrderedDict).items()))
    return wrapper

这是将元组解冻回Pandas系列的正常功能:

def unfreeze_series(frozen_series):
    return pd.Series(OrderedDict((x, y) for x, y in frozen_series))

可以这样实现以解决问题示例:

from functools import lru_cache

@freeze_series
@lru_cache(maxsize=None)
def fib(n):
    n = unfreeze_series(n)
    if n.iloc[0] == 1 or n.iloc[0] == 2:
        return 1
    min1 = n.copy()
    min1.iloc[0] -=1
    min2 = n.copy()
    min2.iloc[0] -= 2 
    return fib(min1) + fib(min2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM