2016-11-20 6 views
2

私はある種の適用機能を使う必要があると確信していますが、これを実現するためには苦労しています。株価指数と月次リターンのデータフレームがあります。私は3ヵ月先のリターンを計算する必要があります。毎月、すべての株式とその月のリターンを含む行が500行になるように構成されています。私はこのようなことを試してきましたが、うまくいきません。pandas groupbyとshiftを一緒に使う方法

mr['Quarterly_Returns'] = mr.groupby('ticker')['monthly_returns'].apply(mr['monthly_returns']+mr['monthly_returns'].shift(-1)+mr['monthly_returns'].shift(-2)) 

アドバイスはありますか?作品のためだけの列monthly_returnsで、

+0

必要です適用されます(ラムダX: x + x.shift(-1)+ x.shift(-2)) '? – jezrael

+0

私はそうは思わない。それは私に 'monthly_returns'列のkeyerrorを与えるようです。私はそれを調べます。 – user3451026

+0

申し訳ありませんが、私はコメントを編集します。 – jezrael

答えて

0

あなたがlambda x必要とapplyに代わりに列名がxを使用する:あなたはまた、rolling機能を使用して検討するかもしれない

mr['Quarterly_Returns'] = mr.groupby('ticker')['monthly_returns'] 
          .apply(lambda x: x+x.shift(-1)+x.shift(-2)) 
0

mr.groupby('ticker')['monthly_returns'].rolling(3).sum()

より完全な例:あなたは `ミスター[ 'Quarterly_Returns'] = mr.groupby( 'ティッカー')[ 'monthly_returns']

df=pd.concat([pd.DataFrame(index=pd.date_range('1/1/2016','12/31/2016',freq='M'),data={'ticker':x,'return':np.random.rand(12)}) for x in list('ABCD')]) 
df.groupby('ticker')['return'].rolling(3).sum().unstack('ticker') 

ticker A B C D 
2016-01-31 NaN  NaN  NaN  NaN 
2016-02-29 NaN  NaN  NaN  NaN 
2016-03-31 2.062552 1.508062 1.317836 1.051874 
2016-04-30 1.727587 1.856383 1.308263 1.113360 
2016-05-31 1.602858 2.112790 1.533763 1.039221 
2016-06-30 1.716985 2.403718 1.850741 1.726469 
2016-07-31 1.828597 1.809054 1.543079 1.569896 
2016-08-31 2.003484 1.531877 1.376907 1.852235 
2016-09-30 1.854642 1.319289 1.438446 0.946304 
2016-10-31 1.308001 1.718987 1.764252 1.157938 
2016-11-30 0.962660 2.255580 1.489076 0.493370 
2016-12-31 0.949810 1.753511 1.321650 1.377429 
+0

私はそれをテストしますが、それは他のものを返します。 – jezrael

+0

あなたはそれもチェックすることができます - 'mr = pd.DataFrame({'ticker':np.random.choice(['a'、 'b'、 'c'、 'd']、20)、 'monthly_returns' :np.random.choice(1000、20)}) ' – jezrael

+0

多分私は混乱しているかもしれませんが、それはまさに正しいことです - 各ティッカーのローリングサムを計算します。他のソリューションはすべての結果を結合しますが、理由を完全に理解しているかどうかはわかりません。 –

関連する問題