2016-07-31 4 views
3

Мне было интересно, был ли более эффективный способ выполнить следующую операцию.вывод данных в массив json

# transforms datetime into timestamp in seconds 
t = df.index.values.astype(np.int64) // 10**6 

return jsonify(np.c_[t, df.open, df.high, df.low, df.close, df.volume].tolist()) 

, где df является dataframe, содержащий индекс, который представляет собой дату, и по крайней мере (но не только) следующие атрибуты: open, high, low, close, volume. Затем я вывожу вновь созданный массив как JSON с флагом jsonify. Приведенный выше код работает, но для меня это выглядит довольно неэффективно, и я понимаю, как сделать его более приятным/более эффективным.

ответ

8

вы можете использовать to_json() метод:

In [88]: import pandas_datareader.data as web 

In [89]: apl = web.get_data_yahoo('AAPL', '2016-07-05', '2016-07-07') 

In [90]: apl 
Out[90]: 
       Open  High  Low  Close Volume Adj Close 
Date 
2016-07-05 95.389999 95.400002 94.459999 94.989998 27705200 94.989998 
2016-07-06 94.599998 95.660004 94.370003 95.529999 30949100 95.529999 
2016-07-07 95.699997 96.500000 95.620003 95.940002 25139600 95.940002 

Я буду использовать json.dumps(..., indent=2) для того, чтобы сделать его лучше/читаемым:

In [91]: import json 

Orient = 'индекс'

In [98]: print(json.dumps(json.loads(apl.to_json(orient='index')), indent=2)) 
{ 
    "1467849600000": { 
    "Close": 95.940002, 
    "High": 96.5, 
    "Open": 95.699997, 
    "Adj Close": 95.940002, 
    "Volume": 25139600, 
    "Low": 95.620003 
    }, 
    "1467676800000": { 
    "Close": 94.989998, 
    "High": 95.400002, 
    "Open": 95.389999, 
    "Adj Close": 94.989998, 
    "Volume": 27705200, 
    "Low": 94.459999 
    }, 
    "1467763200000": { 
    "Close": 95.529999, 
    "High": 95.660004, 
    "Open": 94.599998, 
    "Adj Close": 95.529999, 
    "Volume": 30949100, 
    "Low": 94.370003 
    } 
} 

orient = 'records ' (сброс индекс для того, чтобы сделать колонку Date видимым):

In [99]: print(json.dumps(json.loads(apl.reset_index().to_json(orient='records')), indent=2)) 
[ 
    { 
    "Close": 94.989998, 
    "High": 95.400002, 
    "Open": 95.389999, 
    "Adj Close": 94.989998, 
    "Volume": 27705200, 
    "Date": 1467676800000, 
    "Low": 94.459999 
    }, 
    { 
    "Close": 95.529999, 
    "High": 95.660004, 
    "Open": 94.599998, 
    "Adj Close": 95.529999, 
    "Volume": 30949100, 
    "Date": 1467763200000, 
    "Low": 94.370003 
    }, 
    { 
    "Close": 95.940002, 
    "High": 96.5, 
    "Open": 95.699997, 
    "Adj Close": 95.940002, 
    "Volume": 25139600, 
    "Date": 1467849600000, 
    "Low": 95.620003 
    } 
] 

вы можете использовать следующие to_json() параметров:

DATE_FORMAT: {' эпоха», 'ISO'}

Тип преобразования даты. epoch = epoch milliseconds, iso` = ISO8601, по умолчанию - эпоха.

date_unit: строка, по умолчанию «мс» (миллисекунды)

Единица времени кодировать, регулирует временные метки и ISO8601 точность. Один из '', 'ms', 'us', 'ns' для второго, миллисекундного, микросекундного и наносекунд соответственно.

ориентируют: Строка

Формат строки JSON

  • раскол: ДИКТ как {индекса -> [индекс], столбцы -> [столбцы], данные -> [значения] }
  • записей: список как [{столбец -> значение}, ..., {колонка -> значение}]
  • индекс: Сыроватского как {index -> {колонки -> значение}}
  • колонны: dict как {c olumn -> {index -> value}}: только массив значений
Смежные вопросы