Pandas + PyMongo: запись фрейма данных в MongoDB - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу вставить панду DataFrame в MongoDB.Однако, когда я это делаю, столбец timestamp (, который является index_coloumn кадра данных ) не вставляется в MongoDB.

Ниже приведен мой код псевдокода, который воспроизводитПроблема:

from datetime import datetime

import pandas as pd
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client.ticks
collection = db.STOCK
collection_ohlc = db.STOCK_ohlc

# Read per second ticks data from Mongo into a dataframe
results = collection.find(
    {'timestamp': {'$gte': '2019-01-24T09:15:00', '$lte': '2019-01-24T09:19:59'}})
df = pd.DataFrame(list(results))

# Convert per second ticks data into 1 Minute OHLC Candle
df['timestamp'] = pd.to_datetime(df['timestamp'], errors='coerce')
df.set_index('timestamp', inplace=True)
ohlc_data = df['ltp'].resample('5min').ohlc()

# Print OHLC candle dataframe
print(ohlc_data)

# Write  the OHLC candle back to Mongo into a new collection STOCK_ohlc
collection_ohlc.insert_many(ohlc_data.to_dict('records'))

Вот результат вышеприведенного print(ohlc_data) оператора:

                       open   high    low   close
timestamp
2019-01-24 09:15:00  286.55  286.7  285.5  285.65

Теперь код работает нормально и значения ohlc вставляются в MongoDB.Однако столбец timestamp отсутствует.

Ниже представлен MongoShell, в котором перечислены вставленные записи:

> db.STOCK_ohlc.find()
{ "_id" : ObjectId("5c6abc6f4994a1bc8c3c08fd"), "open" : 286.55, "high" : 286.7, "low" : 285.5, "close" : 285.65 }
>

Как мы видим, отметка времени отсутствует в вставленной записи выше.Это бесполезно, если отсутствует отметка времени.

Я пробовал различные orient, как указано в pandas.DataFrame.to_dict, но ни одна из них, похоже, не вставляется в MongoDB.Единственный orient, который вставляет данные, это records, но тогда он пропускает timestamp.

Любые указатели будут очень полезны.

ОБНОВЛЕНИЕ: Вотвыход print(ohlc_data.to_dict('records'))

[{'open': 286.55, 'high': 286.7, 'low': 285.5, 'close': 285.65}]
...