根据间隙长度填充间隙
Filling gaps based on gap length
我目前正在研究财务数据,特别是缺少财务数据。我想做的是根据间隙长度填补空白,例如:
- 如果间隙的长度小于 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
现在我们想要在 gap < 10 时进行插值,并在 gap > 9 的地方放一些东西
df['ready'] = df.loc[df.group<10,['ser']].interpolate(method='linear')
df['ready'] = df.loc[df.group>9,['ser']] = 100
总结一下,2个问题:
- Pandas 可以做到这一点吗?
- 如果没有,您有什么建议可以使我的方法更健壮和更快?让我们在这里只关注 2 点:首先是系列上的循环——一旦我有 100 个有间隙的系列,这将花费很长时间。也许像 Numba 这样的东西?然后,我在副本上插入关于如何就地执行它的任何建议?
感谢观看
您可以利用插值的限制参数。
df['ready'] = df.loc[df.group<10,['ser']].interpolate(method='linear',limit=9)
限制:整数,默认值 None。
要填充的最大连续 NaN 数。
然后 运行 interpolate() 第二次使用不同的方法甚至 运行 fillna()
经过漫长的寻找答案后,发现没有基于间隙长度的自动填充方法。
结论:可以利用问题中的代码,这个想法可行。
我目前正在研究财务数据,特别是缺少财务数据。我想做的是根据间隙长度填补空白,例如: - 如果间隙的长度小于 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
现在我们想要在 gap < 10 时进行插值,并在 gap > 9 的地方放一些东西
df['ready'] = df.loc[df.group<10,['ser']].interpolate(method='linear')
df['ready'] = df.loc[df.group>9,['ser']] = 100
总结一下,2个问题: - Pandas 可以做到这一点吗? - 如果没有,您有什么建议可以使我的方法更健壮和更快?让我们在这里只关注 2 点:首先是系列上的循环——一旦我有 100 个有间隙的系列,这将花费很长时间。也许像 Numba 这样的东西?然后,我在副本上插入关于如何就地执行它的任何建议?
感谢观看
您可以利用插值的限制参数。
df['ready'] = df.loc[df.group<10,['ser']].interpolate(method='linear',limit=9)
限制:整数,默认值 None。 要填充的最大连续 NaN 数。
然后 运行 interpolate() 第二次使用不同的方法甚至 运行 fillna()
经过漫长的寻找答案后,发现没有基于间隙长度的自动填充方法。
结论:可以利用问题中的代码,这个想法可行。