Moving Average for Gnuplot

Moving average implementation with variable number of averages.
n = 100
do for [i=1:n] {
    eval(sprintf("back_n%d=0", i))
}
shift = "("
do for [i=n:2:-1] {
    shift = sprintf("%sback_n%d = back_n%d, ", shift, i, i-1)
}
shift = shift."back_n1 = x)"
sum = "(back_n1"
do for [i=2:n] {
    sum = sprintf("%s+back_n%d", sum, i)
}
sum = sum.")"
samples(x) = \$0 > (n-1) ? n : (\$0+1)
avg_n(x)   = (shift_n(x), @sum/samples(\$0))
shift_n(x) = @shift


plot "test.data" using 1:2 w l notitle, \
     "test.data" using 1:(avg_n($2)) w l lc rgb "red" lw 3 title "avg\\_".n
Source: https://stackoverflow.com/a/42868056/494725