2017-05-01 3 views
0

을 계산하는 함수입니다.벡터의 누적 기하 평균 또는 배열 열에 대해 계산할 누적 기하 평균

나는 전체 벡터의 기하 평균을 해결할 수/column..simply 다음을 수행해야합니다 누적 연산이 의미 풀 때

from scipy import stats 
GM=stats.gmean(X) 
print(GM) 

, 단순히 pd.expanding_mean 실행할 수 있습니다 (X)에 누적 평균을 구하십시오.

기하 평균과 동일한 결과를 얻을 수있는 함수가 있습니까?

답변

2

gmean 수식의 벡터화 된 구현을 사용할 수 있습니다. 예를 들어, 여기에

In [159]: x 
Out[159]: array([10, 5, 12, 12, 2, 10]) 

In [160]: x.cumprod()**(1/np.arange(1., len(x)+1)) 
Out[160]: 
array([ 10.  , 7.07106781, 8.43432665, 9.2115587 , 
     6.78691638, 7.23980855]) 

gmean() 및 지능형리스트 사용하여 동일한 결과 : 그것은 x.cumprod()이 범람 할 가능성 경우

In [161]: np.array([gmean(x[:k]) for k in range(1, len(x)+1)]) 
Out[161]: 
array([ 10.  , 7.07106781, 8.43432665, 9.2115587 , 
     6.78691638, 7.23980855]) 

, 당신은 gmean의 로그와 함께 작동 할 수 있습니다; @ DSM의 대답을 참조하십시오. 당신의 시리즈가 아주 작은 경우

3

, 당신은 당신이 이미 사용하고있는 scipy.stats.gmean와 expanding().apply를 사용할 수 있습니다

In [26]: s = pd.Series(range(1,10)) 

In [27]: s.expanding().apply(stats.gmean) 
Out[27]: 
0 1.000000 
1 1.414214 
2 1.817121 
3 2.213364 
4 2.605171 
5 2.993795 
6 3.380015 
7 3.764351 
8 4.147166 
dtype: float64 

그러나 이것은 더 이상 시리즈를 위해 매우 비효율적이 될 것입니다 :

In [30]: %time egm = pd.concat([s]*1000).expanding().apply(stats.gmean) 
CPU times: user 6.5 s, sys: 4 ms, total: 6.5 s 
Wall time: 6.53 s 
우리가 일하는

def expanding_gmean_log(s): 
    return np.exp(np.log(s).cumsum()/(np.arange(len(s))+1)) 

같은

그래서 사용자 정의 기능을 할 수 있습니다, 뭔가 로그 공간에서 s.cumprod() ** (1/(np.arange(len(s))+1))과 같은 것을 우선 사용하면 중간 제품의 오버플로를 방지 할 수 있습니다.

In [52]: %timeit egm = expanding_gmean_log(pd.concat([s]*1000)) 
10 loops, best of 3: 71 ms per loop 

In [53]: np.allclose(expanding_gmean_log(pd.concat([s]*1000)), 
        pd.concat([s]*1000).expanding().apply(stats.gmean)) 
Out[53]: True 
관련 문제