平均聚合不带值

时间:2017-06-22 13:43:53

标签: python mongodb aggregation-framework pymongo

我的数据存储方式与此类似。

{'_id': ObjectId('593ab6131ccb9b0c0fb2b2a6'), 'timestamp': datetime.datetime(2016, 12, 12, 8, 59), 'VOL_GAZ_CHA_I_001': '1.6466e+05', 'VOL_ECS_PUI_I_001': 4581, 'VOL_ECS_APP_I_001': 21, 'VOL_CHA_PAC_I_001': '7.9696e+05', 'TEM_SE_N_I_001': 18, 'TEM_SDB_S_I_001': 19.1, 'TEM_SAM_SO_I_001': 19, 'TEM_SAL_NO_I_001': 18.7, 'TEM_PAL_N_I_001': 18, 'TEM_GA_E_I_001': 4.6, 'TEM_FAC_NOR_I_001': 5.14, 'TEM_ENT_NE_I_001': 18.6, 'TEM_ECS_PUI_I_001': 23.1, 'TEM_ECS_APP_I_001': 37.5, 'TEM_CUI_S_I_001': 18.7, 'TEM_CHA_PAC_I_001': 23.7, 'TEM_CH3_NO_I_001': 18.1, 'TEM_CH2_SO_I_001': 19, 'TEM_CH1_SE_I_001': 18.9, 'TEM_CEL_SE_I_001': 18.3, 'TEM_BUR_NE_I_001': 18.3, 'INT_ELE_GEN_I_001': 0, 'HUM_SE_N_I_001': 56, 'HUM_SDB_S_I_001': 39, 'HUM_SAM_SO_I_001': 50, 'HUM_SAL_NO_I_001': 42, 'HUM_PAL_N_I_001': 42, 'HUM_GA_E_I_001': 88, 'HUM_ENT_NE_I_001': 42, 'HUM_CUI_S_I_001': 43, 'HUM_CH3_NO_I_001': 43, 'HUM_CH2_SO_I_001': 40, 'HUM_CH1_SE_I_001': 41, 'HUM_CEL_SE_I_001': 51, 'HUM_BUR_NE_I_001': 42, 'FLX_SOL_SUD_I_001': 35, 'ENE_ELE_USA_I_001': 0, 'ENE_ELE_PV_I_001': 1589, 'ENE_ELE_GEN_I_001': 0, 'ENE_ELE_CHA_I_001': 0, 'ENE_ELE_BTD_I_001': 0, 'ENE_ECS_PUI_I_001': '1.5729e+05', 'ENE_ECS_APP_I_001': 0, 'ENE_CHA_RDC_I_001': 0, 'ENE_CHA_PAC_I_001': 2054, 'ENE_CHA_GEN_I_001': '2.2468e+06', 'CO2_SE_N_I_001': 552, 'CO2_SDB_S_I_001': 390, 'CO2_SAM_SO_I_001': 531, 'CO2_SAL_NO_I_001': 403, 'CO2_PAL_N_I_001': 390, 'CO2_GA_E_I_001': 668, 'CO2_ENT_NE_I_001': 390, 'CO2_CUI_S_I_001': 400, 'CO2_CH3_NO_I_001': 390, 'CO2_CH2_SO_I_001': 390, 'CO2_CH1_SE_I_001': 390, 'CO2_CEL_SE_I_001': 504, 'CO2_BUR_NE_I_001': 481}

每个数据都有一个“_id”,一个日期对象“时间戳”和几个带有自己测量值的传感器。对于每个传感器,我希望每月平均得到它们的值。

我要做的第一件事就是选择一个传感器。然后我过滤我的数据集只得到“_id”,“时间戳”和选定的传感器。 (见$ match)

然后我对我的数据集的每个月进行聚合,并且我想评估所选传感器在本月内记录值的平均值。

for chosenSensor in self.chosenSensors:       

        monthlyAverage = client[page1.currentDB][page2.currentColl].aggregate([{"$match":{chosenSensor:{"$exists": True}}}, {"$group":{"_id":{"year":{"$year":"$timestamp"}, "month":{"$month":"$timestamp"}}, "avg":{"$avg": chosenSensor}}}])

然而,我得到的是:

{'_id': {'year': 2017, 'month': 4}, 'avg': 0.0}
{'_id': {'year': 2017, 'month': 3}, 'avg': 0.0}
{'_id': {'year': 2017, 'month': 2}, 'avg': 0.0}
{'_id': {'year': 2016, 'month': 12}, 'avg': 0.0}
{'_id': {'year': 2017, 'month': 1}, 'avg': 0.0}
{'_id': {'year': 2016, 'month': 11}, 'avg': 0.0}

根据此传感器的值,平均操作每次都给出0.0,这是不可能的。

另一件事是:选择传感器我使用的循环可能不是很干净,因为我需要对每个传感器进行一次平均查询。这跟我想的一样糟糕吗?还有什么选择可以做到这一点吗?

Neil Lunn在之前的一个问题中告诉我这个问题并提出了一些解决方案:at the end of the question and in the second comment。但老实说,我不明白他的建议。

0 个答案:

没有答案