使用循环的前一个值来获取前一个位置 (n-1) 而不是每个都给出 Key Error

Using the previous value of the loop to get previous position (n-1) instead each one giving 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”获取数据而不是日期“[=23”的数据=]_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

首先,看看如何生成minimal reproducible example

您可以通过两种方法完成此操作。您可以存储上一个变量以供在下一个循环中引用。或者您可以使用 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]

我认为最好是在处理之前填补日期列的空白。这是如何做的 numpy 版本

import numpy as np
dates=np.array(['1996-03-20', '2021-07-31', '1998-08-15', '1972-10-03', '', '1987-08-15'], dtype='datetime64')
mask=np.isnat(dates)
rot_mask=np.hstack((mask[1:],mask[0]))
dates[mask]=dates[rot_mask]
print(dates)
>>> ['1996-03-20' '2021-07-31' '1998-08-15' '1972-10-03' '1972-10-03'
 '1987-08-15']

此示例不处理连续间隙,但如果您了解它的工作原理,就不会有问题