在For循环中重试单个迭代(Python)

在For循环中重试单个迭代(Python),python,pandas,loops,for-loop,yahoo-api,Python,Pandas,Loops,For Loop,Yahoo Api,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 cod

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
这样,代码总是毫无问题地运行,但每当我遇到网络错误时,它就会跳过它所在的所有ticker(无法下载它们的数据)

我想下载每个股票代码的数据一次。如果失败了,我希望它再试一次,直到成功一次,然后再转到下一个股票代码。我尝试使用
而不是True
及其变体,但它导致循环多次下载同一个股票代码


非常感谢您的任何帮助或建议!谢谢大家!

您可以使用包装器循环继续,直到获得良好的结果

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
如果在遇到故障(某些协议支持)后可以继续,那么最好不要使用这种精确的方法。但对于一个稍微暴力的方法:

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))
这和Prune有点不同,它在10次尝试后停止。。。如果它失败了那么多次,这表明您可能需要将一些精力转移到修复不同的问题上,例如网络连接


如果它达到了这一点,它将继续出现在
Ticker
s列表中,因此您可能可以获得您所需的大部分内容。

请显示while loop trunt plesestephen;它为阅读你的问题的任何人提供了一个结尾,并为回答者提供了一点感激之情。既然你只能接受一个,我建议投票作为一个额外的步骤来感谢不止一个。什么时候是
失败
除了
错误
之外的任何事情?(我认为你的第一个作业应该是第2行中的
fail=True
)这不是一个简单的
,而在
块的和处,True
+
break
,试着完全那样做(而不是手动处理
fail
bool)?Julien说得好,尽管跟踪某些东西可能是有益的,例如包括一个失败的限制(正如我在回答中所做的)。但是,省略单个
bool
,需要其他形式的确定数据是否完整,而无需显式访问
data
(除非之前将其设置为类似
None
)。@
你们两个都
:优点。我将其编码为一个通用版本,很容易修改以反转逻辑,或者添加一个计数器进行尝试。我最终采用了r2evans的方法。它工作得很好!再次感谢你的帮助!