【发布时间】:2010-11-04 15:42:55
【问题描述】:
给定一个表格,其中第一列是某个参考点之后的秒数,第二列是任意测量值:
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 中)来平滑数据。由于数据表很大,因此确实首选基于迭代器的方法。 不幸的是,经过两个小时的编码,我无法找到高效而优雅的解决方案。
谁能帮帮我?
编辑s
我希望每个原始读数都有一个平滑读数,并且平滑读数是原始读数和前 100 (delta) 秒内任何其他读数的算术平均值。 (约翰,你是对的)
巨大的 ~ 1e6 - 10e6 行 + 需要使用紧张的 RAM
数据近似随机游走
数据已排序
分辨率
我已经测试过 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
感谢大家的帮助。
【问题讨论】:
-
是否太大而无法在 numpy 数组中处理?你有几样东西?
-
这是线性插值来查找 100 的倍数的点吗?
-
如果您有平滑要求,请详细说明。我尝试了几次,但我无法解析您的描述:“我需要通过在每次测量前 100 秒内平均读数来平滑数据”。
-
请发布更多关于您的基准的信息。 AFAICT 这种行为(比指数更二次方!)只有在时间值没有上升或很小的正数时才会发生,以至于窗口包括迄今为止的所有或大部分读数。我的基准测试以大约 60% 的 Y 速度与已发布的代码实现线性结果,如果放弃 sum() 以支持对总数和计数的增量调整,我的速度将翻倍至 Y 速度的 120%。注意:答案与 14 sig dec 数字相同。
-
继续:我使用 max(0.1, random.normalvariate(mu=16.0, sigma=7.81)) 生成随机正时间间隔; 0.1 是为了避免任何负面影响,而 16.0000000 :-) 和 7.81 是从您的样本中安装的。最初我得到二次行为,直到我注意到我把最小值而不是最大值!顺便说一句,正如你所说的随机游走,我使用了 new_reading = old_reading + random.random()。
标签: python datetime data-mining smoothing