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循环”#39;以下:
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
及其变体,但它导致循环多次下载相同的自动收报机!
非常感谢任何帮助或建议!谢谢!
答案 0 :(得分:1)
如果您在遇到故障后可以继续(某些协议支持它),那么最好不要使用这种方法。但对于一种略显强力的方法:
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
列表中,所以也许你可以得到你需要的大部分内容。
答案 1 :(得分:0)
您可以使用包装循环继续,直到获得良好的结果。
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