如何遍历pandas-datareader并为每个股票行情自动收录器创建多个数据框?

时间:2019-01-20 15:56:16

标签: python dataframe sqldatareader stock stocks

我想从股票行情清单中迭代创建多个数据框。

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

Stack Overflow Post - Iteratively Create Multiple Dataframes

我在理解如何做到这一点时遇到了麻烦,感觉好像我在这里丢失或误解了吗?

我写下了以下列表和字典

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)

这会创建一个包含所有行情收录器的单个数据框,但不允许我对其进行区分,我感觉这里缺少一些关键逻辑。

2 个答案:

答案 0 :(得分:1)

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}

答案 1 :(得分:1)

我发现DataReader遍历列表本身,因此不需要创建字典进行遍历。

下面的代码行实现了我所寻求的目标,这是从每个股票报价器连接多个数据框的一种选择,以避免为每个交易品种指定DataReader。

  
      
  1. 设置日期范围:
  2.   
start = datetime.datetime(2006,1,1)
end = datetime.datetime(2016,1,1)
  
      
  1. 指定符号:
  2.   
 list_of_tickers = ['BAC','C','GS','JPM','MS','WFC']
  
      
  1. 遍历每个行情指示器,创建单个多级列数据框:
  2.   
p = data.DataReader(list_of_tickers, 'yahoo', start, end)
  
      
  1. 可选:然后旋转“符号”列级别并替换日期索引,以便可将其用于分析:
  2.   
res = p.stack().reset_index()
  
      
  1. 可选:此步骤不是必需的,纯粹是为了美观起见,它可以清除FrozenList和索引名称:
  2.   
res.columns.names=[None]
res.index.names = ['ID']