在For循环中重试单个迭代(Python)
Python新手(如果这是一个愚蠢的问题,很抱歉)!我目前正在使用for循环来下载和操作数据。不幸的是,我偶尔会遇到导致部分循环失败的简短网络问题 最初,我是这样做的:在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
# 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的方法。它工作得很好!再次感谢你的帮助!