Что вы можете сделать, это определить переменную, называемую кумулятивной задержкой.Например, пусть window size = n и lag_rate 2, исходный столбец будет иметь нулевую задержку, первый столбец будет иметь задержку 2 относительно исходного столбца, второй будет иметь задержку 4 относительно первого столбца, иn-й столбец будет иметь задержку 2 * n относительно первого столбца
Немного изменив ваш код для удобства чтения:
#set up the variables
a=np.random.rand(30)
df = pd.DataFrame()
df['original'] = a
window_size = 3
lag_by_rate = 2
Теперь я начну перебирать параметр window_size для генерации новых столбцов,Обратите внимание, что цикл for следует начинать с 1, а не с нуля, потому что, если вы начнете его с нуля, вы по сути дублируете исходный столбец кадра данных
for i in range(1, window_size):
cum_lag = i * lag_by_rate
col_name = 'lag_by_'+str(cum_lag)
df[col_name] = df.original.shift(-cum_lag)
Наконец, я использую функцию dropna и печатаю голову:
df.dropna(axis=0, inplace=True)
print(df.head())
Пример моего вывода:
original lag_by_2 lag_by_4
0 0.595142 0.625494 0.812595
1 0.822615 0.582148 0.778157
2 0.625494 0.812595 0.693790
3 0.582148 0.778157 0.416109
4 0.812595 0.693790 0.748151
Для чего бы вы ни стоили, при таком подходе вы потеряете данные со значительной скоростью.Если отношение len (df) / window_size == lag_rate, вы получите нулевые строки в кадре данных после удаления значений N / A
В дополнение к вашему комментарию ниже, я подставил значения, которые выупоминается в вашем примере, и я получаю такой же вывод:
original lag_by_2 lag_by_4
0 5 4.0 8.0
1 6 3.0 9.0
2 4 8.0 10.0