我有一个带有浮点数的通用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
函数,它的性能更好,但我宁愿使用库。
1条答案
按热度按时间e4yzc0pl1#
Pandas的
Rolling.apply()
需要一个输出标量的函数。从文档中可以看到:func:function如果raw=True,则必须从ndarray输入中生成单个值;如果raw=False,则必须从Series中生成单个值。也可以接受指定了engine ='numba'的Numba JIT函数。
你需要重新思考你真正想要这个计算做什么。你的数据窗口的Z分数到底是什么?你想要一个平均Z分数?你想要一个基于整个数据分布的Z分数还是仅仅是窗口?事实上,我真的不明白你想做什么。