2016-11-29 2 views
1

Dies ist ein Followup Frage SO Two-dimensional aggregation in Histogrammar (Jim Pivarski erstellt diesen Eintrag aus einer privaten E-Mail-Frage):kategorische Aggregation in Histogrammar

Von:

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

ich eine Summe Aggregation mit Histogrammar erhalten möchten , dh:

ball: 8.0 
whistle: 20 

Nach http://histogrammar.org/docs/tutorials/python-numpy/#histogrammar-in-numpy und Beratung Jim in erwähnter SO, ich versuche:

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() 

ich:

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

Antwort

1

Dies ist nur ein Problem Python: da jedes Datum in Ihrem Beispiel die Form hat

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

so, wie es für den Zugriff auf ist mit d["item"] und d["qty"], anstatt d.item und d.qty.

So

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() 

Ergebnisse in

{"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"} 

Wenn Sie die Möglichkeit, Ihre Daten sind vertreten ändern, würden Sie die Art und Weise ändern, müssen sie von jedem datum extrahiert sind.

Übrigens hat Histogrammar-Python eine Zeichenfolge-basierte Verknüpfung, die Felder als Attribute extrahiert (wie Sie es versuchten) oder als Elemente (wie ich oben getan habe). Im Folgenden würde mit jeder Art von Daten arbeiten:

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

Diese String-basierte Methode funktioniert auch, wenn data ein Wörterbuch von 1D- Numpy Arrays ist (oder äquivalent ein Numpy Rekord Array, ich erinnere mich nicht, wenn es ein Pandas Haken auch dort). In diesem Fall würden Sie das Histogramm erklären genau wie oben, aber es wie folgt füllen:

h.fill.numpy(data) 

Es ist die unterschiedliche Fill-Methode, die die Saiten unterschiedlich interpretiert.

+0

Aber SO scheint nicht mir diesen Tag eine E-Mail-Versand zu werden, auch wenn ich einen Filter einrichten. Ich werde mich darum kümmern müssen. In der Zwischenzeit, Entschuldigung, wenn meine Antworten pickelig sind! –

+0

Oh, ich habe es gerade verstanden. Ich sollte es also per E-Mail herausfinden, wenn Sie noch weitere Fragen mit diesem Tag schreiben, allerdings mit einer Verzögerung. –

+0

funktioniert perfekt! –