1

概要:
財務データ分析プロジェクト用に多数の変数 (幅広いデータセット) を作成しようとしています。140,000 行の pandas データフレーム「position_history」があり、それぞれに株と売買の日付/価格が含まれています。

入力 (stock、buy_date、sell_date) を受け取る関数 create_domain があります。

  1. 私のSQLite3データベースにクエリを作成して、それらの日付を指定してその株の時系列を抽出します。
  2. 時系列を使用して変数を構築します

df.apply を使用して、関数 create_domain を position_history に適用します

コードを順番に実行すると、変数を構築するのに約 4 時間かかります。これを何度も行う必要があり、より広いデータセットが必要になる可能性があるため、複数のプロセスを使用してこれを高速化したいと考えています。

複数のプロセスの場合、position_history を縦にチャンクに分割し、データフレームのリストを作成します。このリストを joblib (マルチプロセッシング) に渡します。私のコードはほとんどの場合、エラーをスローすることなく無期限にハングします (ただし、小さなサンプルで実行される場合もあります)。

ワーカー プロセスが同じ SQL テーブルを同時に読み込もうとしているために問題が発生しているのではないかと疑っています。

私は次の救済策を試しました

関連するスタックオーバーフロー エントリ:

(擬似) コード スニペット
joblib への私の呼び出し:

x = Parallel(n_jobs =4)(delayed(create_domain)(chunk, other inputs) for chunk in chunks)  
# where each chunk is a portion of the position_history df

私の create_domain 関数:

def create_domain (df=position_history, inputs):  
    # create vars using row x of position_history  
    f = lambda x: sql_query_and_create_vars(inputs, x['column'])  
    result = df.apply(f, axis=1)  
    return result

概要: コードが永久にハングアップし、カーネルがクラッシュし、エラーは発生しません。以下に関する洞察をいただければ幸いです。

  • なぜこれが起こっているのですか?
  • どうすれば修正できますか?
  • 私がやろうとしていることを行うためのより良い方法はありますか? SQL クエリのベクトル化と最適化に最善を尽くしました。
  • これは SQLite3 の問題ですか? MySQL のようなものがうまく機能しますか?
  • 任意のヒント; コーディング/Python/データ サイエンスは初めてです。

詳細: 私はスーパー コンピューター クラスターで Linux を実行し、Python 3.4.3 で iPython を使用しています。

これは私の最初のスタック オーバーフローの質問です。

4

0 に答える 0