Statistics 按秒计数并保持运行平均值的算法
我想按某些属性对请求进行计数,并按特定时间段(可能按秒)对它们进行汇总,然后计算过去10秒、过去2分钟的平均值/max/min,等等Statistics 按秒计数并保持运行平均值的算法,statistics,go,Statistics,Go,我想按某些属性对请求进行计数,并按特定时间段(可能按秒)对它们进行汇总,然后计算过去10秒、过去2分钟的平均值/max/min,等等 (对我来说)显而易见的方法是,只需列出一个秒数列表,当我需要移动/运行平均值时,只需在列表中返回适当的时间并计算平均值。除了一些关于存储聚合值以便在较长时间内使用的明显优化之外,我还缺少什么想法?我对Go不太熟悉,因此请原谅以下代码中的任何奇怪之处。向滚动平均值中添加一个元素的时间应为O(1)。它在内存中使用O(n)(固定数量) 输出: $ go run roll
(对我来说)显而易见的方法是,只需列出一个秒数列表,当我需要移动/运行平均值时,只需在列表中返回适当的时间并计算平均值。除了一些关于存储聚合值以便在较长时间内使用的明显优化之外,我还缺少什么想法?我对Go不太熟悉,因此请原谅以下代码中的任何奇怪之处。向滚动平均值中添加一个元素的时间应为O(1)。它在内存中使用O(n)(固定数量) 输出:
$ go run roll.go
(1+2+3+4+5 ) / 5 = 3
( 2+3+4+5+9 ) / 5 = 4.6
( 3+4+5+9+3 ) / 5 = 4.8
( 4+5+9+3+0 ) / 5 = 4.2
( 5+9+3+0-9 ) / 5 = 1.6
( 9+3+0-9-8) / 5 = -1
我更喜欢指数移动平均,因为它更简单,不需要在数组中保留值 这是我过去使用的函数
func MovingExpAvg(value, oldValue, fdtime, ftime float64) float64 {
alpha := 1.0 - math.Exp(-fdtime/ftime)
r := alpha * value + (1.0 - alpha) * oldValue
return r
}
和代码示例
是的,我也喜欢!似乎我不能比“ftime”更频繁地添加数据,是吗?(当我每次有一个数据点时只添加“1.0”并指定(非常短的)间隔时,过一会儿值就变成1。我现在在应用程序中尝试了它(每秒添加数据)。另一个goroutine是设置newCount,当数据进入时,我将相关代码和输出放在-,我认为对于我来说,不幸的是,平均值不够准确。例如,在示例运行中,最后10秒的实际平均值为6227,但移动平均值计算为5570。或者我做错了什么?你可以这样做任何时间段。fdtime是时间段。ftime显示它对更改的反应速度。您可以比ftime更频繁地添加数据。在中使用它可以编辑代码并按Run。
func MovingExpAvg(value, oldValue, fdtime, ftime float64) float64 {
alpha := 1.0 - math.Exp(-fdtime/ftime)
r := alpha * value + (1.0 - alpha) * oldValue
return r
}