【问题标题】:Filling gaps based on gap length根据间隙长度填充间隙
【发布时间】:2015-02-28 18:42:09
【问题描述】:

我目前正在处理财务数据,特别是缺少财务数据。我要做的是根据间隙长度填补空白,例如: - 如果间隙的长度低于 5 NaN,则进行插值 - 如果长度> 5 NaN,则填充不同系列的值

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

以下只是示例,这根本不是最佳的:

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

现在我们要在 gap 9 的地方放置一些东西

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

总结,2个问题: - Pandas 能以稳健的方式做到这一点吗? - 如果没有,你有什么建议可以让我的方式更健壮和更快?让我们在这里只关注两点:首先是这个循环系列 - 一旦我有 100 个有间隙的系列,这将需要很长时间。也许像 Numba 这样的东西?然后,我在副本上插入有关如何就地执行的任何建议?

感谢观看

【问题讨论】:

    标签: python numpy pandas time-series


    【解决方案1】:

    经过漫长的寻找答案,事实证明没有基于间隙长度的自动填充方法。

    结论:可以利用问题中的代码,这个想法是可行的。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 感谢您输入限制参数,但在这种情况下它没有帮助 - 您建议的行在没有它的情况下会以完全相同的方式工作。通常使用 limit 参数会使所有间隙都填充到指定长度,而不是我想要的。