两个列表的长度差异

问题描述 投票:0回答:1

我有这个函数可以计算一系列水下的周期(sp_500):

def period_under_water(series: pd.Series):

max_to_date = np.empty(len(series))
max_to_date[0] = series.iloc[0]

idx_max = np.empty(len(series), dtype='int')
idx_max[0] = 0

T = len(series.index)

HMW = []
control = False

for t in range(1, T):
    current_val = series.iloc[t]
    
    if current_val < max_to_date[t-1]:
        max_to_date[t] = max_to_date[t-1]
        idx_max[t] = idx_max[t-1]
        
        if not control:
            HMW.append(series.iloc[t-1])
            control = True
        
    else:
        max_to_date[t] = current_val
        idx_max[t] = t
        control = False

starting_dates = series[series.isin(HMW)].index.tolist()

rel_loss = (max_to_date - series) / max_to_date
ending_dates = []

for i in range(1, len(rel_loss)):
    if rel_loss[i] == 0 and rel_loss[i-1] > 0:  # Condition for the end of drawdown
        ending_dates.append(series.index[i])
  
return HMW, starting_dates, ending_dates

问题是starting_dates (240) 的长度与ending_dates (234) 的长度不匹配。我希望它们相等,或者最多,starting_dates = 240 和ending_dates = 239。我做错了什么?

HMW 代表高水位线,是价格指数中的点,在该点处指数值大于任何先前的指数值,随后出现亏损。 starting_dates 是存储所有 HMW 日期的列表,ending_dates 是存储再次超越 HMW 的日期的列表。

为了获得同一系列,我正在使用以下代码进行编码:

start_date = "2000-1-1"
end_date = "2022-12-31"

sp_500 = yf.download("SPY", start = start_date, end = end_date)[["Adj Close"]]
sp_500 = sp_500.squeeze()
python list time-series series
1个回答
0
投票
ending_dates = []

for i in range(1, len(rel_loss)):
    if rel_loss[i] == 0 and rel_loss[i-1] > 0:
        ending_dates.append(series.index[i])
    elif rel_loss[i] > 0 and rel_loss[i-1] > 0:
        ending_dates.append(series.index[i])

ending_dates = list(set(ending_dates))
ending_dates.sort()

此代码修复了 rel_loss[i] == 0 以及 rel_loss[i] > 0 和 rel_loss[i-1] > 0 时的情况。

通过使用set,我们可以确保ending_dates包含唯一值,并且sort确保日期按升序排列。

尝试一下此代码,如果不起作用,请告诉我,我会进一步提供帮助。

© www.soinside.com 2019 - 2024. All rights reserved.