【发布时间】:2014-04-08 17:34:02
【问题描述】:
我正在使用 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})
问题是我有很多数据,而 fit 函数很昂贵,所以我不想为每个样本调用两次。我宁愿做的是这样的:
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。如果我尝试运行它,我会得到一个异常:
TypeError: a float is required。是否有可能实现这一目标,如果可以,如何实现?
【问题讨论】:
-
如果你返回一个系列而不是一个字典,它会起作用吗?
-
@AndyHayden 不,这给了
TypeError: cannot convert the series to <class 'float'> -
@Jeff 这是一个不同的问题。那是关于接受两个输入。这个问题是关于给出 2 个输出。
-
有人给你一个好的答案了吗?我可以编写自己的更通用的滚筒,但如果有标准解决方案,我会更喜欢。