Histogrammar中的分类聚合

时间:2016-11-29 16:04:20

标签: histogrammar

这是SO Two-dimensional aggregation in Histogrammar的后续问题(Jim Pivarski通过私人电子邮件问题创建了此条目):

来自:

data = [{"item": 'ball', "qty": 3.0}, 
        {"item": 'whistle', "qty": 2.0}, 
        {"item": 'ball', "qty": 5.0}]

我想使用Histogrammar获得一个总和聚合,

ball: 8.0
whistle: 20

关注http://histogrammar.org/docs/tutorials/python-numpy/#histogrammar-in-numpy,以及Jim在提到的SO中的建议,我尝试:

import histogrammar as hg
data = [{"item": 'ball', "qty": 3.0}, {"item": 'whistle', "qty": 2.0}, {"item": 'ball', "qty": 5.0}]

h = hg.Categorize(quantity=lambda d: d.item, value=hg.Sum(lambda d: d.qty))
for datum in data:
   h.fill(datum)

 print h.toJson()

我明白了:

AttributeError: 'dict' object has no attribute 'item'

1 个答案:

答案 0 :(得分:1)

这只是一个Python问题:因为示例中的每个数据都具有

形式
{"item": X, "qty": Y}

访问它的方式是使用d["item"]d["qty"],而不是d.itemd.qty

所以

h = hg.Categorize(quantity=lambda d: d["item"], value=hg.Sum(lambda d: d["qty"]))
for datum in data:
    h.fill(datum)

print h.toJsonString()

结果

{"data": {"bins:type": "Sum", "bins": {"whistle": {"sum": 2.0, "entries": 1.0},
 "ball": {"sum": 8.0, "entries": 2.0}}, "entries": 3.0}, "version": "1.0",
 "type": "Categorize"}

如果您更改数据的表示方式,则必须更改从每个datum中提取数据的方式。

顺便提一下,Histogrammar-Python有一个基于字符串的快捷方式,它将字段提取为属性(正如您尝试的那样)作为项目(如上所述)。以下内容适用于任何一种数据:

h = hg.Categorize("item", hg.Sum("qty"))

如果data是1D Numpy数组的字典(或者等效地是Numpy记录数组;我不记得那里是否还有Pandas挂钩),这个基于字符串的方法也可以工作。在这种情况下,您将完全按上述方式声明直方图,但填写如下:

h.fill.numpy(data)

不同的填充方法以不同的方式解释字符串。