2017-07-12 11 views
1

私は次のデータフレームを持っており、この例では2つのピリオドを識別子でグループ化して、最後のロールオーバー累積リターンを取得したいと考えています。私の実際のケースでは、私は長い期間が必要ですが、私の問題は、GROUPBYともっとです:groupbyでのPythonローリング累積リターン

 id  return 
2012  1   0.5 
2012  2   0.2 
2013  1   0.1 
2013  2   0.3 

結果は次のようになります。これは、期間がローリングされていることをインポートは

 id  return  cumreturn 
2012  1   0.5   0.5 
2012  2   0.2   0.2 
2013  1   0.1   0.65 
2013  2   0.3   0.56 

です。私はこれまで、以下の式を有する:はAttributeError:

df["cumreturn"] = df.groupby("id")["return"].fillna(0).pd.rolling_apply(df,5,lambda x: np.prod(1+x)-1) 

はしかし、私は次のエラーを取得する "シリーズのオブジェクトが属性「PD」を持っていません。私はローリング累積リターンを得る方法を知っています。しかし、私はそれをgroupbyとどのように組み合わせるかを理解できません。

答えて

2

のは、これを試してみましょう:

df_out = (df.set_index('id', append=True) 
      .assign(cumreturn=df.groupby('id')['return'].rolling(2,min_periods=1) 
           .apply(lambda x: np.prod(1+x)-1) 
      .swaplevel(0,1)).reset_index(1)) 

出力:

 id return cumreturn 
2012 1  0.5  0.50 
2012 2  0.2  0.20 
2013 1  0.1  0.65 
2013 2  0.3  0.56 
+0

申し訳ありませんが、ミーティング、( - : – piRSquared

+0

@piRSquared ....私はあなたの投稿から学ぶ、私が求めています理由です。ハッピーミーティング! –