问题描述
目前pandas不支持get_price 函数的panel,但是在一创聚宽中是没有false选项。
使用会报错:get_price() got an unexpected keyword argument 'panel'
那么,我怎么把panel 为false和ture输出的相互转换成一摸一样的呢?
如:
h1 = get_price(stocks, end_date=None, frequency='1d', fields='close', count=30, panel=False )
h2 = get_price(stocks, end_date=None, frequency='1d', fields='close', count=30, panel=True )
h1和h2如何转换?
查阅网上使用to_frame好像不行
解决方案
在一创聚宽(旧版 API 环境)中,get_price 函数确实没有 panel 这个参数。当查询多只股票时,它默认返回的是旧版 pandas 的 Panel 对象。而在聚宽官网的新版 API 中,由于新版 pandas 已经废弃了 Panel,所以引入了 panel=False 参数来直接返回 DataFrame。
如果你在一创聚宽中想要获取和官网 panel=False 一样结构的数据,可以通过对返回的 Panel 对象进行提取或转换来实现。以下是具体的解决方案:
1. 最常见的需求:提取单个字段的 DataFrame
如果你查询了多只股票,并且只需要某一个字段(例如 'close'),panel=True 返回的 Panel 对象其实就像是一个三维字典。你只需要像取字典一样把该字段取出来,就能得到一个完美的二维 DataFrame(行是时间,列是股票代码)。
# 一创聚宽中,去掉 panel 参数,默认返回 Panel 对象
h2 = get_price(stocks, end_date=None, frequency='1d', fields=['close'], count=30)
# 直接提取 'close' 字段,得到的就是一个 DataFrame
# 行索引(index)为日期,列索引(columns)为股票代码
df_close = h2['close']
print(df_close.head())
注:即使你在 fields 里只写了 'close',返回的依然是 Panel,必须通过 h2['close'] 降维提取。
2. 将整个 Panel 转换为 MultiIndex DataFrame
如果你查询了多个字段(如 ['open', 'close', 'volume']),并且希望得到和官网 panel=False 完全一样的多重索引(MultiIndex)DataFrame,可以使用 to_frame() 方法。如果你说 to_frame() 不行,可能是因为维度对齐的问题,可以尝试先转置再转换:
# 获取多字段的 Panel 数据
h2 = get_price(stocks, end_date=None, frequency='1d', fields=['open', 'close', 'volume'], count=30)
# 方法 A:直接使用 to_frame()
# 这会将 items (字段) 变成列,major_axis (时间) 和 minor_axis (股票代码) 变成行索引
df_multi = h2.to_frame()
# 方法 B:如果方法 A 的行列结构不是你想要的,可以先用 transpose 调整维度顺序
# 例如:将时间作为行,股票代码和字段作为多重列索引
df_multi_transposed = h2.transpose(1, 2, 0).to_frame()
3. 替代方案:使用字典推导式重组数据
如果 to_frame() 在你的特定 pandas 版本中表现异常,你可以手动将 Panel 拆解并用 pd.concat 重新组合成 DataFrame。这是一种非常稳妥且兼容性极强的方法:
import pandas as pd
# 获取 Panel 数据
h2 = get_price(stocks, end_date=None, frequency='1d', fields=['open', 'close'], count=30)
# 将 Panel 转换为以股票代码为 key,DataFrame 为 value 的字典
# 然后用 pd.concat 拼接,形成 MultiIndex DataFrame
df_combined = pd.concat({stock: h2.minor_xs(stock) for stock in stocks}, axis=1)
print(df_combined.head())
总结建议
在量化策略编写中,90% 的场景下我们只需要单字段的截面数据。因此,最推荐的做法是:在一创聚宽中直接使用 h2 = get_price(...),然后用 h2['close']、h2['volume'] 的方式将你需要的数据单独提取为 DataFrame 进行计算,这样既不会报错,代码也最简洁易读。