2017-10-20 47 views
0

Je crée une boucle pour itérer une fonction. La fonction est simplement d'obtenir des données de Yahoo Finance par une liste de tickers. Cependant, certains tickers n'ont pas de données dans yahoo finance et parfois il y a un bug, donc j'ai besoin de relancer la fonction chaque fois que j'ai cette erreur.ignorer l'erreur et continuer à courir après avoir reçu 3 erreurs dans une boucle - Obtenir des données de prix à partir de Pandas

Fondamentalement, réexécuter peut résoudre le bug, mais il ne peut pas aider s'il n'y a pas de données dans la base de données. Donc, je veux utiliser une boucle définissant que s'il y a une erreur, puis relancer, mais sauter ce ticker si une erreur apparaît 3 fois pour ce téléscripteur.

Je pense que j'ai fait quelque chose de mal dans la boucle, il n'a pas passé ce téléscripteur et il continue de fonctionner même s'il a déjà des erreurs pour ce téléscripteur pendant plus de 3 fois. Puis-je savoir comment puis-je le résoudre?

Merci!

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
import pickle 
import datetime as dt 
import os 
import pandas as pd 
import pandas_datareader.data as web 

def save_hsci_tickers(): 
    driver = webdriver.Chrome(r"C:/Users/kman/Downloads/chromedriver_win32/chromedriver.exe") 
    wait = WebDriverWait(driver, 10) 
    driver.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false") 
    tickers = [] 
    for name in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table.greygeneraltxt td.greygeneraltxt,td.lightbluebg"))): 
     data = str(name.get_attribute('textContent')) 
     tickers.append(data) 
    edit = [x for x in tickers if x != ''] 
    final = edit[::2] 
    driver.quit() 

    def yahoo_ticker(data): 
     if len(data) <= 4: 
      return data.zfill(4) + '.HK' 
     else: 
      return data[0:] + '.HK' 
    yahoo_tickers = [yahoo_ticker(data) for data in final] 
    with open("hscitickers.pickle","wb") as f: 
     pickle.dump(yahoo_tickers, f) 

    print(yahoo_tickers) 
    return yahoo_tickers 

save_hsci_tickers() 

def get_data_from_yahoo (reload_hscitickers=False): 
    if reload_hscitickers: 
     tickers = save_hsci_tickers() 
    else: 
     with open("hscitickers.pickle","rb") as f: 
      tickers = pickle.load(f) 

    if not os.path.exists('stock_dfs'): 
     os.makedirs('stock_dfs') 

    start = dt.datetime(2009,6,30) 
    end = dt.datetime(2017,6,30) 

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

attempts = 0 
while True: 
    try: 
     get_data_from_yahoo() 
    except: 
     if attempts < 3: 
      attempts += 1 
      continue 
     if attempts >= 3: 
      pass 
    else: 
     break 
+4

vous définissez 'tentatives = 0' juste avant' si tentatives <3' ... effectivement vous venez de faire 'si 0 <3' lequel de grossier est toujours vrai .. –

+0

vous définissez les tentatives de 0 dans chaque exception élevée . –

+0

En outre, si vous voulez que le script gère indépendamment chaque ticker, vous devrez suivre les échecs séparément pour chaque ticker. Il y a beaucoup de façons de le faire. Un bon moyen serait d'utiliser un dictionnaire: '{'ticker_a': 0, 'ticker_b: 1, ...}' – DaveL17

Répondre

1

Vous devez définir les tentatives variables en dehors de la boucle while pour le faire fonctionner.

+0

Merci. J'essaie de mettre des tentatives = 0 en dehors de la boucle While, mais cela ne semble pas fonctionner aussi. Je pense que c'est lié à l'argument pass. Même si j'utilise les codes ci-dessous, cela n'a pas fonctionné. Il n'a pas passé le ticker qui n'a pas de données. while True: essayer: get_data_from_yahoo() sauf: passe autre: break – MKYJ

+0

J'ai résolu la question. La solution est similaire à ceci [lien] (https://stackoverflow.com/questions/36249835/python-how-to-avoid-error-exceptions-in-pandas-while-still-getting-data) – MKYJ

+0

Awesome pouvez-vous marque ma réponse en tant que solution – mgracer