Pandas:DataFrame.sum()还是DataFrame().as_matrix.sum()
我正在写一个函数,用来计算一个大约有800列的pd.DataFrame中所有列的条件概率。我写了几个版本的这个函数,发现两种主要选项在计算时间上差别很大:
col_sums = data.sum() #Simple Column Sum over 800 x 800 DataFrame
选项 #1: {'col_sums'和'data'分别是一个Series和一个DataFrame}
[这个是在一个循环中进行的,循环的目的是获取所有的组合]
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: [在循环中获取所有组合时] 唯一的不同是,在循环之前我把data_matrix导出成了一个np.array,而不是使用DataFrame
new_data = data.T.as_matrix() [Type: np.array]
选项 #1的运行时间大约是1700秒
选项 #2的运行时间大约是122秒
问题:
- 把DataFrame的内容转换成np.array对于计算任务来说是最优的吗?
- 在pandas中,.sum()这个函数和NumPy中的.sum()有显著区别吗?还是说速度差异是因为访问数据时的标签问题?
- 为什么这两个选项的运行时间差别这么大?
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()方法来访问标量值,就像查找矩阵一样。