、私は新しい列を作成しようとしています。このはパンダの列をシフトし、次の3つの値の平均を取る(post_shift)私はデータフレームを持って
Open High Low Close Volume
Date
2007-03-22 2.65 2.95 2.64 2.86 176389
2007-03-23 2.87 2.87 2.78 2.78 63316
2007-03-26 2.83 2.83 2.51 2.52 54051
2007-03-27 2.61 3.29 2.60 3.28 589443
2007-03-28 3.65 4.10 3.60 3.80 1114659
2007-03-29 3.91 3.91 3.33 3.57 360501
2007-03-30 3.70 3.88 3.66 3.71 185787
のように見える最初にそのdf
Open列を3行シフトし(df.Open.shift(-3))、それ自身と次の2つの値の平均値をとります。
は、したがって、たとえば上記のデータフレームのOpen
列は-3行をシフトし、このようなものになり、次のようになります。私は、その後の繰り返しを介して次の3つの値(自身を含む)の前方平均を取りたい
Date
2007-03-22 2.610
2007-03-23 3.650
2007-03-26 3.910
2007-03-27 3.700
2007-03-28 3.710
2007-03-29 3.710
2007-03-30 3.500
を。 したがって、最初の反復は、次の値である2.610(最初の値)+ 3.650 + 3.910を3で割ったものになります。 次に、次の値3.650(最初の値)を取ります。値の列を作成する。
は、最初に私はのような何か試してみました:
df['Avg'] =df.Open.shift(-3).iloc[0:3].mean()
をしかし、これはOpen.shift
のすべての値を反復処理しないこの次のループは動作するようですが、非常に遅いです、そして私がいましたパンダのforループを使うのは悪い習慣だと言った。
for i in range(0, len(df.Open)):
df['Avg'][i] =df.Open.shift(-3).iloc[i:i+4].mean()
私は
df.Open.shift(-3).apply(loc[0:4].mean())
df.Open.shift(-3).apply(lambda x: x[0:4].mean())
を適用し使用する方法の思考しようとしたが、これらは私がエレガントな方法を考えることはできませんようになど
TypeError: 'float' object is not subscriptable
などのエラーを与えているようですこれは
ありがとうございます。
ああでそれをラップすることができます。はいわかりました。最初はちょっと混乱しましたが、うまくいっているようです(私はそれを試してみた後に)最高の答えを与える前に何か別の答えがあるのを待ってみるつもりです。ありがとうございました。 – Moondra
@moondra今は飛行機に乗っています。しかし、これは完璧なパンダの答えです。 – piRSquared
構文的には、代わりにローリング方式を使うのが好きです。 df.open.rolling(3、min_periods = 1).mean()。shift(-2) – piRSquared