2012-01-25 16 views
3

私は2つのポイントを持つデータセットを持っています。 "ワット"とタイムスタンプ。LINQ時間スパンの最大平均を求めるクエリ

各データポイントは1秒で区切られています。

だから、次のようになります。

0:01 100 
0:02 110 
0:03 133 
0:04 280 

.....

データセットは、数時間の長さです。

私は異なる期間(5秒、1分、5分、20分、など)の最大平均ワットを見つけることができるクエリを書きたいと思います。

私はまた、最大平均が起こったデータセットのどこにいるのか知りたいと思います。

編集
私は移動平均し、適切なバケット(のは10秒としましょう)でクエリを実行する必要があると思います。私はその結果を得ると、それを照会して最大値を見つける。

答えて

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(); 
+0

この場合、AsParallel()はパフォーマンスx2を改善しました。 – Nate

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) 
+0

あなたはそれについていくつかクールなことをすることができますか? – Nate

+0

申し訳ありません私はPLINQについてよく知らないです。あなたがPLINQ – CloudyMarble

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...を行うことができますが、並列化のオーバーヘッドによって得られるよりも多くの負荷を逃した場合は、ベンチマークする必要があります。

+0

で他の答えを得ることを願っています。私はそれが最大平均を引くとは思わない。また、ローリング平均はしません。バケット10でグループ化するだけです。 – Nate

+0

私は10秒のバケットでローリング平均を計算するクエリを実行する必要があると思っています。その結果 – Nate

+0

OK、今何を意味しているのか分かります。私の答えに適応しました。私が提案する方法では、タイムスタンプ内の「穴」やその他の不規則性が許されます。あなたのアプローチはうまくいくが、データの知識が必要である。特に、 'Enumerable.Range'パーツの繰り返しは現実のシナリオでは厄介です。 –

関連する問題