5

ベクトル(マグニチュードと方向)を表す時系列データを使用しています。データをリサンプリングdescribeして、関数をhowパラメーターとして使用したいと思います。

ただし、このdescribe方法では標準の平均を使用するため、方向を平均するために特殊関数を使用したいと思います。describeこのため、次の実装に基づいて独自のメソッドを実装しましたpandas.Series.describe()

def directionAverage(x):
    result = np.arctan2(np.mean(np.sin(x)), np.mean(np.cos(x)))
    if result < 0:
        result += 2*np.pi
    return result

def directionDescribe(x):
    data = [directionAverage(x), x.std(), x.min(), x.quantile(0.25), x.median(), x.quantile(0.75), x.max()]
    names = ['mean', 'std', 'min', '25%', '50%', '75%', 'max']
    return Series(data, index=names)

問題は、私がそうするときです:

df['direction'].resample('10Min', how=directionDescribe)

この例外が発生します(最後の数行が表示されます):

  File "C:\Python26\lib\site-packages\pandas\core\generic.py", line 234, in resample
    return sampler.resample(self)
  File "C:\Python26\lib\site-packages\pandas\tseries\resample.py", line 83, in resample
    rs = self._resample_timestamps(obj)
  File "C:\Python26\lib\site-packages\pandas\tseries\resample.py", line 217, in _resample_timestamps
    result = grouped.aggregate(self._agg_method)
  File "C:\Python26\lib\site-packages\pandas\core\groupby.py", line 1626, in aggregate
    result = self._aggregate_generic(arg, *args, **kwargs)
  File "C:\Python26\lib\site-packages\pandas\core\groupby.py", line 1681, in _aggregate_generic
    return self._aggregate_item_by_item(func, *args, **kwargs)
  File "C:\Python26\lib\site-packages\pandas\core\groupby.py", line 1706, in _aggregate_item_by_item
    result[item] = colg.aggregate(func, *args, **kwargs)
  File "C:\Python26\lib\site-packages\pandas\core\groupby.py", line 1357, in aggregate
    result = self._aggregate_named(func_or_funcs, *args, **kwargs)
  File "C:\Python26\lib\site-packages\pandas\core\groupby.py", line 1441, in _aggregate_named
    raise Exception('Must produce aggregated value')

問題は、自分のdescribe関数をどのように実装して、それが機能するようにするresampleかということです。

4

1 に答える 1

3

groupbyリサンプリングの代わりに、グループが時間の単位である場所を指定できます。このグループには、directionAverage関数など、選択した関数を適用できます。

TimeGrouper関数をインポートして、時間間隔でグループ化できるようにしていることに注意してください。

import pandas as pd
import numpy as np
from pandas.tseries.resample import TimeGrouper

#group  your data
new_data = df['direction'].groupby(TimeGrouper('10min'))
#apply your function to the grouped data
new_data.apply(directionDescribe)
于 2013-02-14T21:33:00.613 に答える