1begin {
2  # INPUT PARAMETERS
3  # They can do 'mlr put -s window_size=4 -s input_field_names=x,y ...'
4  if (is_absent(@window_size)) {
5    @window_size = 3;
6  }
7  # In Miller 6 (Go port) we'll have arrays and you'll be able to do
8  # @input_field_names = ["x", "y"].
9  if (is_absent(@input_field_names)) {
10    @input_field_names = splitnv("x,y", ",")
11  } else {
12    @input_field_names = splitnv(@input_field_names, ",")
13  }
14
15  # INITIALIZATION
16  @output_field_names = {};
17  for (_, name in @input_field_names) {
18    @output_field_names[name] = name . "_avg";
19  }
20  for (_, name in @input_field_names) {
21    for (i = 0; i < @window_size; i+=1) {
22      @windows[name][i] = 0;
23    }
24  }
25  # dump;
26}
27
28# Slide the windows
29for (_, name in @input_field_names) {
30  for (i = 1; i < @window_size; i+=1) {
31    @windows[name][i-1] = @windows[name][i];
32  }
33}
34# Update the windows with new data
35for (_, name in @input_field_names) {
36  @windows[name][@window_size - 1] = $[name];
37}
38
39# Compute the averages
40sums = {};
41for (_, name in @input_field_names) {
42  for (i = 0; i < @window_size; i+=1) {
43    sums[name] += @windows[name][i];
44  }
45}
46denominator = @window_size;
47if (NR < @window_size) {
48    denominator = NR
49}
50for (_, name in @input_field_names) {
51  $[@output_field_names[name]] = sums[name] / denominator;
52}
53