2012-04-09 4 views
3

私は農業生産量データをモデル化するために異なる分布形式を選択できるPythonデスクトップアプリケーションを作成しています。私は時系列の農業データを持っています。これは100万行に近く、SQLiteデータベースに保存されています(これは誰かが良い選択を知っていれば石ではありません)。ユーザーがイリノイ州で1990年から2010年までのトウモロコシ収穫高などのデータを選択すると、ドロップダウンから流通形態を選択することができます。次に、私の関数は分布をデータにフィットさせ、Numpy配列でその適合した分布形式から描かれた10,000点を出力します。私はこのデータをプログラムの実行中に一時的にしたいと思います。一時的なナンシーアレイのためのデータベースまたはテーブルソリューション

効率を上げるために、指定した領域と分布に対してこの適合とそれ以降の数字の描画を1回だけ行いたいと思います。私はPythonで一時ファイルを研究していましたが、それが多くの異なるNumpy配列を保存するための最良の方法であるとは確信していません。 PyTablesは面白いアプローチのようにも見え、Numpyと互換性があるようですが、一時的なデータを扱うのには良いとは思いません。最近のMongoDBのようなSQLソリューションも非常に人気が高いようです。

編集:下記のコメントを読んで研究した後、私はPyTablesに行くつもりですが、私はこれに取り組むための最良の方法を見つけようとしています。 Float32Colの代わりに、scikitsの時系列クラスからcreateTimeSeriesTable()を使用するか、日付のdatetime列とマスクのboolean列を作成する必要があるかのような、以下のような表を作成することは可能ですか?データを保持するには、下の[Float32Col]をクリックします。あるいは、この問題についてもっと良い方法がありますか?

class Yield(IsDescription): 
    geography_id = UInt16Col() 
    data = Float32Col(shape=(50, 1)) # for 50 years of data 

この問題に関するお手伝いをさせていただきます。

答えて

1

一時データの用途を教えてください。あなたは一度にすべてを読んでいますか(そして、ただサブセットを読みたいと思うことはありませんか?)

その場合は、テンポラリファイル(例:numpy.save、またはバイナリプロトコルの場合はpickle)に保存してください。その場合、より洗練されたソリューションは必要ありません。

私は、元の時系列データを格納するためにSQLiteよりもPyTablesを強くお勧めします。

あなたがやっているように思えば、リレーショナルデータベースの「リレーショナル」部分(例:結合)は必要ありません。テーブルへの参加や関連付けが不要な場合は、単純なクエリーが必要なだけで、メモリ内のデータを並べ替えたい場合はPyTablesが最適です。 PyTablesはHDFを使用してデータを格納します。これは、SQLiteデータベースよりもはるかにコンパクトにディスクに格納できます。 PyTablesはまた、大量のデータをnumpy配列としてメモリにロードする場合の方がはるかに高速です。

+0

たとえば、ユーザーが複数の地理を選択し、複数の地理上でその適合を実行し、次に他のいくつかの地理から最初のものを引いたものを選択すると、一時データのサブセットを読み込むことになります。私は最初に一時的なデータをチェックし、発見された場合はそのデータを使用し、それ以外の場合はデータベースを照会して新しいデータに適合させたいと考えています。私は今日の午後にPyTablesを見て、それがより良い選択だと思っていますが、Scikitsの時系列データを他の列のテーブルに格納するという簡単な質問を含むように元の質問を編集しました。 – hotshotiguana

+0

さて、10kランダムサンプルを描画するのはかなり高速です。それは答えではありませんが、一般的に私は "あまりにも賢い"ではないことをお勧めします。ランダムサンプルの生成がディスクアクセスよりも高速になる可能性があります。ゆっくりとした部分は、その分布に適合するようです。分布パラメータ(例えば、通常のdistの平均と標準偏差など)を保存するだけで、メモリに保存することができます。もちろん、そのすべてが純粋な推測であり、あなたの質問に答えることに近づくことはありません。 –

関連する問題