在单个请求中请求多个加密货币数据集时,pandas_datareader 抛出错误

问题描述

如果我只调用一种加密货币它有效,但对于多个它却失败了。

import pandas_datareader as pdr
...
crypto_df = pdr.DataReader('BTC-USD',data_source = 'yahoo',start = '2015-01-01')

工作正常

crypto_df = pdr.DataReader('ETH-USD',start = '2015-01-01')

也很好用

crypto_df = pdr.DataReader(['BTC-USD','ETH-USD'],start = '2015-01-01')

失败并出现以下错误

Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/home/alex/.local/lib/python3.8/site-packages/pandas/util/_decorators.py",line 199,in wrapper
    return func(*args,**kwargs)
  File "/home/alex/.local/lib/python3.8/site-packages/pandas_datareader/data.py",line 376,in DataReader
    return YahooDailyReader(
  File "/home/alex/.local/lib/python3.8/site-packages/pandas_datareader/base.py",line 258,in read
    df = self._dl_mult_symbols(self.symbols)
  File "/home/alex/.local/lib/python3.8/site-packages/pandas_datareader/base.py",line 285,in _dl_mult_symbols
    result = concat(stocks,sort=True).unstack(level=0)
  File "/home/alex/.local/lib/python3.8/site-packages/pandas/core/frame.py",line 7349,in unstack
    result = unstack(self,level,fill_value)
  File "/home/alex/.local/lib/python3.8/site-packages/pandas/core/reshape/reshape.py",line 417,in unstack
    return _unstack_frame(obj,fill_value=fill_value)
  File "/home/alex/.local/lib/python3.8/site-packages/pandas/core/reshape/reshape.py",line 444,in _unstack_frame
    return _Unstacker(
  File "/home/alex/.local/lib/python3.8/site-packages/pandas/core/reshape/reshape.py",line 118,in __init__
    self._make_selectors()
  File "/home/alex/.local/lib/python3.8/site-packages/pandas/core/reshape/reshape.py",line 167,in _make_selectors
    raise ValueError("Index contains duplicate entries,cannot reshape")

这对股票按预期工作,但对加密货币无效。

我相信这不是我的问题,但我希望有人可以确认。如果这是一个未知的错误,我会向开发人员开一张票。

解决方法

您需要定义要获取的索引。

#Trying to fetch crypto data from yahoo
from pandas_datareader import data as wb
tickers = ['BTC-USD','ETH-USD']
crypto_data = pd.DataFrame()
for t in tickers:
  crypto_data[t] = wb.DataReader(t,data_source ='yahoo',start= '2020-12-01')['Adj Close']

在这种情况下,您缺少 ['Adj Close']