在 Python 中,我使用了一個回圈,并在附加代碼中的第 6 行中( Portfolio_1_4 = Portfolio_1_4 * SP1500DailyReturns.loc[n_short, 'S&P 1500 SUPER COMPOSITE - PRICE INDEX'] / SP1500DailyReturns.loc[str_4ll_Dateo, 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:
Test_set.loc[n, 'Portfolio_1_4_allocation'] = 'Portfolio 1 is already allocated!'
Test_set.loc[n, 'Portfolio_1_4'] = Portfolio_1_4
if (Portfolio_2_4_Date_sell < pd.Timestamp(Test_set.loc[n, 'feedTimestamp'])):
Portfolio_2_4 = Portfolio_2_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_2_4'] = Portfolio_2_4
Portfolio_2_4_Date_sell = Date_Buy pd.Timedelta("30 days")
Portfolio_3_4 = Portfolio_3_4
Test_set.loc[n, 'Portfolio_3_4'] = Portfolio_3_4
else:
Test_set.loc[n, 'Portfolio_2_4_allocation'] = 'Portfolio 1 and 2 are already allocated!'
Test_set.loc[n, 'Portfolio_2_4'] = Portfolio_2_4
if (Portfolio_3_4_Date_sell < pd.Timestamp(Test_set.loc[n, 'feedTimestamp'])):
Portfolio_3_4 = Portfolio_3_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_3_4'] = Portfolio_3_4
Portfolio_3_4_Date_sell = Date_Buy pd.Timedelta("30 days")
else:
Test_set.loc[n, 'Portfolio_3_4_allocation'] = 'Portfolio 1, 2 and 3 are already allocated!'
Test_set.loc[n, 'Portfolio_3_4'] = Portfolio_3_3
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
uj5u.com熱心網友回復:
首先,看看如何生成一個最小的可重現示例。
你可以通過兩種方法來做到這一點。您可以存盤前一個變數以供下一個回圈中參考。或者您可以使用它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]
uj5u.com熱心網友回復:
我認為最好的方法是在處理之前填補日期列的空白。這是如何做到這一點的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']
這個例子不處理連續的間隙,但如果你理解它是如何作業的,那就不會有問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315447.html
