使用pandas堆叠DataFrame至第三维度(Panel已弃用)的问题排查
问题解决方案
问题根源
- Pandas的
Panel结构确实已在0.20.0版本正式弃用,目前官方推荐使用带MultiIndex的二维DataFrame或者xarray库实现类似三维数据的管理需求。 - 你现有代码的错误有两点:
- 数据预处理时没有将
OpenTime时间列设置为行索引,concat后生成的MultiIndex仅包含股票代码一个维度,内层是无意义的默认整数索引,无法实现按时间维度切片 - 需确认
stockTicker列表的长度、顺序和你遍历的files列表完全匹配,否则股票代码索引会和对应数据错位
- 数据预处理时没有将
修复代码
第一步:修改prepData函数,将时间列设为索引
def prepData(dataloc): inputData = pd.read_csv(dataloc) inputData.columns = ["OpenTime","Open","High","Low","Close"] # 转换时间格式并设为索引 inputData['OpenTime'] = pd.to_datetime(inputData['OpenTime']) inputData = inputData.set_index('OpenTime') return inputData
第二步:concat时指定索引名称,生成双层MultiIndex
for x in files: dataloc = datalocation + x rawinputData.append(prepData(dataloc)) # 确保stockTicker顺序和files顺序完全一致 inputdata = pd.concat(rawinputData, keys=stockTicker, names=['StockTicker', 'OpenTime'])
常用切片操作示例
现在得到的inputdata虽然shape显示为二维,但通过双层MultiIndex可以实现所有你需要的三维切片需求:
- 查询所有股票所有时间点的Open价格:
inputdata['Open'] - 查询指定时间点所有股票的Open价格:
inputdata.xs('2024-01-01', level='OpenTime')['Open'] - 查询指定股票所有时间点的全部价格数据:
inputdata.loc['目标股票代码'] - 如果需要使用原生三维结构,可以转换为xarray对象:
xr_data = inputdata.to_xarray()
内容的提问来源于stack exchange,提问作者user6916458
相关产品推荐
相关产品推荐

