我有一个非常大的连续值数据集,包含不同大小和频率的间隙。
系列中每个数字之间的差异保持不变,但在间隔中断后,系列不一定从原始系列中的某个点开始。
一个非常简单的例子是:1,3,5,7,14,16,18,20(以及我一直用来测试的东西)。
我实际使用的数据样本:1996.40197023, 1996.40199193, 1996.40201362, 1996.40203531, 1996.40240752, 1996.40242921, 1996.40245091, 1996.40247257, 1996.40249426, 1996.40251592。
到目前为止,这是我尝试实现此目的的方式:
date = [1, 3, 5, 7, 9, 14, 16, 18, 20]
ndate = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
diff = 2
for i in range(9):
for j in range(15):
if date[i+1]-date[i] > diff:
ndate[j+1] == date[i+1] + diff
elif ndate[j+1] - date[i+1] > diff:
ndate[j]+diff == ndate[j+1]
else:
ndate[j] == date[i+1]
print ndate
但我不断收到“列表索引超出范围”类型错误。
这是解决这个问题的正确方法还是有更好的方法(考虑到我有超过84,000个数据点可以解决)?
谢谢
答案 0 :(得分:0)
假设您想要生成输出,使得间隙值保持一致或多或少,我会在这里采用基于发电机的方法。
从原始系列中一次一个地生成元素,如果与下一个元素的间隙大于预期的增量,则动态生成填充值,直到您赶上它:
def smooth(series, delta=2, tol=0.001):
it = iter(series)
last = next(it)
yield last
for i in it:
while abs(i - (last + delta)) > tol:
last += delta
yield last
last = i
yield last
例子:
list(smooth([1, 3, 5, 7, 9, 14, 16, 18, 20]))
# [1, 3, 5, 7, 9, 11, 13, 14, 16, 18, 20]
s = [1996.40197023, 1996.40199193, 1996.40201362, 1996.40203531,
1996.40240752, 1996.40242921, 1996.40245091, 1996.40247257,
1996.40249426, 1996.40251592]
list(smooth(s, delta=s[1]-s[0], tol=1e-7))
# [1996.40197023, 1996.40199193, 1996.40201362, 1996.40203531, 1996.40205701, 1996.4020787099998, 1996.4021004099998, 1996.4021221099997, 1996.4021438099996, 1996.4021655099996, 1996.4021872099995, 1996.4022089099994, 1996.4022306099994, 1996.4022523099993, 1996.4022740099992, 1996.4022957099992, 1996.4023174099991, 1996.402339109999, 1996.402360809999, 1996.402382509999, 1996.4024042099988, 1996.40240752, 1996.40242921, 1996.40245091, 1996.40247257, 1996.40249426, 1996.40251592]
这需要手动指定delta和容差,但你可能会编写函数来嗅出它们。