3

私はDataFrame財務データを持っています:

              open    high     low   close     volume
date                                                 
2012-02-13  0.3476  0.3592  0.3449  0.3530  105990679
2012-02-14  0.3470  0.3528  0.3409  0.3429  131799968
2012-02-15  0.3453  0.3513  0.3365  0.3393  119421442
2012-02-16  0.3358  0.3438  0.3271  0.3438  123189697
2012-02-17  0.3488  0.3588  0.3464  0.3546  167932148
2012-02-20  0.3590  0.3682  0.3577  0.3634  127657258
2012-02-21  0.3630  0.3675  0.3524  0.3575  137016196

私は現在、次のようにグループ化しています。

agg = {'open': lambda s: s[0],
       'high': lambda s: s.max(),
       'low': lambda s: s.min(),
       'close': lambda s: s[-1],
       'volume': lambda s: s.sum()}

終えた

df.groupby(lambda d: d.isocalendar()[:2]).agg(agg)

これは、私のデータがのタプルによってインデックス付けされているという事実を除いて、うまく機能します(year, week)。グループの最も早いメンバーの日付でデータが索引付けされることを望みます。私の現在のハックは次のようなものです。

agg['date'] = lambda s: s[0]
df2 = df.copy()
df2['date'] = df2.index
df2.groupby(lambda d: d.isocalendar()[:2]).agg(agg).set_index('date')

これはうまくいくようですが、グループキーが自動的にフレームインデックスにならないように、グループ化とインデックス作成を分離する手段があるかどうか疑問に思っています。

4

1 に答える 1

2

私が知る限り、あなたが探している分離は存在しませんが...インデックスがソートされていると仮定すると(これはハックでも必要です)、 groupby 関数を少し変更すると、必要なものが得られます。

In [194]: cache = {}

In [195]: df.groupby(lambda d: cache.setdefault(d.isocalendar()[:2], d)).agg(agg)
Out[195]:
             close    high     low    open     volume
2012-02-13  0.3546  0.3592  0.3271  0.3476  648333934
2012-02-20  0.3575  0.3682  0.3524  0.3590  264673454
于 2012-08-14T10:19:09.680 に答える