私はPython MongoEngineフレームワークを使用してMongoDBにPandas DataFramesを格納しようとしています。 Pandas Dataframesをdf.to_list()
経由でPython Dictに変換し、それらをネストされたDocument属性として格納します。私は、DataFrameField
というdefined in this gistというカスタムフィールドタイプを使用して、Pandas DataFrameからBSONへの往復旅行をするために書くべきコードの量を最小限にしようとしています。 __set__
および__get__
の方法。MongoEngineドキュメントコンストラクタで__set__を正しく呼び出してください
のように、ドット表記を使用してDataFrameFieldを設定するとき、これは素晴らしい作品:私はプリントを追加する場合
>>> bar = my_data(data_frame = a_pandas_data_frame)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\MPGWRK-006\Anaconda2\lib\site-packages\mongoengine\base\document.py", line 116, in __init__
setattr(self, key, value)
File "C:\Users\MPGWRK-006\Anaconda2\lib\site-packages\mongoengine\base\document.py", line 186, in __setattr__
super(BaseDocument, self).__setattr__(name, value)
File "<stdin>", line 18, in __set__
ValueError: value is not a pandas.DataFrame instance
:
import pandas as pd
import numpy as np
from mongoengine import *
a_pandas_data_frame = pd.DataFrame({
'goods': ['a', 'a', 'b', 'b', 'b'],
'stock': [5, 10, 30, 40, 10],
'category': ['c1', 'c2', 'c1', 'c2', 'c1'],
'date': pd.to_datetime(['2014-01-01', '2014-02-01', '2014-01-06', '2014-02-09', '2014-03-09'])
})
class my_data(Document):
data_frame = DataFrameField() # defined in the referenced gist
foo = my_data()
foo.data_frame = a_pandas_data_frame
が、私はコンストラクタにa_pandas_data_frame
それを渡すと、私が手ステートメントをprint value
から__set__
に変更し、コンストラクタを呼び出して、次のように出力します。
['category', 'date', 'goods', 'stock']
データフレームの列名のリストである
(すなわち、 list(a_pandas_data_frame.columns)
)。 MongoEngineドキュメントコンストラクタが渡されたオブジェクト以外のものを__set__
メソッドに渡さないようにする方法はありますか?
ありがとうございます!
PS、私はまた、[MongoEngineレポ](https://github.com/MongoEngine/mongoengine/issues/1597)でこの質問をしたが、約300未解決の問題があるので、私は、私はそのフォーラムで応答をいつでもすぐに期待わからないんだけど...