2015-01-02 6 views
1

현재 재무 데이터가 누락되었습니다. 재무 데이터가 누락되었습니다. 내가 뭘 하려는지 간격 길이를 기준으로 간격을 채우는 것입니다 : - 간격의 길이가 5 NaN보다 작은 경우, 다음을 삽입합니다. - 길이가> 5 NaN 인 경우 다른 계열의 값으로 채우기간격 길이를 기준으로 채우는 간격

그래서 여기에서 달성하려는 것은 NaN 시리즈를 스캔하여 길이를 얻은 다음 적절하게 채울 수있는 함수입니다.

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 

이제 우리가 원하는 : 난 그냥 단지 예를 아래

, 이것은 전혀 최적이 아닌 ... 나는/NumPy와 작전을 판다하지 등 루프에 그것을 할 수있는만큼 밀어 원 차이가 < 10 때 보간하고,이 질문에 격차가> 9

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

요약하면 뭔가 넣어 : 은 - 팬더가 강력한 방법 할 수 있습니까? - 그렇지 않다면 더 강력하고 신속하게 내 길을 제안 할 수 있습니까? 여기서 2 포인트에 집중할 수 있습니다 : 처음에는 시리즈 이상의 루프가 있습니다 - 예를 들어, 갭이있는 100 시리즈가되면 나이가들 것입니다. Numba 같은 뭔가? 그런 다음, 어떻게 삽입 할 것인지에 대한 제안을 복사합니다. 당신은 보간의 한계 매개 변수를 활용할 수있는 모습

답변

0

을 다른 방법으로) (두 번째 보간을 실행하거나 실행합니다.

결론 : 질문의 코드를 활용하면 아이디어가 효과적입니다.

1

을 가진위한

감사합니다.

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

limit : int, default 없음. 연속되는 최대 NaN 수입니다.

그런 다음이 갭 길이를 기준으로 fillna을하는 자동화 된 방법이 없습니다 밝혀 답변에 대한 긴 모양 후에 fillna()

+0

한계 매개 변수를 입력 해 주셔서 감사합니다.하지만 제안한이 사례 라인에서 도움이되지 않는 경우 제안하지 않으면 정확히 같은 방식으로 작동합니다. 그리고 일반적으로 한계 매개 변수를 사용하면 모든 간격이 지정된 길이로 채워지는 것이고 내가 찾던 것이 아닙니다. – lkbu