我有一组有两点的数据; “瓦特”和时间戳。
每个数据点间隔1秒。
所以它看起来像这样:
0:01 100
0:02 110
0:03 133
0:04 280
.....
数据集只有几个小时。
我想写一个查询,我可以找到不同时间段(5秒,1分钟,5分钟,20分钟等)的最大平均功率。
我还想知道数据集中的最大平均值发生在哪里。
修改
我想我需要用移动平均线和相应的桶(比如说10秒)进行查询。一旦我得到了这个结果,我就会查询它以找到最大值
答案 0 :(得分:2)
试试这个(我使用Linqpad,C#语句):
var rnd = new Random();
// Create some data.
var tw = Enumerable.Range(0, 3600)
.Select(i => Tuple.Create(new TimeSpan(0, 0, i), rnd.Next(1000))).ToList();
// The query.
int secondsPerInterval = 10;
var averages =
tw.GroupBy(t => (int) (t.Item1.TotalSeconds/secondsPerInterval) + 1)
.Select(g => new
{
Seconds = g.Key * secondsPerInterval,
Avg = g.Average(t => t.Item2)
})
.ToList();
var max = averages.Where(tmp => tmp.Avg == averages.Max(tmp1 => tmp1.Avg));
max.Dump();
诀窍是将您的时间跨度按TotalSeconds的整数部分除以所需的间隔长度。
你可以做tw.AsParallel().GroupBy...
,但如果你通过并行化开销比你获得的更多,那么你应该进行基准测试。
答案 1 :(得分:1)
好吧,一个在工作的人帮助了我。这是LINQ Pad的答案。
var period = 10;
var rnd = new Random();
// Create some data.
var series = Enumerable.Range(0, 3600)
.Select(i => Tuple.Create(new TimeSpan(0, 0, i), rnd.Next(300))).ToList();
var item = Enumerable.Range(0, 3600).AsParallel()
.Select(i => series.Skip(i).Take(10))
.Select((e, i) => new { Average = e.Sum(x => x.Item2) / e.Count(), Second = i })
.OrderByDescending(a => a.Second).Dump();
item.First().Dump();
答案 2 :(得分:0)
试试这个(未经测试):
for (int i = 0; i < = dataList.count ; i = i + (TimePeriod))
(from p in dataList.Skip(i).Take(TimePeriod) select p).Average(s => s.Watts)