如何迭代熊猫数据读取器并为每个股票行情创建多个数据帧



我想从股票代码名称列表中迭代创建多个数据帧。

这是我引用的堆栈溢出帖子:

堆栈溢出后迭代创建多个数据帧

我很难理解如何完成这件事,我觉得我在这里错过或误解了什么?

我写了以下清单和字典

list_of_tickers = ['BAC','C','GS','JPM','MS','WFC']
dict_of_tickers = {name: pd.DataFrame() for name in list_of_tickers}

然而,当我运行这部分代码时,我会得到以下错误:

for ticker, ticker_data in dict_of_tickers.items():
ticker_data = data.DataReader(ticker,'yahoo',start,end)

这创建了所有ticker的一个单独的数据帧,但不允许我区分它们,我觉得我在这里缺少了一些关键逻辑。

我发现DataReader对列表本身进行迭代,因此不需要创建字典来进行迭代。

以下几行代码实现了我所寻求的,这是一种替代方案,可以将每个股票行情机的多个数据帧连接起来,以避免为每个符号指定DataReader。

  1. 设置日期范围:
start = datetime.datetime(2006,1,1)
end = datetime.datetime(2016,1,1)
  1. 指定符号:
list_of_tickers = ['BAC','C','GS','JPM','MS','WFC']
  1. 在每个ticker上迭代,创建单个多级列数据帧:
p = data.DataReader(list_of_tickers, 'yahoo', start, end)
  1. 可选:然后调整"符号"列级别并替换日期索引,以便在分析中使用:
res = p.stack().reset_index()
  1. 可选:此步骤不是必需的,纯粹是为了美观,以清理FrozenList和索引名称:
res.columns.names=[None]
res.index.names = ['ID']

ticker_data只是在for循环的每次迭代中创建并覆盖的一个变量。这无济于事。要更新字典,请显式地为密钥分配一个值:

for ticker in dict_of_tickers:
dict_of_tickers['ticker'] = data.DataReader(ticker, 'yahoo', start, end)

这假设data.DataReader返回一个数据帧。请注意,我们迭代键,因为该赋值不需要值(空数据帧)。事实上,您不需要首先定义一个具有空数据帧值的字典。只需使用一本字典即可理解:

dict_of_tickers = {ticker: data.DataReader(ticker, 'yahoo', start, end) 
for ticker in list_of_tickers}

相关内容

  • 没有找到相关文章

最新更新