Je reçois ce message d'erreur lorsque j'essaye de créer un fichier CSV à partir de l'ensemble du S&P 500:
import bs4 as bs import datetime as dt import os import pandas_datareader.data as web import pickle import requests def save_sp500_tickers(): resp = requests.get('http://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 tickers.append(ticker) with open("sp500tickers.pickle", "wb") as f: pickle.dump(tickers, f) 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(2010, 1, 1) end = dt.datetime.now() for ticker in tickers: # just in case your connection breaks, we'd like to save our progress! if not os.path.exists('stock_dfs/{}.csv'.format(ticker)): df = web.DataReader(ticker, 'yahoo', start, end) df.reset_index(inplace=True) df.set_index("Date", inplace=True) df = df.drop("Symbol", axis=1) df.to_csv('stock_dfs/{}.csv'.format(ticker)) else: print('Already have {}'.format(ticker)) get_data_from_yahoo()
Aucune donnée récupérée pour le symbole 3M Company utilisant YahooDailyReader
I pense que quelque chose ne va pas avec ceci:
for row in table.findAll('tr') [1:]: ticker = row.findAll('td')[0:].text
Quelqu'un peut-il m'aider s'il vous plaît? Merci d'avance.
Code complet-
Exception has occurred: pandas_datareader._utils.RemoteDataError
5 Réponses :
Le grattage à partir de wikipedia renvoie 'MMM / n' au fichier pickle.
Ajoutez
for row in table.findAll('tr')[1:]: ticker = row.findAll('td')[0].text ticker = ticker[:-1] tickers.append(ticker)
à
ticker = ticker[:-1]
et recréez votre fichier pickle.
Cela devrait laisser les tickers comme "MMM" et non "MMM / n"
Il existe plusieurs sections de code obsolètes. La solution que j'ai trouvée nécessitait d'installer fix_yahoo_finance et yfinance en utilisant:
import bs4 as bs import datetime as dt import os from pandas_datareader import data as pdr import pickle import requests import fix_yahoo_finance as yf yf.pdr_override() def save_sp500_tickers(): resp = requests.get('http://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.replace('.', '-') ticker = ticker[:-1] tickers.append(ticker) with open("sp500tickers.pickle", "wb") as f: pickle.dump(tickers, f) 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(2019, 6, 8) end = dt.datetime.now() for ticker in tickers: print(ticker) if not os.path.exists('stock_dfs/{}.csv'.format(ticker)): df = pdr.get_data_yahoo(ticker, start, end) df.reset_index(inplace=True) df.set_index("Date", inplace=True) df.to_csv('stock_dfs/{}.csv'.format(ticker)) else: print('Already have {}'.format(ticker)) save_sp500_tickers() get_data_from_yahoo()
Cela semblait fonctionner pour moi, code complet ci-dessous.
pip install yfinance pip install fix_yahoo_finance
Vous devrez prendre en compte les entreprises qui n'existent plus, la chronologie qui ne fonctionne pas avec vos paramètres de début et de fin, ou qui n'est pas reconnue par le module yahoo. Cela a bien fonctionné pour moi
failed = [] passed = [] data = pd.DataFrame() for x in s&p_symbols: try: data[x] = web.DataReader(x, data_source= "yahoo", start = "2019-1-1")["Adj Close"] passed.append(x) except (IOError, KeyError): msg = 'Failed to read symbol: {0!r}, replacing with NaN.' failed.append(x)
Si la même erreur se produit même après avoir édité votre code en fonction de la réponse de Luc McCutcheon, il vous suffit d'exécuter la même fonction get_data_from_yahoo ()
après un certain temps. Je pense que cela se produit parce que Yahoo Finance limite le nombre de demandes que vous pouvez envoyer.
J'utilise ce code pour le résoudre:
failed=[] passed=[] def collect_data(data): mydata = pd.DataFrame() for t in data: try: mydata[t] = wb.DataReader(t,data_source='yahoo',start='01-10-2019')['Adj Close'] passed.append(t) except (IOError, KeyError): msg= 'NaN' failed.append(t) print(mydata) return mydata
Bien que les réponses de code uniquement puissent répondre à la question, vous pouvez améliorer considérablement la qualité de votre réponse en fournissant un contexte pour votre code, une raison pour laquelle ce code fonctionne et des références à la documentation pour une lecture plus approfondie. De Comment répondre : "La concision est acceptable, mais des explications plus complètes sont meilleures."
avez-vous pu contourner ce problème? cela mérite en fait un nouveau post.