根据间隙长度填充间隙

时间:2015-01-02 12:15:13

标签: python numpy pandas time-series

我目前正在玩财务数据,特别是缺少财务数据。我要做的是填补基于间隙长度的空白,例如: - 如果间隙的长度小于5 NaN,则插值 - 如果长度> 5 NaN,然后​​填充来自不同系列的值

所以我在这里要完成的是一个函数,它将扫描NaN的系列,获取它们的长度,然后适当地填充它们。我只是想尽可能多地推动pandas / numpy ops,而不是在循环中等等......

仅举例来说,这根本不是最优的:

ser = pd.Series(np.sort(np.random.uniform(size=100)))
ser[48:52] = None
ser[10:20] = None

def count(a):
    tmp = 0
    for i in range(len(a)):
        current=a[i]
        if not(np.isnan(current)) and tmp>0:
            a[(i-tmp):i]=tmp
            tmp=0
        if np.isnan(current):
            tmp=tmp+1

g = ser.copy()
count(g)
g[g<1]=0

df = pd.DataFrame(ser, columns=['ser'])
df['group'] = g

现在我们想要在间隙为&lt;时进行插值。 10,把东西放在间隙&gt; 9

df['ready'] = df.loc[df.group<10,['ser']].interpolate(method='linear')
df['ready'] = df.loc[df.group>9,['ser']] = 100

总结一下,2个问题: - 熊猫可以做到健壮吗? - 如果没有,你有什么建议让我的方式更强大,更快?让我们在这里只关注2点:首先是这个循环超过系列 - 一旦我有100个系列的间隙,它将需要很长时间。也许像Numba?然后,我在副本上插入任何有关如何在现场进行操作的建议?

感谢您一看

2 个答案:

答案 0 :(得分:1)

您可以利用插值的限制参数。

df['ready'] = df.loc[df.group<10,['ser']].interpolate(method='linear',limit=9)

limit:int,默认为None。 要填充的最大连续NaN数。

然后使用不同的方法再次运行interpolate(),甚至运行fillna()

答案 1 :(得分:0)

经过长时间的寻找答案后,发现没有根据间隙长度自动完成填充的方法。

结论:人们可以利用问题中的代码,这个想法会起作用。