pdr。数据读取器 - 类型错误:字符串索引必须是整数

问题描述 投票:0回答:4

这段代码直到今天都运行良好。 现在我收到此错误消息: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 typeerror datareader
4个回答
4
投票

因此,如果您绝对必须使用

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]


2
投票

我的代码也停止工作了。

雅虎似乎已经改变了他们的界面。用麦考伊博士的不朽名言来说:“我了解工程师。他们喜欢改变事物。”

我对代码进行了以下更改:

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

这应该不是问题,除非您对所有列代码进行硬编码,所以要小心。

我没有做过任何基准测试,但下载感觉更快。


0
投票

这对我有用。尝试获取过去 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

0
投票

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
库本身还没有实现

© www.soinside.com 2019 - 2024. All rights reserved.