Повторить одиночную итерацию в цикле For (Python) - PullRequest
0 голосов
/ 12 июня 2018

Python новичок здесь (извините, если это глупый вопрос)!В настоящее время я использую цикл for для загрузки и обработки данных.К сожалению, я иногда сталкиваюсь с краткими сетевыми проблемами, которые приводят к сбою частей цикла.

Первоначально я делал что-то вроде этого:

# Import Modules
import fix_yahoo_finance as yf
import pandas as pd
from stockstats import StockDataFrame as sdf

# Stock Tickers to Gather Data For - in my full code I have thousands of tickers
Ticker = ['MSFT','SPY','GOOG']

# Data Start and End Data
Data_Start_Date = '2017-03-01'
Data_End_Date = '2017-06-01'

# Create Data List to Append
DataList = pd.DataFrame([])

# Initialize Loop
for i in Ticker:
    # Download Data
    data = yf.download(i, Data_Start_Date, Data_End_Date)
    # Create StockDataFrame
    stock_df = sdf.retype(data)
    # Calculate RSI
    data['rsi'] = stock_df['rsi_14']
    DataList.append(pd.DataFrame(data))

DataList.to_csv('DataList.csv',header=True,index=True)

С этой базовой компоновкой, когда бы у меня не былосетевая ошибка, это привело к остановке всей программы и появлению ошибки.

Я провел некоторое исследование и попытался изменить цикл for следующим образом:

for i in Ticker:
  try:
    # Download Data
    data = yf.download(i, Data_Start_Date, Data_End_Date)
    # Create StockDataFrame
    stock_df = sdf.retype(data)
    # Calculate RSI
    data['rsi'] = stock_df['rsi_14']
    DataList.append(pd.DataFrame(data))
  except:
    continue

С этим,код всегда выполнялся без проблем, но всякий раз, когда я сталкивался с сетевой ошибкой, он пропускал все тикеры, на которых он работал (не удалось загрузить их данные).

Я хочу, чтобы это загружало данные для каждого тикера один раз.Если это не удается, я хочу, чтобы он повторил попытку, пока не получится один раз, а затем перешел к следующему тикеру.Я попытался использовать while True и его варианты, но это заставило цикл загружать один и тот же тикер несколько раз!

Любая помощь или совет очень важны!Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Если вы можете продолжить после сбоя (некоторые протоколы его поддерживают), то лучше не использовать этот точный подход.Но для метода чуть-чуть грубой силы:

for i in Ticker:
  incomplete = True
  tries = 10
  while incomplete and tries > 0:
    try:
      # Download Data
      data = yf.download(i, Data_Start_Date, Data_End_Date)
      incomplete = False
    except:
      tries -= 1
  # Create StockDataFrame
  if incomplete:
    print("Oops, it is really failing a lot, skipping: %r" % (i,))
    continue # not technically needed, but in case you opt to add
             # anything afterward ...
  else:
    stock_df = sdf.retype(data)
    # Calculate RSI
    data['rsi'] = stock_df['rsi_14']
    DataList.append(pd.DataFrame(data))

Это немного отличается от чернослива в том, что он останавливается после 10 попыток ... если он терпит неудачу столько раз, это указывает на то, что вы можете отвлечь некоторую энергиюв устранении другой проблемы, такой как сетевое подключение.

Если он достигнет этой точки, он продолжит в списке Ticker с, поэтому, возможно, вы сможете получить большую часть того, что вам нужно.

0 голосов
/ 12 июня 2018

Вы можете использовать цикл-обертку, чтобы продолжить, пока не получите хороший результат.

for i in Ticker:
  fail = True

  while fail:     # Keep trying until it works
    try:
      # Download Data
      data = yf.download(i, Data_Start_Date, Data_End_Date)
      # Create StockDataFrame
      stock_df = sdf.retype(data)
      # Calculate RSI
      data['rsi'] = stock_df['rsi_14']
      DataList.append(pd.DataFrame(data))
    except:
      continue
    else:
      fail = False
...