numpy与pandas的表现

时间:2017-08-02 16:35:08

标签: python pandas numpy

我正在处理和使用pandas中相当大的数据帧。虽然我不一定对尽可能优化我的代码的性能感兴趣,但是当我仅使用pandas时,我对同一任务的不同版本所观察到的显着性能差距感到非常惊讶,这是一个结合了pandas + {{的混合版本1}}和numpy只。我不是很流利的大熊猫,因为我在numpy,所以我想知道大熊猫是否本质上比特定任务的numpy慢(但是当你编写代码时更优雅)或者这可能部分是由于大熊猫的使用不当。

一般问题

我每月都有一个dict浮标矩阵(其中N和M分别约为1000和5000)。出于外部原因,这些矩阵作为熊猫数据帧提供,每个时间戳一个。在每个日期,我需要在NxM处以元素方式减去矩阵。然后我需要将此结果二进制化,以便在元素明智差异为1时为1,否则为0。最后,对于每个日期,我需要沿着date-1求和,即沿着这个二值化矩阵的行。因此,axis=1是一个字典,其中键是日期,值是NxM数据帧。数据框可能包含dict_MVAdj个值:

NaN

策略1:仅限numpy

dict_MVAdj  -> {datetime.datetime(2003, 2, 1, 0, 0):
         s1     s2       s3 
f1  10000.0  192.0   9421.0       
f2   4000.0    NaN   1340.0, 

, datetime.datetime(2003, 3, 1, 0, 0):      
         s1     s2       s3 
f1  24400.0  102.0   9121.0       
f2  14000.0    3.3   1340.0
} 

策略2:数据帧+ pandas

的字典
for i,key in enumerate(keySort):
    if i:
         dictDelta[key]= dict_MVAdj[keySort[i]].as_matrix()-dict_MVAdj[keySort[i-1]].as_matrix()
         dictBinPos[key] = (np.where(dictDelta[key]>0,1,0)).sum(axis = 1)

战略3:只有熊猫

我在一个多索引Dataframe中汇总我的Dataframes,然后

for i,key in enumerate(keySort):
    if i:
         dictDelta[key] = dict_MVAdj[keySort[i]].subtract(dict_MVAdj[keySort[i-1]])
         dictBinPos[key]= pd.DataFrame(((dictDelta[key]>0).astype(int)).sum(axis=1))

         ''' or alternatively this second strategy to binarize but the perfomance is similar '''
         dictBinPos[key]=  = dictDelta[key].where(dictDelta[key]>0, 0).divide(np.abs(dictDelta[key])).sum(axis=1)

结果

战略1优于战略2和3(到目前为止)。假设,在任意时间单位中,策略1占用1个时间单位,策略2(两个版本)占用约4-5个时间单位,而策略3占用8-10个时间单位。多指数的使用是其中一个来源。战略3的糟糕表现,但主要来源似乎与大熊猫中MVAdj = pd.concat(dict_MVAdj) D_MVAdj = MVAdj.groupby(level=1).diff(1) D_binPos = pd.DataFrame(((D_MVAdl>0).astype(int)).sum(axis=1)) (或类似where)的表现不佳有关。

0 个答案:

没有答案