長さn(= 300,000)の系列Xを持っています。 (40 =)Wの窓長を用いて、私は実装する必要があります定数付きPythonベクトル化
ミュー(I)= X(I)-X(IW)
S(i)を= IにIW和{K =ここでループを防ぐ方法があるのだろうかと思っていました。 mu(i)が第2の式で一定であるという事実は、ベクトル化において複雑さを引き起こす。私は今のところ、以下のなかった:
x1=x.shift(1)
xw=x.shift(w)
mu= x-xw
dx=(x-x1-mu)**2 # wrong because mu wouldn't be constant for each i
s=pd.rolling_sum(dx,w)
上記のコードは動作します(と働いていた)の設定ループ内ではなく、時間がかかりすぎるので、ベクトル化または他の速度向上方法に関する任意のヘルプは参考になります。私はこれをmathjaxフォーマットでcrossvalidatedに投稿しましたが、ここではうまくいかないようです。
https://stats.stackexchange.com/questions/241050/python-vectorization-with-a-constant
また、単に明確にするために、私はもともと、ただ一つのものをダブルループを使用していませんでした。
for i in np.arange(w, len(X)):
x=X.ix[i-w:i,0] # clip a series of size w
x1=x.shift(1)
mu.ix[i]= x.ix[-1]-x.ix[0]
temp= (x-x1-mu.ix[i])**2 # returns a series of size w but now mu is constant
s.ix[i]= temp.sum()
あなたは、2D ARRで何かができる -
np.einsum
はそうのように、s[i]
を計算するために、ここで使用することができ必要に応じて軸を指定します。パンダの「rolling_sum」がどのように振る舞うかはわかりませんが、2D配列のnumpyだけで方程式のすべての作業を行うことができるようです。 – Evertまだ半分眠っているので間違っているかもしれません。私はあなたが3つの要因の追加として広場を拡大することができると思います。最初のものは畳み込み(二乗)です.np.convolveを使って非常に素早く行うことができます。もう一つはmu ** 2です。これはすでに持っています.3番目のものは乗算されたbu muの上の畳み込みです。 – Jblasco
いずれにしても、配列の乗算/合計でコストのかかるループを避けるための最初のことは、畳み込みによるものです。 – Jblasco