这是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'
答案 0 :(得分:1)
这只是一个Python问题:因为示例中的每个数据都具有
形式{"item": X, "qty": Y}
访问它的方式是使用d["item"]
和d["qty"]
,而不是d.item
和d.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)
不同的填充方法以不同的方式解释字符串。