(半)不規則な期間でDataFrameを再サンプリングする「料理本」の方法はありますか?カスタム期間でリサンプリングする
私は毎日のデータセットを持っており、ときには(科学文献の)デカードという名前のデータセットに再サンプリングしたいと考えています。私はそれのための適切な英語の言葉があると思うが、基本的に3〜10日の部品で1ヶ月を切り刻む3番目の部分は8と11日の間の残りの部分です。
私は自分自身で2つの解決方法を考え出しました。具体的にはこのケースに対応し、より一般的なものは不規則な期間に発生しました。しかし、どちらも本当に良いわけではないので、他の人がこのような状況をどのように扱うかは、私が巧妙である。
import pandas as pd
begin = pd.datetime(2013,1,1)
end = pd.datetime(2013,2,20)
dtrange = pd.date_range(begin, end)
p1 = np.random.rand(len(dtrange)) + 5
p2 = np.random.rand(len(dtrange)) + 10
df = pd.DataFrame({'p1': p1, 'p2': p2}, index=dtrange)
私が思いついた最初のものは、個々ヶ月(YYYYMM)でグループ化して、それを手動でスライスされています
は、いくつかのサンプルデータを作成して開始します。以下のような:
になりdef to_dec1(data, func):
# create the indexes, start of the ~10day period
idx1 = pd.datetime(data.index[0].year, data.index[0].month, 1)
idx2 = idx1 + datetime.timedelta(days=10)
idx3 = idx2 + datetime.timedelta(days=10)
# slice the period and perform function
oneday = datetime.timedelta(days=1)
fir = func(data.ix[:idx2 - oneday].values, axis=0)
sec = func(data.ix[idx2:idx3 - oneday].values, axis=0)
thi = func(data.ix[idx3:].values, axis=0)
return pd.DataFrame([fir,sec,thi], index=[idx1,idx2,idx3], columns=data.columns)
dfmean = df.groupby(lambda x: x.strftime('%Y%m'), group_keys=False).apply(to_dec1, np.mean)
:あなたは常にリターンの「dekads」の完全な月を得る
print dfmean
p1 p2
2013-01-01 5.436778 10.409845
2013-01-11 5.534509 10.482231
2013-01-21 5.449058 10.454777
2013-02-01 5.685700 10.422697
2013-02-11 5.578137 10.532180
2013-02-21 NaN NaN
注、その問題ありませんし、必要に応じて取り外しが簡単。
他の解決策は、DataFrameを切り取り、各セグメントで機能を実行する日付の範囲を指定することによって機能します。あなたが望む期間の面でより柔軟性があります。
def to_dec2(data, dts, func):
chucks = []
for n,start in enumerate(dts[:-1]):
end = dts[n+1] - datetime.timedelta(days=1)
chucks.append(func(data.ix[start:end].values, axis=0))
return pd.DataFrame(chucks, index=dts[:-1], columns=data.columns)
dfmean2 = to_dec2(df, dfmean.index, np.mean)
それを自分自身「を構築する」いくつかの時間を節約するために、日付の範囲として、以前の結果のインデックスを使用してイム注意。
これらのケースを処理するにはどうすればよいでしょうか?おそらくもう少しPandasの組み込みメソッドはありますか?
より一般的なケースでは、[date、num_of_days]のマルチインデックスでグループ化することができます(あなたのルーチンは、あなたが望む場所にこれらのグループを簡単に入れることができます)。どのイベントでもTimeGrouperを使ってこれを行うより効率的な方法があります(でもそれについて考える必要があります)。 – Jeff