使用Scipy计算Pandas系列上的滚动z得分出错

wlwcrazw  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(114)

我有一个带有浮点数的通用DataFrame,没有NaN或Inf。我想计算Values列上的滚动Z-Score,并借助了Scipy's z-score
这是可行的,但它是在整个列上计算Z-Score,即不滚动:

from scipy.stats import zscore
df['Z-Score'] = zscore(df['Values'])

这是我想要做的,但它给了我一个错误:

from scipy.stats import zscore
window_size = 5
df['Z-Score'] = df['Values'].rolling(window_size).apply(lambda s: zscore(s))

我得到TypeError: cannot convert the series to <class 'float'>
我搜索了一遍又一遍,但找不到问题所在。我做错了什么?
我知道我可以自己实现zscore函数,它的性能更好,但我宁愿使用库。

e4yzc0pl

e4yzc0pl1#

Pandas的Rolling.apply()需要一个输出标量的函数。从文档中可以看到:
func:function如果raw=True,则必须从ndarray输入中生成单个值;如果raw=False,则必须从Series中生成单个值。也可以接受指定了engine ='numba'的Numba JIT函数。
你需要重新思考你真正想要这个计算做什么。你的数据窗口的Z分数到底是什么?你想要一个平均Z分数?你想要一个基于整个数据分布的Z分数还是仅仅是窗口?事实上,我真的不明白你想做什么。

相关问题