【发布时间】:2016-07-18 23:10:44
【问题描述】:
想象一下,您有一个非常大的数组,其中的元素集合无法放入计算机的内存中。在 Python 中如何计算这个数组的平均值、中位数、标准差和其他汇总统计值?
我找到了this post,它解释了增量计算平均值的数学方法,还提供了一个 Python 函数,它接受一个列表或一个迭代器对象,但由于人们可能并不总是可以访问迭代器对象,所以我将它作为一个类来实现其行为类似于collections.Counter。但是如何计算std、min、max、median、skewness、kurtosis 等?
下面的代码是一个最小的工作示例,它实现了增量 mean、min 和 max,并显示了其余部分的适合位置:
class Inc_sumstats(object):
def __init__(self):
self.length = 0
self.mean = 0
#self.std = 0
self.min = np.inf
self.max = 0
#self.median = 0
#self.skewness = 0
#self.kurtosis = 0
def update(self, num):
self.length += 1
self.mean = (self.mean * (self.length - 1) + num) / self.length
#self.std = ...
self.min = num if num < self.min else self.min
self.max = num if num > self.max else self.max
#self.median = ...
#self.skewness = ...
#self.kurtosis = ...
return self
更新:
我知道网站上有similar questions,但到目前为止我还没有找到任何解决方案来解决比平均值更高级的问题。如果我在背景研究中遗漏了什么,请链接问题或标记为重复。
【问题讨论】:
-
如果不在内存中,你如何存储这个数组?
-
因为当你增加数组时平均值会改变,我相信你必须从头开始计算标准。
-
@Natecat 该数组可能是大量的电子邮件字符长度流,或任何其他类型的实时数据流。或者它可以存储在一个大硬盘上。
-
最小值和最大值应该相当简单。对于中位数,最有效的方法是让两个堆保持平衡,如here 所述。如果需要,堆可以保存在内存中或保存到硬盘中。其他三个我不太确定
-
@JulesTamagnan 你说得对,最小值和最大值非常简单,我更新了问题中的代码。
标签: python statistics bigdata