パンダのewm.std計算を検証して、自分のコードに対してワンステップ更新を実装できるようにしようとしています。コードの問題の完全な説明は次のとおりです。パンダ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は、標準的な製剤を使用しています。誰かがなぜ2つの値が同じであってはならないのか教えていただけますか?すなわち、パンダが指数関数的に重み付けされた標準をどのように計算するのか?
編集:ジュリアンの回答後 - もう少しユースケースを教えてください。私はpandasで計算されたvarの割合をプロットしています。また、Cyndorの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()
プロットは問題をはっきりと示しています。
EDIT 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) –