Ошибка при извлечении данных о цене акций с использованием Python, Pandas и Yahoo Finance API - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь запустить скрипт на python, который извлекает данные о ценах из финансов Yahoo для S & P 500, как определено на странице википедии. Но почему-то в EVRG код выдает эту ошибку:

Traceback (последний вызов был последним): File "/Usr/local/lib/python3.7/site-packages/pandas/core/indexes/base.py", строка 3078, в get_loc вернуть файл self._engine.get_loc (key) «pandas / _libs / index.pyx», строка 140, в файле pandas._libs.index.IndexEngine.get_loc "pandas / _libs / index.pyx", строка 162, в Файл pandas._libs.index.IndexEngine.get_loc "pandas / _libs / hashtable_class_helper.pxi", строка 1492, в Файл pandas._libs.hashtable.PyObjectHashTable.get_item "pandas / _libs / hashtable_class_helper.pxi", строка 1500, в pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: 'Date'

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): файл "./python-for-finance-6.py", строка 50, в get_data_from_yahoo () Файл "./python-for-finance-6.py", строка 45, в get_data_from_yahoo Файл df = web.DataReader (ticker.replace (".", "-"), 'yahoo', start, end) "/Usr/local/lib/python3.7/site-packages/pandas_datareader/data.py", строка 310, в DataReader сессия = сессия) .read () файл "/usr/local/lib/python3.7/site-packages/pandas_datareader/base.py", строка 210, в чтении params = self._get_params (self.symbols)) Файл "/usr/local/lib/python3.7/site-packages/pandas_datareader/yahoo/daily.py", строка 142, в _read_one_data to_datetime (price ['Date'], unit = 's'). dt.date) Файл "/usr/local/lib/python3.7/site-packages/pandas/core/frame.py", строка 2688, в getitem вернуть файл self._getitem_column (key) File "/usr/local/lib/python3.7/site-packages/pandas/core/frame.py", строка 2695, в _getitem_column вернуть файл self._get_item_cache (key) File "/usr/local/lib/python3.7/site-packages/pandas/core/generic.py", строка 2489, в _get_item_cache values ​​= self._data.get (item) Файл "/usr/local/lib/python3.7/site-packages/pandas/core/internals.py", линия 4115, в get loc = self.items.get_loc (item) Файл "/usr/local/lib/python3.7/site-packages/pandas/core/indexes/base.py", строка 3080, в get_loc вернуть self._engine.get_loc (self._maybe_cast_indexer (key)) Файл "pandas / _libs / index.pyx", строка 140, в Файл pandas._libs.index.IndexEngine.get_loc "pandas / _libs / index.pyx", строка 162, в Файл pandas._libs.index.IndexEngine.get_loc "pandas / _libs / hashtable_class_helper.pxi", строка 1492, в Файл pandas._libs.hashtable.PyObjectHashTable.get_item "pandas / _libs / hashtable_class_helper.pxi", строка 1500, в pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: 'Date'

Может кто-нибудь помочь, пожалуйста ??

Мой код такой:

import bs4 as bs
import datetime as dt
import os 
import pandas as pd
import pandas_datareader.data as web
import pickle
import requests

# This is a script that will get the tickers from the wikipedia list, 
print them and save it as a pickle file
def save_sp500_tickers():
    resp = requests.get('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
    soup = bs.BeautifulSoup(resp.text, 'lxml')
    table = soup.find('table', {'class': 'wikitable sortable'})
    tickers= []
    for row in table.findAll('tr')[1:]:
        ticker=row.findAll('td')[0].text
        mapping = str.maketrans(".","-")
        ticker = ticker.translate(mapping)
        if ticker.find("_"):
            ticker = ticker.replace("_","-")
        tickers.append(ticker)
    with open("sp500tickers.pickle", "wb") as f:
        pickle.dump(tickers, f)
    print(tickers)

    return tickers

save_sp500_tickers()

def get_data_from_yahoo(reload_sp500 = False):
    if reload_sp500:
        tickers = save_sp500_tickers()
    else: 
        with open("sp500tickers.pickle", "rb") as f:
            tickers = pickle.load(f)
    if not os.path.exists('stock_dfs'):
        os.makedirs('stock_dfs')

    start = dt.datetime(2000,1,1)
    end = dt.datetime(2017,12,31)

    for ticker in tickers:
        print(ticker)
        if not os.path.exists('stock_dfs/{}.csv'.format(ticker)):
            df = web.DataReader(ticker.replace(".","-"), 'yahoo', start, end)
            df.to_csv('stock_dfs/{}.csv'.format(ticker))
        else:
            print('Already have {}'.format(ticker))

get_data_from_yahoo()
...