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
vous définissez 'tentatives = 0' juste avant' si tentatives <3' ... effectivement vous venez de faire 'si 0 <3' lequel de grossier est toujours vrai .. –
vous définissez les tentatives de 0 dans chaque exception élevée . –
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