3

~800 列の pd.DataFrame 内のすべての列の条件付き確率を計算する関数を作成しています。関数のいくつかのバージョンを作成し、2 つの主要なオプションで計算時間に非常に大きな違いがあることを発見しました。

col_sums = data.sum()   #Simple Column Sum over 800 x 800 DataFrame

オプション #1: {'col_sums' と 'data' はそれぞれ Series と DataFrame です}

[これは、すべての組み合わせを取得するための index1 と index2 のループ内に含まれています]

joint_occurance = data[index1] * data[index2]
sum_joint_occurance = joint_occurance.sum()
max_single_occurance = max(col_sum[index1], col_sum[index2])
cond_prob = sum_joint_occurance / max_single_occurance #Symmetric Conditional Prob
results[index1][index2] = cond_prob

対。

オプション #2: [すべての組み合わせを取得するために index1 と index2 をループしている間] DataFrame を使用する代わりに唯一の違いです。ループする前に data_matrix を np.array にエクスポートしました。

new_data = data.T.as_matrix() [Type: np.array]

オプション #1 ランタイムは ~1700 秒 オプション #2 ランタイムは ~122 秒

質問:

  1. DataFrames の内容を np.array の計算タスクに最適なものに変換していますか?
  2. pandas の .sum() ルーチンは、NumPy の .sum() ルーチンと大きく異なりますか、それともデータへのラベル アクセスによる速度の違いですか?
  3. これらのランタイムはなぜそれほど異なるのでしょうか?
4

1 に答える 1

1

私が遭遇したドキュメントを読んでいる間:

セクション 7.1.1 高速なスカラー値の取得と設定[] を使用したインデックス作成は、多くのケース (単一ラベル アクセス、スライシング、ブール型インデックス作成など) を処理する必要があるため、何を意味するかを理解するために多少のオーバーヘッドが生じます。を求めています。スカラー値にのみアクセスしたい場合、最速の方法は、すべてのデータ構造に実装されている get_value メソッドを使用することです。

In [656]: s.get_value(dates[5])
Out[656]: -0.67368970808837059
In [657]: df.get_value(dates[5], ’A’)
Out[657]: -0.67368970808837059

最良の推測: データフレームから個々のデータ要素に何度もアクセスしているためです(マトリックスあたり〜640,000のオーダー)。速度の低下は、データの参照方法 (つまり、「[] を使用したインデックス作成は多くのケースを処理する」) に起因すると考えられるため、マトリックス ルックアップと同様にスカラーにアクセスするには get_value() メソッドを使用する必要があります。

于 2013-02-15T06:11:26.187 に答える