Этот код должен выполнить трюк:
avg = [(sum(y) + sum(y[1:-1]) + sum(y[2:-2])) // 15
for y in zip(data[:-6], data[1:-5], data[2:-4], data[3:-3], data[4:-2], data[5:-1], data[6:])]
Здесь zip(data[:-6], data[1:-5], ...)
создает последовательные 7-кортежи.
И sum(y)
принимает по 7 чисел каждый раз. sum(y[1:-1])
снова берет 5 внутренних чисел. sum(y[2:-2])
принимает 3 внутренних числа в третий раз.
Кстати, добавление 7 до деления на 15 будет ближе к усреднению. В исходной формулировке среднее значение всегда округляется вниз.
Итак, я бы предложил (sum(y) + sum(y[1:-1]) + sum(y[2:-2]) + 7) // 15
Вот тест, основанный на вашем коде и данных случайного блуждания.
from matplotlib import pyplot as plt
import random
def do_averaging_7(data):
return [(sum(y) + sum(y[1:-1]) + sum(y[2:-2]) + 7) // 15
for y in zip(data[:-6], data[1:-5], data[2:-4], data[3:-3], data[4:-2], data[5:-1], data[6:])]
data = [random.randrange(-100,101) for _ in range(100)]
for i in range(1,len(data)):
data[i] += data[i-1]
avg = do_averaging_7(data)
fig, ax = plt.subplots()
ax.plot(range(len(data)), data, "blue")
ax.plot(range(3, 3+len(avg)), avg, color="red")
ax.set_ylabel('Raw')
plt.tight_layout()
plt.show()
Итоговый участок: