特定の時間にはアクティビティがあり、他の時間にはアクティビティがまったくない、非常にまばらな多次元時系列があります。Pandas のデータを と で表していSparseDataframe
ますMultiIndex
。ワークフローは、ゼロ以外の小さなデータ セットに対して計算を実行し、その結果を大きなスパース データフレームに入れることです。後で、そのまばらなデータフレームで計算を行います (つまり、ゼロ アクティビティ領域を含め、時間の経過に伴うアクティビティの変化を追跡します)。
問題は、小さなデータセットをスパースデータフレームに入れることです。以下は、私が最終的に使用するものよりもはるかに小さいデータセットです。
通常のインデックスでは問題ありません。
import pandas as pd
full_index = arange(10000000) #10 million
sparse_data = full_index[:20000]
sparse_df = pd.SparseDataFrame(index=full_index)
data_df = pd.DataFrame(index=sparse_data,columns=['Data'], data=1) #Calculations would go here.
%time sparse_df.join(data_df)
CPU times: user 888 ms, sys: 225 ms, total: 1.11 s
Wall time: 1.56 s
を使用するMultiIndex
と、はるかに遅くなります。
full_index = pd.MultiIndex.from_product([arange(2),
arange(5),
arange(1000000)]) #Still 10 million
sparse_data = full_index[:20000]
sparse_df = pd.SparseDataFrame(index=full_index)
data_df = pd.DataFrame(index=sparse_data,columns=['Data'], data=1)
%time sparse_df.join(data_df)
CPU times: user 13.8 s, sys: 1.82 s, total: 15.6 s
Wall time: 16.6 s #10x slower!
問題は使用にあるのではないかと思ったjoin
ので、別のルートを試しました。高速でしたが、問題は解決しませんでした。
#regular Index
%time sparse_df['Data'] = data_df.reindex(full_index).to_sparse()['Data'] #The reindexing is the slow part
CPU times: user 318 ms, sys: 129 ms, total: 448 ms
Wall time: 448 ms
#MultiIndex
%time sparse_df['Data'] = data_df.reindex(full_index).to_sparse()['Data'] #The reindexing is the slow part
CPU times: user 9.33 s, sys: 1.02 s, total: 10.3 s
Wall time: 10.4 s #20x slower!
reindex
の代わりに使用する方が確かに高速ですjoin
が、現在MultiIndex
はさらに低速です。
私のオプションは何ですか?で通常のインデックスの速度を達成する方法はありMultiIndex
ますか? のような通常のインデックス関数を作成するエレガントな方法はありMultiIndex
ますか? これをすべて行う方法を再考する必要がありますか?