我想从股票行情清单中迭代创建多个数据框。
这是我引用的堆栈溢出帖子:
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)
这会创建一个包含所有行情收录器的单个数据框,但不允许我对其进行区分,我感觉这里缺少一些关键逻辑。
答案 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。
- 设置日期范围:
start = datetime.datetime(2006,1,1)
end = datetime.datetime(2016,1,1)
- 指定符号:
list_of_tickers = ['BAC','C','GS','JPM','MS','WFC']
- 遍历每个行情指示器,创建单个多级列数据框:
p = data.DataReader(list_of_tickers, 'yahoo', start, end)
- 可选:然后旋转“符号”列级别并替换日期索引,以便可将其用于分析:
res = p.stack().reset_index()
- 可选:此步骤不是必需的,纯粹是为了美观起见,它可以清除FrozenList和索引名称:
res.columns.names=[None]
res.index.names = ['ID']