2013-10-06 4 views
11

Ich habe angefangen, pandas zu verwenden, um eine Aggregation nach Datum durchzuführen. Mein Ziel ist es, alle Instanzen einer Messung an einem bestimmten Tag zu zählen und diese dann in D3 darzustellen. Um meinen Workflow zu illustrieren, habe ich eine queryset (von Django), die wie folgt aussieht:Wie kann ich effizient von einem Pandas-Datenframe zu JSON wechseln

queryset = [{'created':"05-16-13", 'counter':1, 'id':13}, {'created':"05-16-13", 'counter':1, 'id':34}, {'created':"05-17-13", 'counter':1, 'id':12}, {'created':"05-16-13", 'counter':1, 'id':7}, {'created':"05-18-13", 'counter':1, 'id':6}] 

Ich mache einen Datenrahmen in pandas und aggregieren die Maßnahme ‚Zähler‘ von Tag zu Tag erstellt:

import pandas as pd 
queryset_df = pd.DataFrame.from_records(queryset).set_index('id') 
aggregated_df = queryset_df.groupby('created').sum() 

Das gibt mir ein Datenrahmen wie folgt aus:

  counter 
created   
05-16-13  3 
05-17-13  1 
05-18-13  1 

wie ich D3 verwende ich gedacht, dass ein JSON Objekt wäre t er ist am nützlichsten. Mit Hilfe der Pandasto_json() Funktion konvertiere ich meine Datenrahmen wie folgt aus:

aggregated_df.to_json() 

mir das JSON Objekt folgende Angabe

{"counter":{"05-16-13":3,"05-17-13":1,"05-18-13":1}} 

Dies ist nicht genau das, was ich will, wie ich in der Lage sein möchte, sowohl für den Zugriff auf das Datum und die Messung. Gibt es eine Möglichkeit, die Daten so zu exportieren, dass ich so etwas erhalte?

data = {"c1":{"date":"05-16-13", "counter":3},"c2":{"date":"05-17-13", "counter":1}, "c3":{"date":"05-18-13", "counter":1}} 

Ich dachte, wenn ich dies anders auf der Seite Python strukturieren könnte, wäre es, die Menge an Datenformatierung reduziert ich brauchen würde, auf der JS Seite zu tun, wie ich die Daten zu tun, so etwas zu laden geplant:

x.domain(d3.extent(data, function(d) { return d.date; })); 
    y.domain(d3.extent(data, function(d) { return d.counter; })); 

ich bin sehr offen für Vorschläge von besseren Arbeitsabläufe insgesamt als dies etwas, das ich oft tun müssen, wird aber bin nicht sicher, der beste Weg, um die Verbindung zwischen D3 und pandas der Handhabung. (Ich habe mehrere Pakete betrachtet, die beide python und D3 direkt kombinieren, aber das ist nicht etwas, das ich suche, da sie auf statische Diagrammgenerierung zu konzentrieren scheinen und keine Svg machen)

Antwort

22

Verwandeln Sie Ihren Datumsindex zurück in eine einfache Datenspalte mit reset_index, und dann generieren Sie Ihr JSON-Objekt mit der orient='index' Eigenschaft:

In [11]: aggregated_df.reset_index().to_json(orient='index') 
Out[11]: '{"0":{"created":"05-16-13","counter":3},"1":{"created":"05-17-13","counter":1},"2":{"created":"05-18-13","counter":1}}'