3
votes

Aucune donnée récupérée Web.DataReader Panda

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


1 commentaires

avez-vous pu contourner ce problème? cela mérite en fait un nouveau post.


5 Réponses :


5
votes

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"


0 commentaires

9
votes

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


0 commentaires

2
votes

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)


0 commentaires

0
votes

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.


0 commentaires

0
votes

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


1 commentaires

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."