2017-10-20 22 views
0

루프를 만들어 함수를 반복합니다. 이 함수는 단순히 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 
+4

만약'시도 = 3 '이라면'시도 = 0'을 설정하면됩니다. 실제로는'0 <3'이면 거친 것 중 하나가 항상 참입니다 .. –

+0

모든 예외가 발생할 때마다 0으로 설정하려고합니다 . –

+0

또한 스크립트가 각 티커를 독립적으로 처리하도록하려면 각 티커의 실패를 별도로 추적해야합니다. 당신이 이것을 할 수있는 많은 방법들이 있습니다. 하나의 좋은 방법은 사전을 사용하는 것입니다 :'{ 'ticker_a': 0, 'ticker_b : 1, ...}' – DaveL17

답변

1

변수 시도가 작동하도록하려면 while 루프 외부에서 정의해야합니다.

+0

감사합니다. 시도 = 0을 While 루프 외부에 넣으려고 시도하지만 작동하지 않는 것 같습니다. 나는 이것이 통과 논증과 관련이 있다고 생각한다. 아래 코드를 사용하더라도 작동하지 않습니다. 데이터가없는 티커를 통과하지 못했습니다. 진정한 동안 : 시도 : get_data_from_yahoo() 제외 : 다른 패스 : 휴식 – MKYJ

+0

나는이 문제를 해결했다. 이 솔루션은 [link] (https://stackoverflow.com/questions/36249835/python-how-to-avoid-error-exceptions-in-pandas-while-still-getting-data)와 비슷합니다. – MKYJ

+0

굉장할까요? 솔루션으로 내 대답을 표시하십시오. – mgracer