2016-11-23 3 views
4

내 코드의 한 단계 업데이트를 구현할 수 있도록 팬더의 ewm.std 계산을 확인하려고합니다. 다음은 코드 관련 문제에 대한 전체 설명입니다.pandas ewm.std 계산

mrt = pd.Series(np.random.randn(1000)) 
N = 100 
a = 2/(1+N) 
bias = (2-a)/2/(1-a) 
x = mrt.iloc[-2] 
ma = mrt.ewm(span=N).mean().iloc[-3] 
var = mrt.ewm(span=N).var().iloc[-3] 
ans = mrt.ewm(span=N).std().iloc[-2] 
print(np.sqrt(bias*(1-a) * (var + a * (x- ma)**2)), ans) 

(1.1352524643949702, 1.1436193844674576)

I 표준 제제를 사용했다. 왜 두 값이 같지 않아야하는지 누군가가 말해 줄 수 있습니까? 즉 판다가 기하 급수적 인 가중치를 어떻게 계산하고 있는가?

편집 : 줄리안의 답변 이후 - 한 가지 더 사례를 알려 드리겠습니다. 나는 팬더에 의해 계산 된 var의 비율을 계획하고 있고 Cyandon의 pandas ewm-covariance 코드에서 추론 한 공식을 사용하고 있습니다. 이 비율은 1이어야합니다 (누군가가 지적 할 수있는 경우 내 공식에 문제가 있다고 생각합니다).

mrt = pd.Series(np.random.randn(1000)) 

N = 100 
a = 2./(1+N) 
bias = (2-a)/2./(1-a) 
mewma = mrt.ewm(span=N).mean() 

var_pandas = mrt.ewm(span=N).var() 
var_calculated = bias * (1-a) * (var_pandas.shift(1) + a * (mrt-mewma.shift(1))**2) 

(var_calculated/var_pandas).plot() 

플롯에 문제가 명확하게 표시됩니다.

plot of the ratio after the initial values are removed

편집 2 : 시행 착오, 나는 오른쪽 식 파악 :

var_calculated = (1-a) * (var_pandas.shift(1) + bias * a * (mrt-mewma.shift(1))**2) 

을하지만 그것은 바로 하나가 될 것을 확신 아니에요! 누군가가 그것에 빛을 비칠 수 있습니까? ans == np.sqrt(mrt.ewm(span=N).var().iloc[-2]) :

+1

잠재 복제본 [이 퀘스트 에] (http://stackoverflow.com/questions/37924377/does-pandas-calculate-wm-wrong)? –

+0

@JulienMarrec 아니. 나는 그 애와 정확히 일치하는지 확인할 수있다. 나는 ewmstd에서 트럼프를 치고있다. –

+0

ewm은 다음과 같이 정의됩니다. [window.py # L1387] (https://github.com/pandas-dev/pandas/blob/master/pandas/core/window.py#L1387). ewm.std 전화는 [여기] (https://github.com/pandas-dev/pandas/blob/master/pandas/core/window.py#L1555)입니다 .- 그런 다음 _zqrst [여기]로 이동합니다. https://github.com/pandas-dev/pandas/blob/master/pandas/core/window.py#L1761) –

답변

3

귀하의 질문은 실제로 실제로 판다는 위의 예에 따라서 ewm.var()

In [1]: 
(np.sqrt(mrt.ewm(span=span).var()) == mrt.ewm(span=span).std())[1:].value_counts() 

Out[1]: 
True 999 
dtype: int64 

을 계산하는 방법으로 줄일 수 있습니다. 이 (ewmvar을 계산하는 방법

input_x=input_y=mrt


emcov를 호출하여 그것을 수행) 조사하기 위해 우리가 첫번째 요소를 확인하는 경우 :

mrt.ewm(span=span).var()[:2].values 
> array([nan, 0.00555309]) 

을 이제 emcov 루틴을 사용하여, 특정 사례에 적용 :

x0 = mrt.iloc[0] 
x1 = mrt.iloc[1] 
x2 = mrt.iloc[2] 

# mean_x and mean_y are both the same, here we call it y 
# This is the same as mrt.ewm(span=span).mean(), I verified that too 
y0 = x0 
# y1 = mrt.ewm(span=span).mean().iloc[1] 
y1 = ((1-alpha)*y0 + x1)/(1+(1-alpha)) 
#y2 = (((1-alpha)**2+(1-alpha))*y1 + x2)/(1 + (1-alpha) + (1-alpha)**2) 

cov0 = 0 

cov1 = (((1-alpha) * (cov0 + ((y0 - y1)**2))) + 
       (1 * ((x1 - y1)**2)))/(1 + (1-alpha)) 

# new_wt = 1, sum_wt0 = (1-alpha), sum_wt2 = (1-alpha)**2 
sum_wt = 1+(1-alpha) 
sum_wt2 =1+(1-alpha)**2 


numerator = sum_wt * sum_wt # (1+(1-alpha))^2 = 1 + 2(1-alpha) + (1-alpha)^2 
denominator = numerator - sum_wt2 # # 2*(1-alpha) 


print(np.nan,cov1*(numerator/denominator)) 

>(nan, 0.0055530905712123432) 
+0

감사합니다. 줄리앙. 네가 한 일이 잘된 것 같아. 마지막 단계에서 동일한 평등을 얻었는지 확인할 수 있습니까? 질문에서 위의 편집을 참조하십시오. –

+0

예, 확인되었습니다. –

+0

감사합니다. 그래서 제 수식에 약간의 문제가 있습니다. 시행 착오를 통해 나는 올바른 공식이 var_calculated = (1-a) * (var_pandas.shift (1) + bias * a * (mrt-mewma.shift (1)) ** 2)이어야한다는 것을 발견했다. 이것은 정확한 일치를 제공합니다! 하지만 난 왜 모르겠어요 :) 모든 문제를 주셔서 감사합니다. @Julien –

관련 문제