You can apply
idxmax
(for older versions of pandas before 1.0.0 you need to pass raw=False
). The only caveat is that rolling must return a float (see linked docs), not a Timestamp
. That's why you need to temporaryly reset the index, get the idxmax
values and the corresponding week_date
s and reset the index:
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/zero-jack/data/main/hy_data.csv', index_col='week_date', parse_dates=True)
df = df.reset_index()
df['l6d_highest_date'] = df.groupby('hy_code')['high'].transform(lambda x: x.rolling(6).apply(pd.Series.idxmax))
df.loc[df.l6d_highest_date.notna(), 'l6d_highest_date'] = df.loc[df.loc[df.l6d_highest_date.notna(), 'l6d_highest_date'].values, 'week_date'].values
df = df.set_index('week_date')