我正在处理和使用pandas中相当大的数据帧。虽然我不一定对尽可能优化我的代码的性能感兴趣,但是当我仅使用pandas时,我对同一任务的不同版本所观察到的显着性能差距感到非常惊讶,这是一个结合了pandas + {{的混合版本1}}和numpy只。我不是很流利的大熊猫,因为我在numpy,所以我想知道大熊猫是否本质上比特定任务的numpy慢(但是当你编写代码时更优雅)或者这可能部分是由于大熊猫的使用不当。
我每月都有一个dict
浮标矩阵(其中N和M分别约为1000和5000)。出于外部原因,这些矩阵作为熊猫数据帧提供,每个时间戳一个。在每个日期,我需要在NxM
处以元素方式减去矩阵。然后我需要将此结果二进制化,以便在元素明智差异为1时为1,否则为0。最后,对于每个日期,我需要沿着date-1
求和,即沿着这个二值化矩阵的行。因此,axis=1
是一个字典,其中键是日期,值是NxM数据帧。数据框可能包含dict_MVAdj
个值:
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
}
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)
我在一个多索引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
)的表现不佳有关。