【问题标题】:"ValueError: Index contains duplicate entries, cannot reshape" Pandas DataReader“ValueError:索引包含重复条目,无法重塑”Pandas DataReader
【发布时间】:2019-09-11 09:11:40
【问题描述】:

我可以从雅虎读取“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

为什么?

【问题讨论】:

标签: python pandas api yahoo pandas-datareader


【解决方案1】:

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

当 BTC-USD 自行下载时,它不会产生此问题,因为 pandas-datareader 正在取消堆叠并且所有符号都成为列名。当只有一个符号时,这不是问题。但是,如果有许多符号,则在取消堆叠时会导致错误。

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

【讨论】:

    【解决方案2】:

    意识到这是一个老问题,但我在下载 Yahoo Finance 时遇到了同样的问题。我相信这个特殊问题是雅虎特有的,由于某种原因,它在一天内发送多个价格。其中一项建议涉及重新索引,但由于“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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-23
      • 2018-05-31
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多