pandas cum扩展之cumvar:增量方差算法

 

累计方差计算问题

在处理时间序列问题时,通常会遇到累计计算问题,即:对于每个时间,计算从开始到时间的样本的统计量值。pandas中有现成的cumsum、cumprod、cummax和cummin分别用于计算累计求和、累计乘积、累计最大值和最小值。不过没有cumvar函数用来计算累计方差。当然可以通过简单循环来计算每一个时间的累计方差,不过在数据量大的情况下,这样效率太低了。

 

增量方差算法

有变量的一组长度为的历史样本(记为):

其均值为:

方差为:

其中为自由度,一般计算样本方差时(无偏估计),计算总体方差时(有偏估计)。

 

现在有一组长度为的增量样本(记为):

其均值和方差分别为:

我们要通过上面给出的两组样本分别的均值和方差公式来计算两组样本合并在一起之后的全样本:

的均值和方差。

全样本均值为:

全样本方差为:

Python实现

通过Python实现增量方差算法。

以10万个样本作为测试,迭代算法用时13.93秒,增量算法用时3.42秒。

以100万个样本作为测试,迭代算法用时81.68秒,增量算法用时6.81秒。

迭代算法用时呈指数递增,增量算法使用是线性递增的,效率提升十分明显。

 

参考:

算法之美 之 小小方差增量算法带来的大大收益