python - 从 pandas.rolling_apply 返回两个值

标签 python pandas

我正在使用 pandas.rolling_apply 将数据拟合到分布并从中获取值,但我还需要它报告滚动拟合优度(特别是 p 值)。目前我是这样做的:

def func(sample):
    fit = genextreme.fit(sample)
    return genextreme.isf(0.9, *fit)

def p_value(sample):
    fit = genextreme.fit(sample)
    return kstest(sample, 'genextreme', fit)[1]

values = pd.rolling_apply(data, 30, func)
p_values = pd.rolling_apply(data, 30, p_value)
results = pd.DataFrame({'values': values, 'p_value': p_values})

问题是我有很多数据,而且拟合函数很昂贵,所以我不想为每个样本调用两次。我宁愿做的是这样的:

def func(sample):
    fit = genextreme.fit(sample)
    value = genextreme.isf(0.9, *fit)
    p_value = kstest(sample, 'genextreme', fit)[1]
    return {'value': value, 'p_value': p_value}

results = pd.rolling_apply(data, 30, func)

其中 results 是一个包含两列的 DataFrame。如果我尝试运行它,我会得到一个异常: 类型错误:需要一个 float 。是否有可能实现这一点,如果可以,如何实现?

最佳答案

我有一个类似的问题并通过在应用期间使用单独的帮助类的成员函数解决了它。该成员函数按要求返回单个值,但我将其他计算结果存储为该类的成员,之后可以使用它。

简单示例:

class CountCalls:
    def __init__(self):
        self.counter = 0

    def your_function(self, window):
        retval = f(window)
        self.counter = self.counter + 1


TestCounter = CountCalls()

pandas.Series.rolling(your_seriesOrDataframeColumn, window = your_window_size).apply(TestCounter.your_function)

print TestCounter.counter

假设您的函数 f 将返回一个包含两个值 v1、v2 的元组。然后您可以返回 v1 并将其分配给 column_v1 到您的数据框。您只需在辅助类中的系列 series_val2 中累积第二个值 v2。之后,您只需将该系列作为新列添加到您的数据框中。 JML

关于python - 从 pandas.rolling_apply 返回两个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22218438/

相关文章:

Python os.environ ["HOME"] 在空闲状态下工作但不在脚本中

python - 一起打印 4 个列表,元素数量不等

python - 在python中编辑文件

pandas - 如何将pandas数据导出到elasticsearch?

python - Pandas 数据帧压缩

python - WxPython,将双击事件链接到特定列表框,而不是所有列表框

python - 仅按其值之一对复杂的Python字典进行排序

python - Pandas 数据框的高效展平

python - pandas 从 csv 文件中读取 MultiIndex 数据

python - 将一级混合头数据帧转换为 Pandas 中的垂直数据帧