我正在尝试建模并适应长时间序列中的噪声数据,如果我删除了大量的数据,我想看看我的拟合会发生什么。
我有很长的时间序列数据,我只对每个第n项感兴趣。但是我仍然希望随着时间的推移绘制这个列表,但是删除了所有其他不需要的元素。
例如,对于n = 4,列表
a = [1,2,3,4,5,6,7,8,9,10...]
应该成为
a_new = [1,0,0,0,5,0,0,0,9,0...]
我不介意第n项的位置是否在序列的开头或结尾,我的系列实际上是任意的,并且很长以至于我删除的内容都无关紧要。例如'a_new'也可以是:
a_new = [0,0,0,4,0,0,0,8,0,0...]
理想情况下,解决方案不依赖于列表的长度,但我可以将该长度作为变量。
编辑1:
我实际上想要空元素,而不是零,(如果可能的话?)所以:
a_new = [1,,,,5,,,,9...]
编辑2:
我还需要从时间序列中删除相应的元素,以便在绘制所有内容时,每个数据元素都与时间序列元素具有相同的索引。
谢谢!
答案 0 :(得分:5)
将列表理解与ternary conditional一起使用mod
上每个元素的n
:
>>> a = [1,2,3,4,5,6,7,8,9,10]
>>> n = 4
>>> [i if i % n == 0 else 0 for i in a]
[0, 0, 0, 4, 0, 0, 0, 8, 0, 0]
如果数据没有以递增的方式继续进行(最有可能),请使用enumerate
,以便mod
采用索引,而不是元素:
>>> [v if i % n == 0 else 0 for i, v in enumerate(a)]
[1, 0, 0, 0, 5, 0, 0, 0, 9, 0]
使用enumerate
:
>>> [v if i % n == 0 else 0 for i, v in enumerate(a, 1)] # start indexing from 1
[0, 0, 0, 4, 0, 0, 0, 8, 0, 0]
如果您打算删除您不需要的数据而不是替换它们,那么在列表理解中使用if
(而不是三元运算符)的过滤器可以处理这个:
>>> [v for i, v in enumerate(a, 1) if i % n == 0]
[4, 8]
答案 1 :(得分:0)
[0 if i%4 else num for i, num in enumerate(a)]
答案 2 :(得分:0)
这是一个在给定某个步骤K过滤函数的工作示例:
6642
输出:
app.get('/api/:name', function(req, res){
var name = req.params.name;
var query = [{$match: {'name': name}}, {$unwind: { path: "$dates", includeArrayIndex: "idx" } }, { $project: { _id: 0, dates: 1, numbers: { $arrayElemAt: ["$numbers", "$idx"] }, goals: { $arrayElemAt: ["$goals", "$idx"] }, durations: { $arrayElemAt: ["$durations", "$idx"]}}}];
db.collection('coll').aggregate(query).toArray(function(err, docs) {
if (err) {
assert.equal(null);
}
else {
console.log(docs);
res.json(docs);
}
});
})