Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Statistics 按秒计数并保持运行平均值的算法_Statistics_Go - Fatal编程技术网

Statistics 按秒计数并保持运行平均值的算法

Statistics 按秒计数并保持运行平均值的算法,statistics,go,Statistics,Go,我想按某些属性对请求进行计数,并按特定时间段(可能按秒)对它们进行汇总,然后计算过去10秒、过去2分钟的平均值/max/min,等等 (对我来说)显而易见的方法是,只需列出一个秒数列表,当我需要移动/运行平均值时,只需在列表中返回适当的时间并计算平均值。除了一些关于存储聚合值以便在较长时间内使用的明显优化之外,我还缺少什么想法?我对Go不太熟悉,因此请原谅以下代码中的任何奇怪之处。向滚动平均值中添加一个元素的时间应为O(1)。它在内存中使用O(n)(固定数量) 输出: $ go run roll

我想按某些属性对请求进行计数,并按特定时间段(可能按秒)对它们进行汇总,然后计算过去10秒、过去2分钟的平均值/max/min,等等


(对我来说)显而易见的方法是,只需列出一个秒数列表,当我需要移动/运行平均值时,只需在列表中返回适当的时间并计算平均值。除了一些关于存储聚合值以便在较长时间内使用的明显优化之外,我还缺少什么想法?

我对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
}