使用lambda函数计算Z-score时遇AttributeError: float无rolling属性
问题分析与解决
- 错误原因:你用
df.Close.apply()的时候,apply默认会逐元素传递数据——也就是把Close列里的每个单个浮点数值(float类型)传给lambda函数的参数x,而单个float对象根本没有rolling方法,所以触发了AttributeError。 - 正确做法:pandas的
rolling是直接作用于整个Series(也就是你的df.Close)的方法,不需要用apply来逐元素处理。直接对整个列计算滑动窗口的均值和标准差即可。
修正后的代码
# 先计算滑动窗口均值和标准差 rolling_mean = df.Close.rolling(window=200, min_periods=20).mean() rolling_std = df.Close.rolling(window=200, min_periods=20).std() # 计算Z-score并添加到原DataFrame df['zscore'] = (df.Close - rolling_mean) / rolling_std
或者也可以写成更简洁的单行形式(但可读性稍差):
df['zscore'] = (df.Close - df.Close.rolling(window=200, min_periods=20).mean()) / df.Close.rolling(window=200, min_periods=20).std()
内容的提问来源于stack exchange,提问作者Bucky
相关产品推荐
相关产品推荐

