Вы должны быть в состоянии рассчитать совокупный максимум, используя что-то вроде df.groupby('year').close.transform('cummax')
, при условии, что у вас есть столбец year
.Это создает серию такой же длины, что и другие столбцы в кадре данных, поэтому вы можете легко разделить цену закрытия на нее.
В случае, если у вас есть только дата в виде строки и цена закрытия в столбце с именемclose
, вы можете сделать:
df\
.assign(year = lambda x: pd.to_datetime(x.date).dt.year)\
.assign(close_cummax = lambda x: x.groupby('year').close.transform('cummax'))\
.assign(mdd = lambda x: x.close/x.close_cummax)
Я использую цепочечные методы, описанные выше, но если вам не нравится ваш код, усеянный лямбда-функциями, вы можете иметь отдельные операторы для каждого изменения:
df['year'] = pd.to_datetime(df.date).dt.year
df['mdd'] = df.close / df.groupby('year').close.transform('cummax')