如何遍历 pandas-datareader 并为每个股票代码创建多个数据框?

How to iterate through pandas-datareader and create multiple dataframes for each stock ticker?

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

这是堆栈溢出 post 我正在引用:

我无法理解如何完成此操作,我觉得我在这里遗漏或误解了什么?

我写了下面的列表和字典

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_data 只是一个变量,它会在 for 循环的每次迭代中创建并覆盖。那没有帮助。要更新您的字典,请明确地为键分配一个值:

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

这假设 data.DataReader returns 一个数据帧。请注意,我们迭代键,因为此分配不需要值(空数据框)。事实上,您 不需要 首先定义一个包含空数据框值的字典。只需使用单个字典理解:

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

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

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

  1. Sets the date ranges:
start = datetime.datetime(2006,1,1)
end = datetime.datetime(2016,1,1)
  1. Specifies the symbols:
 list_of_tickers = ['BAC','C','GS','JPM','MS','WFC']
  1. Iterates over each ticker, creates a single multilevel column dataframe:
p = data.DataReader(list_of_tickers, 'yahoo', start, end)
  1. OPTIONAL: Then pivot the 'symbols' column level and replaces the Date index so it can be used in analysis:
res = p.stack().reset_index()
  1. OPTIONAL: This step isn't necessary and was purely for aesthetics to clean up the FrozenList and index names:
res.columns.names=[None]
res.index.names = ['ID']