"ValueError: Index contains duplicate entries, cannot reshape" 熊猫数据阅读器



我可以从雅虎读取"AAPL"符号历史数据

dfcomp3 = web.DataReader(["AAPL"],'yahoo',start=start,end=end)['Adj Close']

我可以从雅虎读取"GE"符号历史数据

dfcomp3 = web.DataReader(["AAPL"],'yahoo',start=start,end=end)['Adj Close']

我可以从雅虎阅读"BTC-USD"符号历史数据

dfcomp3 = web.DataReader(["BTC-USD"],'yahoo',start=start,end=end)['Adj Close']

我可以从雅虎读取"AAPL","GE"符号的历史数据

dfcomp7 = web.DataReader(["GE", "AAPL"],'yahoo',start=start,end=end)['Adj Close']

我无法同时阅读雅虎的"AAPL","BTC-USD"符号历史数据

dfcomp7 = web.DataReader(["BTC-USD", "AAPL"],'yahoo',start=start,end=end)['Adj Close']
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-58-0cbbb3aa9346> in <module>()
----> 1 dfcomp7 = web.DataReader(["BTC-USD", "AAPL" ],'yahoo',start=start,end=end)['Adj Close']
7 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/reshape/reshape.py in _make_selectors(self)
164 
165         if mask.sum() < len(self.index):
--> 166             raise ValueError('Index contains duplicate entries, '
167                              'cannot reshape')
168 
ValueError: Index contains duplicate entries, cannot reshape

为什么?

进入调试模式并在self.index上执行value_counts((。 这样,您将看到哪个日期的符号正在产生问题。

当BTC-USD自行下载时,它不会产生此问题,因为pandas-datareader正在解绑并且所有符号都成为列名。当只有一个符号时,这不是问题。但是,对于许多符号,它会导致在解锁时出错。

我在以下符号 CBS、STI、VIAB 的日期为 4 年 12 月 19 日和 12 月 6 日 19 日时遇到了同样的问题。

意识到这是一个老问题,但我在雅虎财经下载时遇到了同样的问题。我相信这个特殊的问题非常特定于雅虎,由于某种原因,它在一天内发送多个价格。其中一个建议涉及重新索引,但由于"DataReader"如何转换为熊猫,您根本无法创建数据帧,因此无法重新索引。

这是我的解决方案。我包含一个try except,因为我认为问题可能会暂时发生(例如,雅虎将来会修复重复项(,并且由于我的代码每天都在运行,因此我想灵活地遇到此问题或不遇到此问题取决于发送的输出。我在这里使用主要的罗素指数作为我的样本。此代码尝试以正常方式执行,如果抛出IndexError,则单独循环每个符号,删除任何重复项(默认情况下保留第一个(并将数据帧合并为一个。

def get_yahoo():
start = dt.datetime(1995, 12, 31)
end = dt.datetime.today()
yh_fields = ['^RLG', '^RLV', '^RUO', '^RUJ']
try:
yho = web.DataReader(yh_fields, 'yahoo', start, end)['Adj Close']
except ValueError:
yho = pd.DataFrame()
for y in yh_fields:
temp = web.DataReader(y, 'yahoo', start, end)['Adj Close']
temp = temp.rename(y)
temp = temp[~temp.index.duplicated()]
yho = yho.join(temp, how='outer')
return yho

最新更新