我尝试了各种代码变体,包括尝试reset_index((,因为也许有一个多索引引起了错误。如果您看到下面的打印件,您会注意到"符号"索引。我不确定如何删除它以及是否会解决错误。
tickers = ['AAPL', 'BAC']
prices_list = []
for ticker in tickers:
try:
prices = dr.DataReader(ticker,'morningstar','01/01/2017')['Close']
prices = pd.DataFrame(prices)
prices.columns = [ticker]
prices_list.append(prices)
except:
pass
prices_df = pd.concat(prices_list,axis=1,copy=False)
#prices_df.sort_index(inplace=True)
print(prices_df.head())
结果--->
AAPL BAC
Symbol Date
AAPL 2017-01-02 115.82 NaN
2017-01-03 116.15 NaN
2017-01-04 116.02 NaN
2017-01-05 116.61 NaN
2017-01-06 117.91 NaN
我实际上使用此基本代码来解决此错误。我正在网上获取S& p 500的数据。
我认为该错误在串联期间发生,但我不确定如何解决。如果您打印出prices_list_list数据是包含所有数字的数据范围列表,因此源源不是问题。
我相信问题是您的每个数据范围都有一个包含符号名称的多索引,因此当您尝试合并数据时,类似以下情况(我使用过(两个非常小的示例数据框(:
df1
AAPL
Symbol Date
AAPL 2017-01-02 115.82
2017-01-03 116.15
df2
BAC
Symbol Date
BAC 2017-01-02 123.82
2017-01-03 124.15
尝试合并此数据会导致以下内容:
prices_df = pd.concat([df1, df2],axis=1,copy=False)
AAPL BAC
Symbol Date
AAPL 2017-01-02 115.82 NaN
2017-01-03 116.15 NaN
BAC 2017-01-02 NaN 123.82
2017-01-03 NaN 124.15
由于符号已经表示为列名称,因此您可以简单地从单个数据范围的索引中删除此级别,然后您应该能够按预期合并:
df1.index = df1.index.droplevel(0)
AAPL
Date
2017-01-02 115.82
2017-01-03 116.15
df2.index = df2.index.droplevel(0)
BAC
Date
2017-01-02 123.82
2017-01-03 124.15
prices_df = pd.concat([df1, df2],axis=1,copy=False)
AAPL BAC
Date
2017-01-02 115.82 123.82
2017-01-03 116.15 124.15