2015-01-02 72 views
1

我目前正在使用財務數據,缺少具體的財務數據。我想要做的是填充基於間隙長度的間隙,例如: - 如果間隙的長度低於5 NaN,則內插 - 如果長度大於5 NaN,則填充不同系列的值根據缺口長度填充缺口

所以我在這裏試圖完成的功能是掃描NaN系列,獲取它們的長度,然後適當地填充它們。我只是想推,就像我可以給大熊貓/ 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 

現在,我們希望內插當間隙< 10,把一些地方的差距> 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?然後,我在副本上插入任何關於如何在原地進行建議的建議?

感謝在看看

回答

0

冗長尋找它原來存在基於間隙長度做fillna的沒有自動化的方式回答之後。

結論:一個人可以利用問題中的代碼,這個想法將起作用。

1

你可以利用插值的極限參數。

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

limit:int,default無。 要填充的連續NaN的最大數量。

然後用不同的方法運行插值()的第二時間或甚至運行fillna()

+0

感謝您使用極限參數進行輸入,但在這種情況下無法提供幫助 - 如果沒有此參數,您建議的參數將以完全相同的方式工作。一般來說,使用限制參數會使所有的間隙填充到指定的長度,而不是我要找的。 – lkbu