【问题标题】:Using the previous value of the loop to get previous position (n-1) instead each one giving Key Error使用循环的前一个值来获取前一个位置 (n-1),而不是每个位置都给出 Key Error
【发布时间】:2021-10-14 21:41:56
【问题描述】:

在 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

【问题讨论】:

    标签: python loops keyerror


    【解决方案1】:

    首先,看看如何生成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]
    

    【讨论】:

    • 第一种方法效果很好,谢谢!
    【解决方案2】:

    我认为最好的方法是在处理之前填补日期列的空白。这是一个 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']
    

    这个例子不处理连续的间隙,但如果你理解它是如何工作的,那将不是问题

    【讨论】:

    • 非常感谢这个想法,但我决定避免两次添加相同的日期,以避免在我的代码中使用日期作为 loc 函数中的索引时遇到麻烦。但我会在稍后在类似情况下使用这种方法。
    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 2015-02-03
    • 2021-10-28
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多