Я хочу создать простой скрипт, который извлекает биржевые данные из Yahoo Finance с помощью пакета pandas_datareader:
from pandas_datareader import data
stocks = data.DataReader('MSFT', 'yahoo', start='2020-01-14', end='2023-01-14')
но код дает мне сообщение "строковые индексы должны быть целыми числами" TypeError
TypeError Traceback (most recent call last)
Cell In[1], line 3
1 from pandas_datareader import data
----> 3 stocks = data.DataReader('MSFT', 'yahoo', start='2020-01-14', end='2023-01-14')
File c:\Users\der_L\anaconda3\envs\py39\lib\site-packages\pandas\util\_decorators.py:211, in deprecate_kwarg.<locals>._deprecate_kwarg.<locals>.wrapper(*args, **kwargs)
209 else:
210 kwargs[new_arg_name] = new_arg_value
--> 211 return func(*args, **kwargs)
File c:\Users\der_L\anaconda3\envs\py39\lib\site-packages\pandas_datareader\data.py:379, in DataReader(name, data_source, start, end, retry_count, pause, session, api_key)
367 raise NotImplementedError(msg)
369 if data_source == "yahoo":
370 return YahooDailyReader(
371 symbols=name,
372 start=start,
373 end=end,
374 adjust_price=False,
375 chunksize=25,
376 retry_count=retry_count,
377 pause=pause,
378 session=session,
--> 379 ).read()
381 elif data_source == "iex":
...
--> 153 data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"]
154 except KeyError:
155 msg = "No data fetched for symbol {} using {}"
TypeError: string indices must be integers
Скрипт почти такой же, как многие видели в сети, но я не могу понять, что с ним не так.
Вы используете строки для дат начала и окончания. Использовать:
import datetime
start_date = datetime.datetime(2020, 1, 14)
end_date = datetime.datetime(2023, 1, 14)
Затем используйте их в вызове DataReader
Похоже, в настоящее время есть изменение, которое еще не обновлено в pandas-datareader. Отчет об ошибке можно найти здесь. В качестве обходного пути вы можете использовать пакет yfinance, как показано ниже. Чтобы это работало, вы должны установить пакет yfinance с помощью pip install yfinance
.
Затем приведенный ниже модифицированный код должен установить все.
from pandas_datareader import data
import yfinance as yfin
yfin.pdr_override()
stocks = data.get_data_yahoo('MSFT', start='2020-01-14', end='2023-01-14')
Говоря о yfinance, я заметил, что yfin.Ticker("MSFT").info выдает ту же ошибку.
Если это почти то же самое, вы можете выяснить, что вызывает проблему, изучив, в чем разница.