2014-10-14 3 views
1

숫자 가중 평균 기능을 사용하여 일부 데이터를 리샘플링해야하며 작동하지 않습니다. 무게가없는 정상 리샘플링 잘 작동 팬더 배열을 리샘플링하기 위해 가중치로 numpy.average를 사용하십시오.

import numpy as np 
import pandas as pd 
time_vec = [datetime.datetime(2007,1,1,0,0) 
      ,datetime.datetime(2007,1,1,0,1) 
      ,datetime.datetime(2007,1,1,0,5) 
      ,datetime.datetime(2007,1,1,0,8) 
      ,datetime.datetime(2007,1,1,0,10) 
      ] 
df = pd.DataFrame([2,3,1,7,4],index = time_vec) 

( how에 매개 변수가 여기 제안으로 람다 함수를 사용하여 : :! Pandas resampling using numpy percentile? 감사) :

df.resample('5min',how = lambda x: np.average(x[0])) 

내 테스트 케이스입니다

하지만 일부 가중치를 사용하려고하면 항상 TypeError: Axis must be specified when shapes of a and weights differ을 반환합니다.

df.resample('5min',how = lambda x: np.average(x[0],weights = [1,2,3,4,5])) 

나는 무게의 많은 다른 번호로이 시도하지만 나아지지 않았다

for i in xrange(20): 
    try: 
     print range(i) 
     print df.resample('5min',how = lambda x:np.average(x[0],weights = range(i))) 
     print i 
     break 
    except TypeError: 
     print i,'typeError' 

내가 어떤 제안에 대해 기뻐할 것입니다.

답변

1

여기에 대한 대답은 평균적으로 계열의 길이에 따라 lambda의 가중치를 동적으로 만들어야한다는 것입니다. 또한 조작중인 객체의 유형에주의해야합니다.

내가 당신이하려는 생각을 계산하는 데있어 코드는 다음과 같다 :

    :

    df.resample('5min', how=lambda x: np.average(x, weights=1+np.arange(len(x)))) 
    

    당신에게 문제를주고 있었다 라인에 비해 두 가지 차이점이 있습니다

  1. x[0]은 이제 x입니다. lambdax 개체는 pd.Series이므로 x[0]은 시리즈의 첫 번째 값만 제공합니다. np.average(c)c이 스칼라 인 경우 c을 반환하기 때문에 첫 번째 예에서 예외를 발생시키지 않고 작동했습니다 (가중치없이). 그러나 나는 샘플링 된 각 부분 집합이 단지 첫 번째 값을 "평균"으로 반환했기 때문에 실제로는 잘못된 평균을 계산하고 있다고 생각합니다.

  2. 가중치는 다시 샘플링되는 Series의 데이터 길이에 따라 동적으로 생성됩니다. lambdax이 계산되는 각 시간 간격마다 다른 길이의 Series 일 수 있기 때문에이 작업을 수행해야합니다.

나는이 밖으로 적절한 함수 정의와 lambda를 대체하여, 몇 가지 간단한 유형의 디버깅을 통해 생각 했어요 방법 :

def avg(x): 
    print(type(x), x.shape, type(x[0])) 
    return np.average(x, weights=np.arange(1, 1+len(x))) 

df.resample('5Min', how=avg) 

이 나를 x에 무슨 일이 벌어지고 있는지 살펴보기로하자 변하기 쉬운. 희망이 도움이됩니다!

관련 문제