2016-08-12 16 views
1
List<History> data = new List<History>(){ 
new History() {Symbol="a", Close = 1.0m, Date = new DateTime(2016, 2, 1) }, 
new History() {Symbol="a", Close = 1.2m, Date = new DateTime(2016, 2, 2) }, 
new History() {Symbol="a", Close = 1.3m, Date = new DateTime(2016, 2, 3) }, 
new History() {Symbol="b", Close = 1.2m, Date = new DateTime(2016, 2, 1) }, 
new History() {Symbol="b", Close = 1.2m, Date = new DateTime(2016, 2, 2) }, 
new History() {Symbol="b", Close = 1.3m, Date = new DateTime(2016, 2, 3) }, 
}; 

var StockGroupList = data 
.GroupBy(o => o.Symbol) 
.OrderBy(o => o.Key) 
.ToList(); 

に対する機能に関連する新しいアイテムを作成します2016, 2, 3Symbol="a"の2日間の標準偏差などVolはの関数でありますclose,2016, 2, 3および2016, 2, 2。さらに、最初の日のVol(例えば2016, 2, 1)は、デフォルトではVol = 0である。C#のLINQは、私がここで</p> <pre><code>select new { Symbol, Close, Date, Vol}; </code></pre> <p><code>Vol</code>のような新しいリストを作成したい以前のデータ

予想される出力:

List<dynamic> NewData = new List<dynamic> 
{ 
new { Symbol = "a", Close = 1.0m, Date = new DateTime(2016, 2, 1), Vol = 0 }, 
new { Symbol = "a", Close = 1.0m, Date = new DateTime(2016, 2, 2), Vol = SD(Close of 2016, 2, 1, Close of 2016, 2, 2) }, 
new { Symbol = "a", Close = 1.0m, Date = new DateTime(2016, 2, 3), Vol = SD(Close of 2016, 2, 2, Close of 2016, 2, 3) }, 
              ...... 
}; 

あなたは、単にSD(x,y) = x+yを言って、与えられた関数としてSD(x,y)を考えることができます。 SDのパラメータがListの場合はList[Close of 2016, 2, 2, Close of 2016, 2, 3)]と表示されますが、どうすればできますか?

そしてSD場合は、フォーム

decimal OneStdDev = (decimal)(new DescriptiveStatistics(data.Select(o => (double)o.Close)).StandardDeviation); 

私は何をすべきに従っていますか?

答えて

1

この場合、グループ化する必要はないと思いますが、あなたの問題を理解すれば、現在と過去の履歴レコードの間にSDを計算します。

Linq拡張メソッドを使用してこれを行うことができます。

var results = data   
       .Take(1) 
       .Select(x=>new {x.Symbol, x.Close, x.Date, Vol = 0.0m}) 
       .Concat(data.Zip(data.Skip(1), (first,second) => 
           new 
           { 
            second.Symbol, 
            second.Close, 
            second.Date, 
            Vol = first.Close + second.Close // Use whatever logic you want. 
           } 
         )); 

出力:

Symbol =a, Close=1.0, Date=2/1/2016 12:00:00 AM, Vol = 0.0 
Symbol =a, Close=1.2, Date=2/2/2016 12:00:00 AM, Vol = 2.2 
Symbol =a, Close=1.3, Date=2/3/2016 12:00:00 AM, Vol = 2.5 
Symbol =b, Close=1.2, Date=2/1/2016 12:00:00 AM, Vol = 2.5 
Symbol =b, Close=1.2, Date=2/2/2016 12:00:00 AM, Vol = 2.4 
Symbol =b, Close=1.3, Date=2/3/2016 12:00:00 AM, Vol = 2.5 

チェックこの数が非常に大きい場合、書き込みSD` `のパラメータは前に10日間` close`あり、そして言う方法Demo

+0

最初の10日間の 'close'はデフォルトで0です。ありがとうございます。 – user6703592

+0

それはフォローアップの質問です。新しい質問を投稿することをお勧めします。問題に尋ねられた以上のものを含めると、同様の問題に遭遇する人々を混乱させる可能性があります。 –

関連する問題

 関連する問題