这段代码直到今天都运行良好。 现在我收到此错误消息:TypeError:字符串索引必须是整数
import pandas_datareader as pdr
Equity_Indices = ['^GSPC', 'ES=F', 'NQ=F', 'YM=F', '^RUT', '^DJT',
'^GDAXI', '^N225', '^SSMI', '^STOXX50E', '^FCHI',
'^GSPTSE', '^HSI', '000001.SS', '^KS11', '^NSEI', '^AXJO']
Equity_Indices_df = pdr.DataReader(Equity_Indices, 'yahoo', start='1990-01-01', end='today')
发生什么事了?我有点迷失在这里。
我完全迷失了,我什么也没改变。这段代码昨天运行得很好。
因此,如果您绝对必须使用
pandas_datareader
,您将需要将其降级为:
pip install pandas_datareader==0.9.0
您的代码将运行
import pandas_datareader as pdr
import timedelta
import pandas as pd
from datetime import date
Equity_Indices = ['^GSPC', 'ES=F', 'NQ=F', 'YM=F', '^RUT', '^DJT', '^GDAXI', '^N225', '^SSMI', '^STOXX50E', '^FCHI', '^GSPTSE', '^HSI', '000001.SS', '^KS11', '^NSEI', '^AXJO']
print(pdr.__version__)
from datetime import datetime
startdate = '1990-01-01'
today = date.today()
enddate = today
dd = []
for symbol in Equity_Indices:
try:
Equity_Indices_df = pdr.DataReader(symbol,'yahoo',startdate,enddate)
print(Equity_Indices_df.head(5))
dd.append(Equity_Indices_df)
except:
print('did not find: '+symbol)
但会回来:
did not find: ^GSPC
did not find: ES=F
did not find: NQ=F
did not find: YM=F
did not find: ^RUT
did not find: ^DJT
did not find: ^GDAXI
did not find: ^N225
did not find: ^SSMI
did not find: ^STOXX50E
did not find: ^FCHI
did not find: ^GSPTSE
did not find: ^HSI
did not find: 000001.SS
did not find: ^KS11
did not find: ^NSEI
did not find: ^AXJO
这意味着
Yahoo
已更改了从中检索符号数据的页面上的某些内容。
今天,唯一的解决办法是执行以下操作:
您需要使用
y_finance
并使用 pdr_overide()
from pandas_datareader import data as pdr
from datetime import datetime,date
import yfinance as yf
yf.pdr_override()
y_symbols = ['^GSPC', 'ES=F', 'NQ=F', 'YM=F', '^RUT', '^DJT', '^GDAXI', '^N225', '^SSMI', '^STOXX50E', '^FCHI', '^GSPTSE', '^HSI', '000001.SS', '^KS11', '^NSEI', '^AXJO']
from datetime import datetime
startdate = datetime(1990,1,1)
today = date.today()
enddate = today
data = pdr.get_data_yahoo(y_symbols, start=startdate, end=enddate)
返回:
print(data.head(2)
Adj Close \
000001.SS ES=F NQ=F YM=F ^AXJO ^DJT ^FCHI ^GDAXI ^GSPC
Date
1990-01-02 NaN NaN NaN NaN NaN NaN NaN 1788.890015 359.690002
1990-01-03 NaN NaN NaN NaN NaN NaN NaN 1867.290039 358.760010
... Volume \
^GSPTSE ... ^GDAXI ^GSPC ^GSPTSE ^HSI ^KS11 ^N225
Date ...
1990-01-02 3994.230957 ... 0.0 162070000.0 164600.0 0.0 NaN NaN
1990-01-03 3999.317871 ... 0.0 192330000.0 147600.0 0.0 NaN NaN
^NSEI ^RUT ^SSMI ^STOXX50E
Date
1990-01-02 NaN 162070000.0 NaN NaN
1990-01-03 NaN 192330000.0 NaN NaN
[2 rows x 102 columns]
我的代码也停止工作了。
雅虎似乎已经改变了他们的界面。用麦考伊博士的不朽名言来说:“我了解工程师。他们喜欢改变事物。”
我对代码进行了以下更改:
import yfinance as yf
yf.pdr_override()
df = yf.download(ticker, dateStart, dateEnd)
这又造成了另一个小麻烦,现在列的顺序不同了。而之前他们是:
Date, High, Low, Open, Close, Volume, Adj Close
他们现在是:
Date, Open, High, Low, Close, Adj Close, Volume
这应该不是问题,除非您对所有列代码进行硬编码,所以要小心。
我没有做过任何基准测试,但下载感觉更快。
这对我有用。尝试获取过去 5 年的数据。
import yfinance as yf
from datetime import date, timedelta
today = date.today()
today
end_date = today.strftime("%Y-%m-%d")
end_date
d1 = date.today() - timedelta(days=360*5) #for last 5 years
d1
start_date = d1.strftime("%Y-%m-%d")
start_date
data = yf.download(tickers = "GOOGL",
start = start_date,
end = end_date)
data.shape
pandas_datareader.yahoo.daily.YahooDailyReader可以创建对象
import pandas_datareader as web
obj= web.yahoo.daily.YahooDailyReader('GOOG' , '1/1/15', '1/1/22', chunksize=100)
但是当您尝试
obj.read()
时,内部库会发生错误:
if isinstance(self.symbols, (string_types, int)):
df = self._read_one_data(self.url, params=self._get_params(self.symbols))
哪里
def _get_params(self, *args, **kwargs):
raise NotImplementedError
pandas_datareader
最新 version 0.10
因此,
yahoo
库本身还没有实现