それは一種の可能性です。 Pandasは、これらの種類のタスク用に明示的に構築されたライブラリであり、その獣であり、MongoDBはデータベースであることが意図されていることに注意してください。ただし、補間を使用する必要性を無視すると、次のものがニーズに合う可能性が高くなります。
devices
という名前のMongoDBコレクションに次のデータが保存されていると仮定します
/* 0 */
{
"_id" : ObjectId("543fc08ccf1e8c06c0288802"),
"t" : ISODate("2014-10-20T14:56:44.097+02:00"),
"a" : "192.168.0.16",
"i" : 0,
"o" : 32
}
/* 1 */
{
"_id" : ObjectId("543fc08ccf1e8c06c0288803"),
"t" : ISODate("2014-10-20T14:56:59.107+02:00"),
"a" : "192.168.0.16",
"i" : 14243,
"o" : 8430
}
and so on...
この場合、約15秒ごとにサンプリングされますが、不規則にサンプリングされることもあります。特定の日の5分の境界にリサンプリングする場合は、次の手順を実行する必要があります。
var low = ISODate("2014-10-23T00:00:00.000+02:00")
var high = ISODate("2014-10-24T00:00:00.000+02:00")
var interval = 5*60*1000;
db.devices.aggregate([
{$match: {t:{$gte: low, $lt: high}, a:"192.168.0.16"}},
{$group: {
_id:{
$subtract: ["$t", {
$mod: [{
$subtract: ["$t", low]
}, interval]
}]
},
total: {$sum: 1},
incoming: {$sum: "$i"},
outgoing: {$sum: "$o"},
}
},
{
$project: {
total: true,
incoming: true,
outgoing: true,
incoming_avg: {$divide: ["$incoming", "$total"]},
outgoing_avg: {$divide: ["$outgoing", "$total"]},
},
},
{$sort: {_id : 1}}
])
これにより、次のようになります
{
"result" : [
{
"_id" : ISODate("2014-10-23T07:25:00.000+02:00"),
"total" : 8,
"incoming" : 11039108,
"outgoing" : 404983,
"incoming_avg" : 1379888.5,
"outgoing_avg" : 50622.875
},
{
"_id" : ISODate("2014-10-23T07:30:00.000+02:00"),
"total" : 19,
"incoming" : 187241,
"outgoing" : 239912,
"incoming_avg" : 9854.78947368421,
"outgoing_avg" : 12626.94736842105
},
{
"_id" : ISODate("2014-10-23T07:35:00.000+02:00"),
"total" : 17,
"incoming" : 22420099,
"outgoing" : 1018766,
"incoming_avg" : 1318829.352941176,
"outgoing_avg" : 59927.41176470588
},
...
着信の合計を破棄する場合は、$projectステージでラインを除外します。格納されたデータがrrdtoolがゲージに指定したもの(温度、CPU、センサーデータ)のようなものである場合、incoming_averageは平均を計算する方法の単なる例です。その時間のインバーバルで集計された合計、つまり着信フィールドと発信フィールドの後でのみ、$projectステージ全体を除外できます。時間間隔の平均を計算するためだけにあります。
ISODateの45分のチャンクへのMongo集約を参照してください