"ValueError: Index contains duplicate entries, cannot reshape" Pandas DataReader
"ValueError: Index contains duplicate entries, cannot reshape" Pandas DataReader
我可以从 yahoo 读取“AAPL”符号历史数据
dfcomp3 = web.DataReader(["AAPL"],'yahoo',start=start,end=end)['Adj Close']
我可以从yahoo上读取“GE”符号历史数据
dfcomp3 = web.DataReader(["AAPL"],'yahoo',start=start,end=end)['Adj Close']
我可以从 yahoo 读取“BTC-USD”符号历史数据
dfcomp3 = web.DataReader(["BTC-USD"],'yahoo',start=start,end=end)['Adj Close']
我可以从 yahoo 读取“AAPL”、“GE”符号历史数据
dfcomp7 = web.DataReader(["GE", "AAPL"],'yahoo',start=start,end=end)['Adj Close']
我无法从 yahoo 读取两个“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 正在取消堆叠并且所有符号都变成列名。这不是问题,因为只有一个符号。然而,对于许多符号,它会在拆栈时导致错误。
对于日期为 19 年 12 月 4 日和 19 年 12 月 6 日的以下代码 CBS、STI、VIAB,我遇到了同样的问题。
意识到这是一个老问题,但我在下载 Yahoo Finance 时遇到了同样的问题。我相信这个特定问题是 Yahoo 特有的,出于某种原因,它在一天内发送了多个价格。其中一项建议涉及重建索引,但由于 'DataReader' 转换为 pandas 的方式,您根本无法创建数据框,因此无法重建索引。
这是我的解决方案。我已经包括了一个 try except
因为我认为这个问题可能会暂时发生(例如,Yahoo 将来会修复重复项)并且因为我的代码每天都在运行,所以我想灵活地解决这个问题或不依赖在发送的输出上。我在这里使用主要的罗素指数作为我的样本。此代码尝试执行正常方式,如果抛出 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
我可以从 yahoo 读取“AAPL”符号历史数据
dfcomp3 = web.DataReader(["AAPL"],'yahoo',start=start,end=end)['Adj Close']
我可以从yahoo上读取“GE”符号历史数据
dfcomp3 = web.DataReader(["AAPL"],'yahoo',start=start,end=end)['Adj Close']
我可以从 yahoo 读取“BTC-USD”符号历史数据
dfcomp3 = web.DataReader(["BTC-USD"],'yahoo',start=start,end=end)['Adj Close']
我可以从 yahoo 读取“AAPL”、“GE”符号历史数据
dfcomp7 = web.DataReader(["GE", "AAPL"],'yahoo',start=start,end=end)['Adj Close']
我无法从 yahoo 读取两个“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 正在取消堆叠并且所有符号都变成列名。这不是问题,因为只有一个符号。然而,对于许多符号,它会在拆栈时导致错误。
对于日期为 19 年 12 月 4 日和 19 年 12 月 6 日的以下代码 CBS、STI、VIAB,我遇到了同样的问题。
意识到这是一个老问题,但我在下载 Yahoo Finance 时遇到了同样的问题。我相信这个特定问题是 Yahoo 特有的,出于某种原因,它在一天内发送了多个价格。其中一项建议涉及重建索引,但由于 'DataReader' 转换为 pandas 的方式,您根本无法创建数据框,因此无法重建索引。
这是我的解决方案。我已经包括了一个 try except
因为我认为这个问题可能会暂时发生(例如,Yahoo 将来会修复重复项)并且因为我的代码每天都在运行,所以我想灵活地解决这个问题或不依赖在发送的输出上。我在这里使用主要的罗素指数作为我的样本。此代码尝试执行正常方式,如果抛出 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