我使用pandas.rolling_apply
将数据拟合到一个分布并从中获取一个值,但我需要它也报告一个合适的滚动优度(特别是p值)。目前我正在做这样的:从pandas.rolling_apply返回两个值
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)
如果结果是DataFrame
有两列。如果我尝试运行此操作,则会发生异常: TypeError: a float is required
。有没有可能做到这一点,如果是的话,如何?
如果你返回一个系列而不是字典,它工作吗? –
@AndyHayden不,这给'TypeError:无法将系列转换为' –
aquavitae
看到这个问题http://stackoverflow.com/questions/19121854/using-rolling-apply-on-a-dataframe-对象 – Jeff