numpy vs熊猫的表现

Sir*_*irC 5 python numpy pandas

我正在处理和处理熊猫中相当大的数据框。尽管我不一定对尽可能优化代码的性能感兴趣,但是当我仅使用pandas时,我发现同一任务的不同版本之间存在巨大的性能差距,这让我感到非常惊讶,该混合版本结合了pandas + dict和numpy只要。我不像numpy那样会流利的熊猫,因此我想知道对于某些特定的任务,pandas本质上是否比numpy慢(但是在编写代码时更优雅),或者这可能部分是由于对pandas的使用不佳所致。

一般问题

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

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
} 
Run Code Online (Sandbox Code Playgroud)

策略1:仅numpy

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)
Run Code Online (Sandbox Code Playgroud)

战略2:数据帧+熊猫的字典

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)
Run Code Online (Sandbox Code Playgroud)

战略3:只熊猫

我在单个多索引Dataframe中合并了Dataframe的字典,然后

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))
Run Code Online (Sandbox Code Playgroud)

结果

策略1(到目前为止)优于策略2和3。假设以任意时间单位,策略1占用1个时间单位,策略2(两个版本)占用约4-5个时间单位,而策略3占用8-10个时间单位。multi index的使用是其中之一策略3的效果不佳,但主要的原因似乎与大熊猫where(或类似where)表现不佳有关。