12

パンダにマルチインデックス データフレームがあり、インデックスは ID とタイムスタンプにあります。各 ID の時系列ローリング合計を計算できるようにしたいのですが、ループなしでそれを行う方法がわかりません。

content = io.BytesIO("""\
IDs    timestamp     value
0      2010-10-30     1
0      2010-11-30     2
0      2011-11-30     3
1      2000-01-01     300
1      2007-01-01     33
1      2010-01-01     400
2      2000-01-01     11""")
df = pd.read_table(content, header=0, sep='\s+', parse_dates=[1])
df.set_index(['IDs', 'timestamp'], inplace=True)
pd.stats.moments.rolling_sum(df,window=2

そして、この出力は次のとおりです。

                value
IDs timestamp
0   2010-10-30    NaN
    2010-11-30      3
    2011-11-30      5
1   2000-01-01    303
    2007-01-01    333
    2010-01-01    433
2   2000-01-01    411

ID 0 と 1、および ID 1 と 2 がエッジで重複していることに注意してください (これは望ましくないため、計算が台無しになります)。これを回避する方法の 1 つは、ID で groupby を使用し、その groupby をループしてから、rolling_sum を適用することです。

ループを使用せずにこれを行うのに役立つ機能があると確信しています。

4

1 に答える 1

15

最初にグループ化してから、合計をロールします (rolling_sum最上位の名前空間でも使用できます)

In [18]: df.groupby(level='IDs').apply(lambda x: pd.rolling_sum(x,2))
Out[18]: 
                value
IDs timestamp        
0   2010-10-30    NaN
    2010-11-30      3
    2011-11-30      5
1   2000-01-01    NaN
    2007-01-01    333
    2010-01-01    433
2   2000-01-01    NaN
于 2013-10-04T18:30:53.187 に答える