2016-10-03 70 views
0

我有大量需要使用PyMongo插入到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在try /除了检测数据库插入错误,这应该是不同的错误从您的文档创建错误处理。

相关问题