如何使用jq计算移动平均线?

时间:2015-02-25 23:25:53

标签: arrays json moving-average jq

假设一个Json数组:

[ 1, 4, 6, 9, 8, 10, 5, 2]

我想计算3天移动平均线。生成的数组是通过平均前3个条目来计算的。

所以前三个条目不关心,第四个是(1+4+6)/3,第五个是(4+6+9)/3,依此类推。

从概念上讲,这就是我要做的事情:

echo '[ 1, 4, 6, ... ]' | jq 'map(average(select(prev 3 array entries)))'

3 个答案:

答案 0 :(得分:1)

这个问题激励我学习jq,谢谢!

我的解决方案是

'. as $val | to_entries | map((.value + $val[.key-1] + $val[.key-2])/3)  | .[2:]'

第一步,将整个数组保存到变量$ val

第二步用数组将数组转换为对象数组(试试吧!,它将你的示例数组转换为

[
  {
    "key": 0,
    "value": 1
  },
  {
    "key": 1,
    "value": 4
  },
  {
    "key": 2,
    "value": 6
  },
  {
    "key": 3,
    "value": 9
  },
  {
    "key": 4,
    "value": 8
  },
  {
    "key": 5,
    "value": 10
  },
  {
    "key": 6,
    "value": 5
  },
  {
    "key": 7,
    "value": 2
  }
]

第三步从每个点获取值并添加前两个步骤的值

最后一步是可选的,它会抛出价值观,而你并不关心"

答案 1 :(得分:1)

这是一个jq过滤器,它使用递归函数来计算每n个元素的移动平均值。

def avg(n):
    if length < n then empty   # base case
    else ( .[0:n] | add/n )    # average of first n elements
       , ( .[1:]  | avg(n) )   # recursive call
    end
;

avg(3)

答案 2 :(得分:0)

您可以使用这样的过滤器:

def rolling_average(size): . as $items |
    [ range(0;length-size)
    | $items[.:.+size]
    | add/size
    ]
    ;
rolling_average(3)

想法是生成指数范围以获得平均值,然后取这些项目的平均值。