我想从股票代码名称列表中迭代创建多个数据帧。
这是我引用的堆栈溢出帖子:
堆栈溢出后迭代创建多个数据帧
我很难理解如何完成这件事,我觉得我在这里错过或误解了什么?
我写了以下清单和字典
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。
- 设置日期范围:
start = datetime.datetime(2006,1,1)
end = datetime.datetime(2016,1,1)
- 指定符号:
list_of_tickers = ['BAC','C','GS','JPM','MS','WFC']
- 在每个ticker上迭代,创建单个多级列数据帧:
p = data.DataReader(list_of_tickers, 'yahoo', start, end)
- 可选:然后调整"符号"列级别并替换日期索引,以便在分析中使用:
res = p.stack().reset_index()
- 可选:此步骤不是必需的,纯粹是为了美观,以清理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}