8

私は最近Pytablesに出くわし、それがとてもクールだと感じました。非常に大きなデータセットの場合、csv形式よりも優れていることは明らかです。Pythonを使用していくつかのシミュレーションを実行しています。出力はそれほど大きくありません。たとえば、200列と2000行です。

誰かが両方の経験がある場合、それほど大きくないそのようなデータセットに対して、長期的にはどちらの形式がより便利であるかを提案できますか。Pytablesにはデータ操作機能とVitablesを使用したデータの参照機能がありますが、ブラウザーには、CSVに使用できるExcelなどの機能はあまりありません。同様に、主にPythonで作業している場合、データのインポートとエクスポートにどちらかが優れていると思いますか?ファイル編成の点でもう1つ便利ですか?このような問題についてのコメントは役に立ちます。

ありがとう。

4

6 に答える 6

6

Numpyアレイを検討しましたか?

PyTablesは、データが大きすぎてメモリに収まらない場合に最適ですが、8バイトのfloatの200x2000マトリックスには、約3MBのメモリしか必要ありません。ですから、PyTablesはやり過ぎかもしれないと思います。

numpy配列は、np.savetxtまたは(圧縮用)を使用してファイルに保存でき、またはを使用np.savezしてファイルから読み取ることができます。np.loadtxtnp.load

ディスクに格納するそのような配列が多数ある場合は、numpy.npzファイルの代わりにデータベースを使用することをお勧めします。ちなみに、データベースに200x2000の行列を格納するには、行、列、値の3つのテーブル列のみが必要です。

import sqlite3
import numpy as np

db = sqlite3.connect(':memory:')
cursor = db.cursor()
cursor.execute('''CREATE TABLE foo
                  (row INTEGER,
                   col INTEGER,
                   value FLOAT,
                   PRIMARY KEY (row,col))''')
ROWS=4
COLUMNS=6
matrix = np.random.random((ROWS,COLUMNS))
print(matrix)
# [[ 0.87050721  0.22395398  0.19473001  0.14597821  0.02363803  0.20299432]
#  [ 0.11744885  0.61332597  0.19860043  0.91995295  0.84857095  0.53863863]
#  [ 0.80123759  0.52689885  0.05861043  0.71784406  0.20222138  0.63094807]
#  [ 0.01309897  0.45391578  0.04950273  0.93040381  0.41150517  0.66263562]]

# Store matrix in table foo
cursor.executemany('INSERT INTO foo(row, col, value) VALUES (?,?,?) ',
                   ((r,c,value) for r,row in enumerate(matrix) 
                                for c,value in enumerate(row)))

# Retrieve matrix from table foo
cursor.execute('SELECT value FROM foo ORDER BY row,col')
data=zip(*cursor.fetchall())[0]
matrix2 = np.fromiter(data,dtype=np.float).reshape((ROWS,COLUMNS))
print(matrix2)
# [[ 0.87050721  0.22395398  0.19473001  0.14597821  0.02363803  0.20299432]
#  [ 0.11744885  0.61332597  0.19860043  0.91995295  0.84857095  0.53863863]
#  [ 0.80123759  0.52689885  0.05861043  0.71784406  0.20222138  0.63094807]
#  [ 0.01309897  0.45391578  0.04950273  0.93040381  0.41150517  0.66263562]]

このような200x2000の行列が多数ある場合は、どの行列を指定するためにもう1つのテーブル列が必要です。

于 2010-10-26T13:05:30.410 に答える
2

インポート/エクスポートに関しては、PyTablesはHDF5と呼ばれる標準化されたファイル形式を使用します。多くの科学ソフトウェアパッケージ(MATLABなど)にはHDF5のサポートが組み込まれており、CAPIはひどいものではありません。したがって、これらの言語のいずれかからエクスポートまたはインポートする必要のあるデータは、HDF5ファイルに簡単に保存できます。

PyTablesは独自の属性をいくつか追加しますが、これらはあなたを傷つけることはありません。もちろん、Pythonオブジェクトをファイルに保存すると、他の場所でそれらを読み取ることができなくなります。

CSVファイルの良い点の1つは、人間が読める形式であることです。ただし、単純な数字以外のものを格納して他の人と通信する必要がある場合は、問題が発生します。他の組織の人からCSVファイルを受け取っていますが、人間は文字列の引用などが正しく行われていることを確認するのが苦手であることに気づきました。PythonのCSVパーサーがそれと同じくらい柔軟であることは良いことです。もう1つの問題は、浮動小数点数を10進形式を使用してテキストで正確に格納できないことです。ただし、通常はそれで十分です。

于 2010-10-26T11:19:23.657 に答える
2

PyTablesの大きな利点の1つは、変数などのメタデータの保存です。さまざまなパラメーターを使用してシミュレーションをより頻繁に実行する場合は、結果を配列エントリとしてh5ファイルに保存します。

これを使用して、測定データと実験スクリプトを保存し、データを取得して、すべて自己完結型にします。

ところで:hdf5ファイルをすばやく調べる必要がある場合は、HDFViewを使用できます。これは、HDFGroupから無料で提供されるJavaアプリです。インストールは簡単です。

于 2011-10-13T11:20:38.970 に答える
1

pytablesとcsvを結合するのは非常に難しいと思います。pyTableはデータ構造です。CSVはデータの交換形式です。

于 2010-10-26T13:15:50.263 に答える
1

これは実際には、numpyを使用したcsvファイルの読み取り/書き込みに関して私が提供した別の回答と非常に関連しています。

Python:Rのように基本的なデータ操作を行う方法は?

他に何があっても、間違いなくnumpyを使用する必要があります!インデックス作成の容易さなどは、追加の依存関係のコストをはるかに上回ります(まあ、そう思います)。もちろん、PyTablesもnumpyに依存しています。

そうでなければ、それは本当にあなたのアプリケーション、あなたのハードウェアとあなたの聴衆に依存します。あなたが話しているサイズのcsvファイルを読み取ることは、PyTablesと比較して速度の点では重要ではないと思います。しかし、それが懸念事項である場合は、ベンチマークを作成してください。ランダムデータを100回読み書きします。または、読み取り時間がより重要な場合は、1回書き込み、100回読み取りなどを行います。

PyTablesがSQLよりも優れていると強く思います。SQLは、複雑なマルチテーブルクエリ(特に同じクエリを頻繁に実行する場合)に対応しますが、シングルテーブル(いわゆる「非正規化」)テーブルクエリでも、速度の点でpytablesに勝るものはありません。このオフハンドのリファレンスは見つかりませんが、ここでリンクをマイニングすると、何かを掘り下げることができるかもしれません。

http://www.pytables.org/moin/HowToUse#HintsforSQLusers

この段階での実行パフォーマンスは、コーダーのパフォーマンスと比較すると見劣りすると思います。だから、何よりも、あなたにとって最も意味のあるものを選んでください!

その他のポイント:

SQLと同様に、PyTablesには元に戻す機能があります。CSVファイルにはこれはありませんが、バージョン管理で維持でき、VCSはあまりスマートである必要はありません(CSVファイルはテキストです)。

関連する注意点として、CSVファイルはバイナリ形式よりもはるかに大きくなります(これについても独自のテストを作成できます)。

于 2011-06-23T01:08:29.623 に答える
0

これらは「排他的な」選択ではありません。

両方が必要です。

CSVは単なるデータ交換形式です。pytablesを使用する場合でも、CSV形式でインポートおよびエクスポートする必要があります。

于 2010-10-26T11:07:43.727 に答える