使用循环的前一个值来获取前一个位置 (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']
此示例不处理连续间隙,但如果您了解它的工作原理,就不会有问题
在 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']
此示例不处理连续间隙,但如果您了解它的工作原理,就不会有问题