Я думаю, что это просто скользящее среднее:
ser = pd.Series([1,2,4]).rolling(window=2,center=False).mean()
Тогда, возможно, некоторая обработка для верхних и нижних значений:
ser_end = pd.Series([np.inf])
output_ser = ser.append(ser_end).fillna(0)
Стоит отметить, что в зависимости от варианта использования это может быть большедопустимо для заполнения пропущенного значения в начале с -infinity