루프를 만들어 함수를 반복합니다. 이 함수는 단순히 yahoo finance에서 데이터를 시세 목록으로 가져옵니다. 그러나 일부 시세 표시기에는 yahoo finance의 데이터가 없으며 때때로 버그가 있으므로이 오류가 발생할 때마다 함수를 다시 실행해야합니다.오류를 건너 뛰고 루프에서 3 개의 오류가 발생한 후에 계속 실행 - Pandas에서 가격 데이터 가져 오기
기본적으로 다시 실행하면 버그를 해결할 수 있지만 데이터베이스에 데이터가없는 경우 도움이 될 수 없습니다. 따라서 오류가있는 경우 다시 실행하지만 그 시세에 오류가 3 번 나타나면 해당 시세표를 건너 뛰도록 정의하는 루프를 사용하고 싶습니다.
내가 루프에서 뭔가 잘못한 것 같아요, 그것은 그 시세를 통과하지 못했고 그것도 이미 3 번 이상 그 시세에 대한 오류가 점점 re-running 유지. 어떻게 해결할 수 있는지 알고 싶습니까?
감사합니다.
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
만약'시도 = 3 '이라면'시도 = 0'을 설정하면됩니다. 실제로는'0 <3'이면 거친 것 중 하나가 항상 참입니다 .. –
모든 예외가 발생할 때마다 0으로 설정하려고합니다 . –
또한 스크립트가 각 티커를 독립적으로 처리하도록하려면 각 티커의 실패를 별도로 추적해야합니다. 당신이 이것을 할 수있는 많은 방법들이 있습니다. 하나의 좋은 방법은 사전을 사용하는 것입니다 :'{ 'ticker_a': 0, 'ticker_b : 1, ...}' – DaveL17