現在CSV
、スクリプトを実行するたびに、かなり大きなデータフレームをインポートしています。そのデータフレームを実行間で常に利用できるようにするための良い解決策はありますか?
13 に答える
すでにいくつかの回答がありますが、Pandas DataFrames をシリアル化するいくつかの方法を試した素晴らしい比較を見つけました: Efficiently Store Pandas DataFrames。
彼らは比較します:
- pickle: オリジナルの ASCII データ形式
- cPickle、C ライブラリ
- pickle-p2: 新しいバイナリ形式を使用
- json: standardlib json ライブラリ
- json-no-index: json に似ていますが、インデックスはありません
- msgpack: バイナリ JSON 代替
- CSV
- hdfstore: HDF5 ストレージ形式
彼らの実験では、1,000,000 行の DataFrame をシリアル化し、2 つの列 (1 つはテキスト データ、もう 1 つは数字) を別々にテストしました。彼らの免責事項は次のように述べています。
以下がデータに一般化されるとは信じないでください。自分のデータを見て、自分でベンチマークを実行する必要があります
彼らが参照しているテストのソースコードは、オンラインで入手できます。このコードは直接動作しなかったため、いくつかの小さな変更を加えました。こちらから取得できます: serialize.py 次の結果が得られました。
彼らはまた、テキスト データをカテゴリデータに変換すると、シリアル化がはるかに高速になると述べています。彼らのテストでは、約 10 倍高速です (テスト コードも参照してください)。
編集:CSVよりもピクルの時間が長いのは、使用されているデータ形式によって説明できます。デフォルトでpickle
は、より大きなデータセットを生成する印刷可能な ASCII 表現を使用します。ただし、グラフからわかるように、新しいバイナリ データ形式 (バージョン 2 pickle-p2
) を使用する pickle は、読み込み時間が大幅に短縮されています。
その他の参照:
- CSVファイルを読み取るための最速のPythonライブラリの質問には、 csvファイルを読み取るためのさまざまなライブラリをベンチマークと比較する非常に詳細な回答があります。その結果、csv ファイルの読み取り
numpy.fromfile
が最も高速です。 - 別のシリアル化テスト では、 msgpack、ujson、および cPickle がシリアル化で最も高速であることが示されています。
私の理解が正しければ、あなたはすでに を使用してpandas.read_csv()
いますが、スクリプトを編集するたびにファイルをロードする必要がないように、開発プロセスをスピードアップしたいと考えていますか? いくつかの推奨事項があります。
pandas.read_csv(..., nrows=1000)
開発中に、テーブルの最上位ビットのみをロードすることを使用して、CSV ファイルの一部のみをロードできます。スクリプトを編集してリロードするときに pandas テーブルをメモリに保持するように、インタラクティブなセッションにipythonを使用します。
csv をHDF5 テーブルに変換します
更新された使用
DataFrame.to_feather()
と、超高速なpd.read_feather()
R 互換のフェザーpandas.to_pickle()
バイナリ形式でデータを格納する (私の手では、数値データよりもわずかに高速で、文字列データよりもはるかに高速です)。
また、stackoverflowのこの回答にも興味があるかもしれません。
ピクルスが効く!
import pandas as pd
df.to_pickle('123.pkl') #to save the dataframe, df to 123.pkl
df1 = pd.read_pickle('123.pkl') #to load 123.pkl back to the dataframe df
既に述べたように、データ フレームを格納するためのさまざまなオプションとファイル形式 ( HDF5、JSON、CSV、parquet、SQL ) があります。ただし、pickle
次の理由により、(セットアップによっては)一流の市民ではありません。
pickle
潜在的なセキュリティ リスクです。pickleのPython ドキュメントを作成します。
警告モジュールは、
pickle
誤ったデータや悪意を持って作成されたデータに対して安全ではありません。信頼できない、または認証されていないソースから受け取ったデータを unpickle しないでください。
セットアップ/使用状況によっては、両方の制限が適用されませんが、pickle
pandas データ フレームのデフォルトの永続化としてはお勧めしません。
Numpy ファイル形式は、数値データに対して非常に高速です
numpy ファイルは高速で使いやすいため、私は numpy ファイルを使用することを好みます。これは、100 万ポイントの 1 列のデータフレームを保存およびロードするための簡単なベンチマークです。
import numpy as np
import pandas as pd
num_dict = {'voltage': np.random.rand(1000000)}
num_df = pd.DataFrame(num_dict)
ipythonの%%timeit
魔法の関数を使って
%%timeit
with open('num.npy', 'wb') as np_file:
np.save(np_file, num_df)
出力は
100 loops, best of 3: 5.97 ms per loop
データをデータフレームにロードする
%%timeit
with open('num.npy', 'rb') as np_file:
data = np.load(np_file)
data_df = pd.DataFrame(data)
出力は
100 loops, best of 3: 5.12 ms per loop
悪くない!
短所
Python 2 を使用して numpy ファイルを保存してから、Python 3 を使用して開こうとすると (またはその逆)、問題が発生します。