4

約 200K サンプルのビッグ データ セットがあります。各サンプルには、さまざまな約 100K の可能な機能からの一連の機能 (約 10) と、それを使用したいくつかの float 型の測定値があります。

たとえば、特定のデータセットに対して

Features                  trial             observations
{1, 40020, 8222}          4                 2
{1, 40020, 22, 16000}     14                8
{1, 20, 22, 1000}         1                 0
{42, 22, 16000}           2                 1

したがって、次のような関数 f が必要です。

f(data, {1, 40020})=

Features                  trial             observations
{1, 40020}                18                10
{1}                       1                 0
{}                        2                 1

f(data, {22, 40020})=

Features                  trial             observations
{40020}                   4                 2
{40020, 22}               14                8
{22}                      3                 1

そのため、関数 f は、特徴列を特定のセットと交差させ、集計された列を合計することによって、データをグループ化します。

2 番目の引数として、多くの異なる機能セットを持つ同じデータセットに対して "f" を呼び出す必要があると考えてください。そのため、各呼び出しを高速化するために 1 回実行できる前処理はおそらく有益です。

私が見つけた最速の方法は

pandas.DataFrame([sample.data for sample in samples], index = [sample.features for sample in samples]).groupby(lambda x: x & test_features, sort = False).sum()

しかし、パフォーマンスは十分ではありませんでした。これは、groupby の関数を使用しているためだと推測しています。これを最適化する方法はありますか?

4

1 に答える 1

1

frozensetの代わりにset、ハッシュ可能であるため、グループ化データの準備を試みることができますfrozenset

最初にFeatures列を a から asetに変換しfrozensetます。

df['Features'] = df['Features'].apply(frozenset)

次に、これにより、データをグループ化するために必要な交差点が得られます。

df['Features'] & frozenset({1, 40020})
Out[64]: 
0    (1, 40020)
1    (1, 40020)
2           (1)
3            ()

最終的に、データフレームの結果が得られます。

df.groupby(df['Features'] & frozenset({1, 40020}), sort=False).sum()
Out[65]: 
            trial  observations
Features                       
(1, 40020)     18            10
(1)             1             0
()              2             1
于 2013-10-13T21:40:03.210 に答える