gpt4 book ai didi

python - 平滑不规则采样的时间数据

转载 作者:太空狗 更新时间:2023-10-30 00:15:40 24 4
gpt4 key购买 nike

给定一个表,其中第一列是经过某个引用点的秒数,第二列是任意测量值:

6   0.738158581
21 0.801697222
39 1.797224596
49 2.77920469
54 2.839757536
79 3.832232283
91 4.676794376
97 5.18244704
100 5.521878863
118 6.316630137
131 6.778507504
147 7.020395216
157 7.331607129
176 7.637492223
202 7.848079136
223 7.989456499
251 8.76853608
278 9.092367123
...

如您所见,测量值是在不规则的时间点采样的。我需要通过在每次测量前将读数平均长达 100 秒来平滑数据(在 Python 中)。由于数据表很大,因此确实首选基于迭代器的方法。不幸的是,经过两个小时的编码,我无法找出高效而优雅的解决方案。

谁能帮帮我?

编辑

  1. 我希望每个原始读数都有一个平滑读数,平滑读数是原始读数和前 100(增量)秒内任何其他读数的算术平均值。 (约翰,你是对的)

  2. 巨大的 ~ 1e6 - 10e6 行 + 需要使用紧凑的 RAM

  3. 数据近似随机游走

  4. 数据排序

决议

我已经测试了 J Machin 和 yairchu 提出的解决方案。他们都给出了相同的结果,但是,在我的数据集上,J Machin 的版本以指数方式执行,而 yairchu 的版本是线性的。以下是 IPython 的 %timeit 测量的执行时间(以微秒为单位):

data size   J Machin    yairchu
10 90.2 55.6
50 930 258
100 3080 514
500 64700 2660
1000 253000 5390
2000 952000 11500

谢谢大家的帮助。

最佳答案

我正在使用一个总和结果,我向其中添加新成员并减去旧成员。然而,以这种方式,人们可能会遭受累积的浮点不准确。

因此我实现了一个带有列表的“双端队列”。每当我的双端队列重新分配到更小的尺寸时。我在同一场合重新计算总和。

我还计算了 x 点(包括 x 点)的平均值,因此至少有一个样本点需要平均。

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)

关于python - 平滑不规则采样的时间数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1023719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com