擅长:python、mysql、java
<p>我用的是一个求和结果,加上新成员,减去旧成员。然而,在这种情况下,一个人可能会遭受累积的浮点误差。在</p>
<p>因此,我用一个列表实现了一个“Deque”。每当我的德克重新分配到更小的尺寸。我在同一场合重新计算总数。在</p>
<p>我还计算了x点的平均值,包括x点,所以至少有一个采样点要求平均值。在</p>
<pre><code>def getAvgValues(data, avgSampleTime):
lastTime = 0
prevValsBuf = []
prevValsStart = 0
tot = 0
for t, v in data:
avgStart = t - avgSampleTime
# remove too old values
while prevValsStart < len(prevValsBuf):
pt, pv = prevValsBuf[prevValsStart]
if pt > avgStart:
break
tot -= pv
prevValsStart += 1
# add new item
tot += v
prevValsBuf.append((t, v))
# yield result
numItems = len(prevValsBuf) - prevValsStart
yield (t, tot / numItems)
# clean prevVals if it's time
if prevValsStart * 2 > len(prevValsBuf):
prevValsBuf = prevValsBuf[prevValsStart:]
prevValsStart = 0
# recalculate tot for not accumulating float precision error
tot = sum(v for (t, v) in prevValsBuf)
</code></pre>