2016-10-03 9 views
0

Pyonggoを使用してMongoDBデータベースに挿入する必要があるデータがかなりあります。私が持っているデータは現在フラットファイルに保存されており、スパースです(つまり、個々の値の多くはNaNです)。 Mongo DBでは、値がNaNの場合はフィールドを挿入しませんが、それを行う方法がわかりません(MongoDBとPythonの新機能です)。PyMongo値がNaNでない場合にのみ、ドキュメントにフィールドを含めます

マイ挿入startementこの

  strategy.insert_many([ 
      { 
       "strategyId": strategyInfo[stratIndex][ID], 
       "strategyName": strategyInfo[stratIndex][NAME], 
       "date": dates[i], 
       "time": thisTime, 
       "aum": stratAum[i], 
       "return":0.0, 
       "commission":0.0, 
       "slippage":0.0, 
       "basket":[{ 
        "assetId": assets[m][ASSETID], 
        "order": orders[i, m], 
        "expiry": expiry[i, m], 
        "price": prices[i, m], 
        "ePrice": eprices[i, m]  <<<Don't include line if eprices[i,m] is a NaN 
       } 
        for m in range(len(assets)) 
       ] 
      } 
     ], False) 

のようになりますそれは私の価値のの一つがNaNのmath.isnan()を使用しているかどうかを確認するために十分に簡単だが、私はその場合は空白のフィールド全体を残す方法を見つけ出すことはできませんその場合です。

+0

データを最初に修正するのはどうですか?あなたのデータのソースは何ですか? – styvane

+0

データは内部的に生成されます。それには何も問題はありません。欠損値は意図的です。 –

答えて

0

それは私の価値のの一つがNaNのmath.isnan()を使用しているが、私はそのような場合には、空白フィールド全体を残す方法を見つけ出すことはできませんかどうかを確認するために十分に簡単です。

は、あなたのコード例に基づいて、あなたの代わりに、次の操作を行うことができます。基本的に作り、あなたの文書とデータベースの挿入を分離

# Create a strategy document. 
# This is inside of a loop where variable `i` is known, similar to your example. 
doc = { 
    "strategyId": strategyInfo[stratIndex][ID], 
    "strategyName": strategyInfo[stratIndex][NAME], 
    "date": dates[i], 
    "time": thisTime, 
    "aum": stratAum[i], 
    "return":0.0, 
    "commission":0.0, 
    "slippage":0.0 
} 
baskets = [] 
for m in range(len(assets)): 
    basket = { 
     "assetId": assets[m][ASSETID], 
     "order": orders[i, m], 
     "expiry": expiry[i, m], 
     "price": prices[i, m], 
    } 
    if not math.isnan(eprice[i, m]): 
     basket["ePrice"] = eprice[i, m] 
    baskets.append(basket) 

# You can also add a filter here to make sure `baskets` array is not null. 
doc["basket"] = baskets 
docs.append(doc) 

その後、insert_many()を使用することができます。

strategy.insert_many(docs, False) 

ます。また、ドキュメントの作成エラーから扱うさまざまなエラーでなければなりませんデータベースの挿入エラーを検出する以外/試しにinsert_manyをラップすることができます。

関連する問題