问题描述
聚宽在线编译器无法使用rolling函数么?
low_list = weekly_data['low'].rolling(9, min_periods=9).min()
报错提示:
AttributeError: 'numpy.ndarray' object has no attribute 'rolling'
解决方案
在 JoinQuant(聚宽)量化平台上,完全可以使用 rolling 函数。您遇到的报错 AttributeError: 'numpy.ndarray' object has no attribute 'rolling',其根本原因在于数据类型的错用,而不是平台不支持该函数。
报错原因分析
rolling() 是 Pandas 库中 DataFrame 或 Series 对象专有的方法,用于进行滑动窗口计算。而报错信息明确指出,您的 weekly_data['low'] 是一个 NumPy 数组 (numpy.ndarray)。NumPy 数组原生并没有 rolling 这个方法,因此引发了 AttributeError。
在聚宽的数据获取 API 中(例如 get_bars、history、attribute_history 等),通常会有一个 df 参数来控制返回的数据格式:
- 当
df=False(某些 API 的默认值,如get_bars)时,返回的数据格式是numpy.ndarray或dict。 - 当
df=True时,返回的数据格式才是pandas.DataFrame。
解决方案
要解决这个问题,您有两种方法:
方法一:在获取数据时直接指定返回 Pandas DataFrame(推荐)
如果您使用的是 get_bars、history 或 attribute_history 等函数获取数据,请确保传入参数 df=True。
示例代码:
# 假设您使用的是 get_bars 获取数据,务必加上 df=True
weekly_data = get_bars('000001.XSHE', count=20, unit='1w', fields=['date', 'open', 'high', 'low', 'close'], df=True)
# 此时 weekly_data 是 DataFrame,可以直接使用 rolling
low_list = weekly_data['low'].rolling(9, min_periods=9).min()
方法二:将 NumPy 数组手动转换为 Pandas Series
如果您由于某些原因必须保持 df=False 以追求极致的运行速度,或者数据来源本身就是 NumPy 数组,您可以在调用 rolling 之前,手动将其转换为 pandas.Series。
示例代码:
import pandas as pd
# 假设 weekly_data['low'] 是一个 numpy.ndarray
low_array = weekly_data['low']
# 将其转换为 pandas.Series
low_series = pd.Series(low_array)
# 然后再调用 rolling 函数
low_list = low_series.rolling(9, min_periods=9).min()
总结
在聚宽编写量化策略时,经常需要在 NumPy 的高计算效率和 Pandas 的丰富数据处理功能(如 rolling、shift 等)之间做切换。遇到类似 has no attribute 的报错时,第一步建议使用 print(type(您的变量)) 检查一下当前的数据类型,确认它是 pandas.DataFrame 还是 numpy.ndarray,这样就能快速定位并解决问题。