~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 秒
質問:
- DataFrames の内容を np.array の計算タスクに最適なものに変換していますか?
- pandas の .sum() ルーチンは、NumPy の .sum() ルーチンと大きく異なりますか、それともデータへのラベル アクセスによる速度の違いですか?
- これらのランタイムはなぜそれほど異なるのでしょうか?