2013-10-06 14 views
11

Ho iniziato a utilizzare pandas per fare un po 'di aggregazione per data. Il mio obiettivo è contare tutte le istanze di una misurazione che si verificano in un particolare giorno e per rappresentarlo in D3. Per illustrare il mio flusso di lavoro, ho un set di query (da Django) che assomiglia a questo:Come spostarmi in modo efficiente da un dataframe di Pandas a JSON

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}] 

faccio un dataframe in pandas e aggregare il 'contatore' misura di giorno in giorno creato:

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

questo mi dà una dataframe come questo:

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

come sto usando D3 ho pensato che un oggetto JSON sarebbe t lui più utile. Utilizzando la funzione Pandasto_json() a convertire il mio dataframe in questo modo:

aggregated_df.to_json() 

dandomi il seguente JSON oggetto

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

Questo non è esattamente quello che voglio, come mi piacerebbe essere in grado di accedere sia la data e la misurazione. C'è un modo per esportare i dati in modo tale che finisca con qualcosa di simile?

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

ho pensato che se avessi potuto strutturare in modo diverso sul lato Python, sarebbe ridurre la quantità di formattazione dei dati avrei bisogno di fare sul lato JS come ho programmato per caricare i dati di fare qualcosa di simile:

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

sono molto aperto a suggerimenti di flussi di lavoro migliori nel complesso come questo è qualcosa che ho bisogno di fare frequentemente, ma sono sicuro del modo migliore di gestire la connessione tra D3 e pandas. (Ho guardato diversi pacchetti che combinano sia python e D3 direttamente, ma che non è qualcosa che sto cercando come sembrano concentrarsi sulla generazione grafico statico e non fare uno SVG)

risposta

22

Trasforma il tuo indice di data di nuovo in una colonna di dati semplice con reset_index, e quindi generare il vostro oggetto jSON utilizzando la proprietà orient='index':

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}}' 
Problemi correlati