【问题标题】:Python summary statistics from counts dictionary来自计数字典的 Python 汇总统计
【发布时间】:2018-04-19 08:23:25
【问题描述】:

我正在尝试收集汇总统计数据以生成箱线图。
我有一本字典,其中的键是要在 y 轴上绘制的变量,而值是它们在数据中的计数。

d = {16: 5, 
     21: 9, 
     44: 2, 
      2: 1}

我想知道是否有一种方法可以仅从计数中生成中位数、Q1、Q3 等统计数据 - 我不想将它变成像 [16, 16, 16, 16, 16, 21, 21, ...] 这样的列表并从中计算。这是因为我试图节省大量内存,而不必将单个观察结果存储在内存中。

编辑
更具体一点。给定一个输入

d = {4: 2, 10: 1, 3: 2, 11: 1, 18: 1, 12: 1, 14: 1, 16: 2, 7: 1}

我想要输出的东西

{'q1': 4, 'q2': 10.5, 'q3', 15, 'max': 18, 'min': 3}

【问题讨论】:

  • 您的问题所需的输出是什么样的?
  • @MichaelHall,以下解决方案有帮助吗?如果是这样,请随时接受(在左侧打勾),当然,如果有任何不清楚的地方,请询问。
  • @jpp 它有效,但正如您所提到的,并非在所有情况下。只是想解决极端情况。只是有点难以完全理解你的方法是如何工作的。将接受一次(如果)我弄清楚如何让它适用于所有情况。此外,它似乎正在多次传递相同的数据 (d.values)。我觉得一定有一种方法可以一次性完成?

标签: python dictionary statistics


【解决方案1】:

这是一个想法。我没有处理所有情况(例如,当中位数索引不是整数时),但由于get_val 返回生成器的结果,它应该是内存高效的。

from collections import OrderedDict
from itertools import accumulate

d = {16: 5, 
     21: 9, 
     44: 4, 
      2: 2}

d = OrderedDict(sorted(d.items()))
size = sum(d.values())
idx = {'q1': size/4,
       'q2': size/2,
       'q3': size*3/4}

# {'q1': 5.0, 'q2': 10.0, 'q3': 15.0}

def get_val(d, i):
    return next(k for k, x in zip(d, accumulate(d.values())) if i < x)

res = {k: get_val(d, v) for k, v in idx.items()}

# {'q1': 16, 'q2': 21, 'q3': 21}

【讨论】:

  • 例如,如果 size%4 != 0,您应该在 q1 中添加一个,但这个想法似乎不错。
  • 同意。即使那样它也不完美,但这应该是一个很好的模板。用户应该能够添加标准来处理边缘情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2016-04-11
  • 2011-07-10
  • 1970-01-01
相关资源
最近更新 更多