내 코드의 한 단계 업데이트를 구현할 수 있도록 팬더의 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()
플롯에 문제가 명확하게 표시됩니다.
편집 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])
:
잠재 복제본 [이 퀘스트 에] (http://stackoverflow.com/questions/37924377/does-pandas-calculate-wm-wrong)? –
@JulienMarrec 아니. 나는 그 애와 정확히 일치하는지 확인할 수있다. 나는 ewmstd에서 트럼프를 치고있다. –
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) –