首页 > 解决方案 > 使用循环的前一个值来获取前一个位置 (n-1),而不是每个位置都给出 Key Error

问题描述

在 Python 中,我使用了一个循环,并在所附代码的末尾第 6 行( Portfolio_1_4 = Portfolio_1_4 * SP1500DailyReturns.loc[n_short, 'S&P 1500 SUPER COMPOSITE - PRICE INDEX'] / SP1500DailyReturns.loc[str(Portfolio_1_4_Date_sell_short), ' S&P 1500 SUPER COMPOSITE - PRICE INDEX']) 我收到一个关键错误。由于 SP1500DailyReturns 中不存在某些日期信息,因此出现此错误,因此代码无法获取它进行计算。

怎么可能修改我的算法,以便当这条线面临关键错误时,它会从循环中的前一个位置(n-1)获取日期?

例如,日期“n_short”不存在,然后算法从日期“n_short - 1”获取数据,而不是日期“Portfolio_1_4_Date_sell_short”的数据不存在,然后算法获取日期“Portfolio_1_4_Date_sell_short”的数据-1”。

谢谢!

   for n in dates: 
   n_short = n[:10]
   Date_Buy = pd.Timestamp(n) 
   Date_sell = Date_Buy + pd.Timedelta("30 days") 
   Date_buy_SP1500 = Date_sell
   Date_sell_SP1500 = Date_Buy
   if (Test_set.loc[n, '4_signals'] == 1):

     if (Portfolio_1_4_Date_sell < pd.Timestamp(Test_set.loc[n, 'feedTimestamp'])):
       Portfolio_1_4 = Portfolio_1_4 * Test_set.loc[n, 'Cumulative stock Returns over the 30 days after transaction  (22 working days)'] # For 5 days i will have to change to 5 days column later
       Test_set.loc[n, 'Portfolio_1_4'] = Portfolio_1_4
       Portfolio_1_4_Date_sell = Date_Buy + pd.Timedelta("30 days")
       Portfolio_1_4_Date_sell_short = Portfolio_1_4_Date_sell.strftime("%Y-%m-%d")
       Portfolio_2_4 = Portfolio_2_4
       Test_set.loc[n, 'Portfolio_2_4'] = Portfolio_2_4
       Portfolio_3_4 = Portfolio_3_4
       Test_set.loc[n, 'Portfolio_3_4'] = Portfolio_3_4

         
   else:
       Portfolio_1_4 = Portfolio_1_4 * SP1500DailyReturns.loc[n_short, 'S&P 1500 SUPER COMPOSITE - PRICE INDEX'] / SP1500DailyReturns.loc[Portfolio_1_4_Date_sell_short, 'S&P 1500 SUPER COMPOSITE - PRICE INDEX']
       Test_set.loc[n, 'Portfolio_1_4'] = Portfolio_1_4
       Portfolio_2_4 = Portfolio_2_4 
       Test_set.loc[n, 'Portfolio_2_4'] = Portfolio_2_4
       Portfolio_3_4 = Portfolio_3_4 
       Test_set.loc[n, 'Portfolio_3_4'] = Portfolio_3_4

标签: pythonloopskeyerror

解决方案


首先,看看如何生成一个最小的可重现示例

您可以通过两种方法做到这一点。您可以存储前一个变量以供在下一个循环中参考。或者您可以使用enumerate()捕获索引并使用它来调用上一个条目。两者的例子如下

# Storing previous loop
n_old = None    # Initialising
for n in dates:
    try:
        data = n[0]
    except KeyError:
        data = n_old[0]
    n_old = n

# Using enumerate
for ii, n in enumerate(dates):
    try:
        data = n[0]
    except KeyError:
        if ii == 0:
            data = None
        else:
            data = dates[ii-1][0]

推荐阅读