Web アプリに SQL のような pandas を使用したかった (データを pSQL に保持するのではなく、pandas DataFrame に保持するだけです。これは、データが 1GB 未満であり、常に変化しているわけではないためです)。列の複数のフィルター (例: 年齢 > x、年齢 < y、収入 > p、収入 < q) に基づいてルックアップを行っている場合、このフィルタリングを高速化する方法はありますか? または、すでに以下で行われていますか。SQL では、年齢と収入のインデックスを宣言して、そのようなクエリを高速化します。もしあれば、これを行うパンダの方法は何だろうと思っています。
2 に答える
このクエリを実行する「パンダの方法」は次のとおりです。
df[(x < df.age) & (df.age < y) & (p < df.income) & (df.income < q)]
pandasはデフォルトですべて(すべての列を含む)にインデックスを付けるため、クエリ対象を事前に明示的に宣言する必要はありません。
(この設定がデータセットにとって意味があるかどうかはわかりません。)
Pandas は実際にはただのラッパーnumpy.ndarray
です。
すべての検索は実際にはndarray
internal を使用して行われます。
df[(df.age > x) & (y < df.age) & (df.income > p) & (df.income < q)]
トリックを行う必要があります。numpy.ndarray
ただし、直接使用するか、マスクされた配列を使用することで、プロセスを高速化できます: http://docs.scipy.org/doc/numpy/reference/maskedarray.html
これらは、新しく生成された配列に新しいメモリを割り当てません。つまり、「フィルター処理された」結果のために新しいメモリを探して割り当てる時間/CPU オーバーヘッドがなく、コピー自体によって引き起こされるメモリ オーバーヘッドがないことを意味します。(実際には、マスクをどこかに保存する必要があるため、これは完全に正しいわけではありませんが、テーブルの値をメモリ内の別の場所にコピーする必要はありません)
ただし、これには代償が伴います。メモリ内の各値がマスクされているかどうかをプロセスがチェックする必要があるため、マスクされた配列の処理には少し時間がかかります。ただし、これが単に「フィルタリング」するためのものであれば、この特定のアクセス オーバーヘッドは目立たないはずです (マスクされた配列を使用して計算を行う場合は非常に重要になります)。
編集:
ディスク上およびメモリ内の永続的かつ最適化されたデータ アクセスのために、そのように最適化された PyTables があります。とはいえ、Pytables や Numpy/Pandas は、そのように使用されるとは考えられていませんでした。