2

MultiIndexインデックスを持つDataFrameがあります。次のように再生成できます。

import pandas as pd
import numpy as np
from numpy.random import randn as randn
from numpy.random import randint as randint
from datetime import datetime
# setup data
obs1 = [ob if ob > 0 else ob *-1 for ob in randn(10)*100]
obs2 = [randint(1000) for i in range(10)]
labels = ['A12', 'B12', 'A12', 'A12', 'A12','B12', 'A12','B12', 'A13', 'B13']
dates = [datetime(2012, 11, i) for i in range(1,11)]
dates[0] = dates[1]
dates[5] = dates[6]
# setup index and dataframe
m_idx = pd.MultiIndex.from_tuples(zip(dates, labels), names=['date', 'label'])
data_dict = {'observation1':obs1, 'observation2':obs2}
df = pd.DataFrame(data_dict, index=m_idx)

出力:

In [17]: df
Out[17]: 
                  observation1  observation2
date       label                            
2012-11-02 A12       79.373668           224
           B12      130.841316           477
2012-11-03 A12       45.312814           835
2012-11-04 A12      163.776946           623
2012-11-05 A12      115.449437           722
2012-11-07 B12       38.537737           842
           A12       84.807516           396
2012-11-08 B12       35.186265           707
2012-11-09 A13       60.171620           336
2012-11-10 B13      123.750614           540

関心のある日付:

dates_of_interest = [datetime(2012,11,1), datetime(2012,11,6)]

次の基準のサブセットを使用してデータフレームを作成することに興味があります。

  • 日付は、関心のある日付の1つに最も近い
  • ラベルの文字列に「A」が含まれている

したがって、私のサブインデックスの結果は次のようになります。

                  observation1  observation2
date       label                            
2012-11-02 A12       79.373668           224
2012-11-07 A12       84.807516           396

理想的には、基準の「近く」にあるすべての観測値のデータを取得できるため、返されるデータセットは次のようになります。

                  observation1  observation2
date       label                            
2012-11-02 A12       79.373668           224
2012-11-05 A12      115.449437           722
2012-11-07 A12       84.807516           396

しかし、最初は、最初の結果が得られれば幸いです。searchsortとasofを使用する必要があると思いますが、その方法がよくわかりません。マルチインデックス。

ここからそこに行く方法を知っている人はいますか?

よろしく

4

1 に答える 1

2

を使用Series.asofするのは自然な方法ですが、いくつかの欠点があります。

  • 最新のタイムスタンプを検索する近いタイムスタンプを探しています。あなたの例では、(のどのエントリよりも前に)を検索すると、が得られます。asofdatetime(2012, 11, 1)dfNaN
  • 時系列にのみ適用されるため、適用reset_indexしてからDataFrame 時系列として任意の列を選択する必要があります。言い換えれば、コードが少しぎこちなく複雑になります。

最初のタスクに対処するより堅牢な代替手段を次に示します。これにより、タイムスタンプ インデックスを使用しておおよそのヒットを検索しますnumpy.searchsorted

import numpy as np

# it is important that df is sorted by date
df.sort_index(inplace=True)

dates_ix = df.index.levels[0]
nearest_date = lambda date: dates_ix[np.searchsorted(dates_ix, date)]
approx_dates = map(nearest_date, dates_of_interest)
# select the desired entries in the index
df.select(lambda (date, label): (date in approx_dates and 
                                 label.find('A')!=-1))
于 2013-03-24T13:16:04.943 に答える