と の 2 つのテーブルがあるA
としB
ます。
テーブルA
には複数レベルのインデックス(a, b)
と 1 つの列 (ts) があります。
b
一義的に ts を決定します。
A = pd.DataFrame(
[('a', 'x', 4),
('a', 'y', 6),
('a', 'z', 5),
('b', 'x', 4),
('b', 'z', 5),
('c', 'y', 6)],
columns=['a', 'b', 'ts']).set_index(['a', 'b'])
AA = A.reset_index()
テーブルB
は、一意でないインデックス ( ) を持つ別の 1 列 (ts) テーブルa
です。ts は各グループの「内部」でソートされます。つまり、B.ix[x]
x ごとにソートされます。さらに、 の値以上の の値が常に存在します。B.ix[x]
A
B = pd.DataFrame(
dict(a=list('aaaaabbcccccc'),
ts=[1, 2, 4, 5, 7, 7, 8, 1, 2, 4, 5, 8, 9])).set_index('a')
これのセマンティクスはB
、インデックスによって示されるタイプのイベントの発生の観察を含むことです。
の各値に対して でB
指定されたタイムスタンプの後に、各イベント タイプが最初に発生したタイムスタンプから見つけたいと思います。つまり、 ts の代わりに table で指定された「ts の後に発生する最小値」を含む同じ形状のテーブルを取得したいと思います。A
b
A
B
だから、私の目標は次のようになります。
C:
('a', 'x') 4
('a', 'y') 7
('a', 'z') 5
('b', 'x') 7
('b', 'z') 7
('c', 'y') 8
動作するコードがいくつかありますが、非常に遅いです。
C = AA.apply(lambda row: (
row[0],
row[1],
B.ix[row[0]].irow(np.searchsorted(B.ts[row[0]], row[2]))), axis=1).set_index(['a', 'b'])
プロファイリングは、犯人が明らかに であることを示していB.ix[row[0]].irow(np.searchsorted(B.ts[row[0]], row[2])))
ます。ただし、マージ/結合を使用する標準的なソリューションは、長期的には RAM を大量に消費します。
今、私は 1000 を持っていると考えa
、a あたりの b の平均数 (おそらく 100-200) が一定であると仮定し、a あたりの観測数がおそらく 300 のオーダーであると考えてくださいa
。秒。
1,000,000 x 200 x 300 = 60,000,000,000
行
特に必要なデータが上記で説明したような C によって完全に記述されていることを考えると、RAM に保持するには少し多すぎるかもしれません。
どうすればパフォーマンスを改善できますか?