2017-07-14 1 views
0

私は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未解決の問題があるので、私は、私はそのフォーラムで応答をいつでもすぐに期待わからないんだけど...

答えて

1

ソースを掘り下げてフィールドにto_pythonメソッドを定義する必要があると思われます。それ以外の場合はmongoengine.fields.DictFieldto_pythonメソッドに戻ります。

mongoengine.fields.DictFieldto_pythonの方法は基本的にComplexBaseFieldto_python methodです。 DataFrameを受け取るこの方法は、DataFrameインスタンスを列挙して得られたオブジェクトがsort of a listreturns the valuesであると判断します。

ここにはto_python on the field objectという部分があります。

def to_python(self, value): 
    return value 

if key in self._fields or key in ('id', 'pk', '_cls'): 
    if __auto_convert and value is not None: 
     field = self._fields.get(key) 
     if field and not isinstance(field, FileField): 
      value = field.to_python(value) 

したがって、あなたのケースでは、あなたは単にそれを定義することができます

関連する問題