假设一个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)))'
答案 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)
想法是生成指数范围以获得平均值,然后取这些项目的平均值。