Подтвердить что ты не робот

Как я могу эффективно перейти от фрейма данных Pandas к JSON

Я начал использовать pandas, чтобы выполнить некоторую агрегацию по дате. Моя цель - подсчитать все экземпляры измерения, которые происходят в определенный день, и затем представить это в D3. Чтобы проиллюстрировать мой рабочий процесс, у меня есть запрос (от Django), который выглядит так:

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

Я делаю dataframe в pandas и агрегирую меру 'counter' с созданным днем:

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

Это дает мне такую ​​структуру данных:

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

Как я использую D3, я думал, что объект JSON будет самым полезным. Используя функцию pandas to_json(), я конвертирую свой dataframe следующим образом:

aggregated_df.to_json()

дает мне следующий объект JSON

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

Это не совсем то, что я хочу, поскольку я хотел бы иметь доступ как к дате, так и к измерению. Есть ли способ экспортировать данные, чтобы в итоге я получил что-то вроде этого?

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

Я думал, что если бы я мог структурировать это по-разному на стороне Python, это уменьшило бы количество форматирования данных, которое мне нужно было бы сделать на стороне JS, поскольку я планировал загрузить данные, делая что-то вроде этого:

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

Я очень открыт для предложений о лучших рабочих процессах в целом, поскольку это то, что мне нужно делать часто, но я не уверен в том, что вы лучше всего сможете использовать соединение между D3 и pandas. (Я просмотрел несколько пакетов, которые объединяют как Python, так и D3 напрямую, но это не то, что я ищу, поскольку они, похоже, сосредоточены на создании статических диаграмм и не создании svg)

4b9b3361

Ответ 1

Преобразуйте индекс даты обратно в простой столбец данных с помощью reset_index, а затем сгенерируйте свой объект json с помощью свойства 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}}'