获取产品的简单矢量化,然后是类似列表的对象的总和

时间:2017-02-01 15:42:10

标签: python pandas numpy vectorization

我想做一个看似简单的操作,也许我只是被阻止了,但是执行此计算的最快方法是什么?

mret = 0
for i in range(1, len(monthly_rets)):
    mret += monthly_rets[i:].prod()

monthly_rets是一个长度为2-540的np.array(即它的长度可以在2到540之间变化,它不一定是np.array)每月因子回报(对于题)。必须有一些聪明的技巧,我可以使用它来避免使用for-loop并加快一点速度?

1 个答案:

答案 0 :(得分:4)

您可以使用np.cumprodnp.sum的组合。像这样的东西应该工作(至少对于numpy数组):

mret = monthly_rets[:0:-1].cumprod().sum()

np.cumprod计算数组的累积乘积,这意味着如果您有一个数组a,其中包含三个元素a[0]a[1]a[2] {{ 1}}将为您提供数组a.cumprod()。现在你想拥有类似的东西。这是通过使用切片[a[0], a[0]*a[1], a[0]*a[1]*a[2]]完成的,切片将向后遍历数组,以倒数第二个元素结束,这样[:0:-1]将为您提供a[:0:-1].cumprod()[a[2], a[1]*a[2]]然后将总结所有元素以便为您提供结果。 (感谢@ B.M。指出正确的切片。)

顺便说一句,我使用sum()的{​​{1}}检查了540个随机数(对应于您最大的数组)的数组的性能优势。我加速了2.3ms /10μs= 230。即使计算ipython警告(可能不正确)的缓存效果,您最终也会有至少40的加速。