2016-08-12 3 views
0
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.1m, Date = new DateTime(2016, 2, 2) }, 
     new History() {Symbol="a", Close = 1.4m, Date = new DateTime(2016, 2, 3) }, 
     new History() {Symbol="a", Close = 1.7m, Date = new DateTime(2016, 2, 4) }, 
     new History() {Symbol="a", Close = 1.8m, Date = new DateTime(2016, 2, 5) }, 
     new History() {Symbol="a", Close = 1.0m, Date = new DateTime(2016, 2, 7) }, 
     new History() {Symbol="a", Close = 1.1m, Date = new DateTime(2016, 2, 8) }, 
     new History() {Symbol="a", Close = 1.4m, Date = new DateTime(2016, 2, 9) }, 
     new History() {Symbol="a", Close = 1.7m, Date = new DateTime(2016, 2, 10) }, 
     new History() {Symbol="a", Close = 1.8m, Date = new DateTime(2016, 2, 11) }, 

     new History() {Symbol="b", Close = 1.6m, 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.4m, Date = new DateTime(2016, 2, 3) }, 
     new History() {Symbol="b", Close = 1.8m, Date = new DateTime(2016, 2, 4) }, 
     new History() {Symbol="b", Close = 1.2m, Date = new DateTime(2016, 2, 5) }, 
     new History() {Symbol="b", Close = 2.0m, Date = new DateTime(2016, 2, 7) }, 
     new History() {Symbol="b", Close = 1.4m, Date = new DateTime(2016, 2, 8) }, 
     new History() {Symbol="b", Close = 1.4m, Date = new DateTime(2016, 2, 9) }, 
     new History() {Symbol="b", Close = 1.0m, Date = new DateTime(2016, 2, 10) }, 
     new History() {Symbol="b", Close = 2.8m, Date = new DateTime(2016, 2, 11) }, 

     new History() {Symbol="c", Close = 2.0m, Date = new DateTime(2016, 2, 1) }, 
     new History() {Symbol="c", Close = 2.1m, Date = new DateTime(2016, 2, 2) }, 
     new History() {Symbol="c", Close = 1.4m, Date = new DateTime(2016, 2, 3) }, 
     new History() {Symbol="c", Close = 2.7m, Date = new DateTime(2016, 2, 4) }, 
     new History() {Symbol="c", Close = 1.2m, Date = new DateTime(2016, 2, 5) }, 
     new History() {Symbol="c", Close = 1.3m, Date = new DateTime(2016, 2, 7) }, 
     new History() {Symbol="c", Close = 2.2m, Date = new DateTime(2016, 2, 8) }, 
     new History() {Symbol="c", Close = 1.3m, Date = new DateTime(2016, 2, 9) }, 
     new History() {Symbol="c", Close = 2.6m, Date = new DateTime(2016, 2, 10) }, 
     new History() {Symbol="c", Close = 1.9m, Date = new DateTime(2016, 2, 11) }, 
    }; 

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

2016, 2, 5에서 Symbol="a"의 오일 표준 편차 등 Vol입니다 C#을 LINQ에서 이전 데이터에 대한 기능과 관련된 새 항목을 만들하는 방법 close2016, 2, 1 ~ 2016, 2, 5이고 처음 4 일 Vol (예 : 2016, 2, 1 ~ 2016, 2, 4)이 기본값 인 Vol = 0입니다.내가 여기 <code>Vol</code></p> <pre><code>select new { Symbol, Close, Date, Vol}; </code></pre> <p>같은 새로운 목록을 생성 할

예상 출력 :

List<dynamic> NewData = new List<dynamic> 
{ 
     new History() {Symbol="a", Close = 1.0m, Date = new DateTime(2016, 2, 1), Vol = 0 }, 
     new History() {Symbol="a", Close = 1.1m, Date = new DateTime(2016, 2, 2), Vol = 0 }, 
     new History() {Symbol="a", Close = 1.4m, Date = new DateTime(2016, 2, 3), Vol = 0 }, 
     new History() {Symbol="a", Close = 1.7m, Date = new DateTime(2016, 2, 4), Vol = 0 }, 
     new History() {Symbol="a", Close = 1.8m, Date = new DateTime(2016, 2, 5), Vol = SD(XXX) }, 
     new History() {Symbol="a", Close = 1.0m, Date = new DateTime(2016, 2, 7), Vol = SD(XXX) }, 
           ...... 

}; 
당신은 simplely 십일의 합을 말하고, 주어진 함수로 SD(xxx) 간주 할 수 있지만 실제로 여기 ten을하기 때문에 하나 하나 inputing 방법을 사용하지 않는

대규모로 대체 될 수있다 큰 데이터의 번호. 또한, SD 경우

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

내가 무엇을 할 sould 형태

다음입니다 ?

답변

1

나는 당신을 올바르게 이해했는지 모르겠지만 당신이 그런 것을 찾고 있다고 생각합니다. (간단히하기 위해 StdDev 함수를 Average 함수로 대체했습니다.)

int dayspan = 5; 
var result = from history in data 
    let lastCloses = 
      from history1 in data 
      where history.Symbol == history1.Symbol 
       && history.Date >= history1.Date 
       && history.Date - history1.Date <= TimeSpan.FromDays(dayspan) 
      select history1.Close 
    select new { 
     Symbol = history.Symbol, 
     Close = history.Close, 
     Date = history.Date, 
     Vol = lastCloses.Count() >= dayspan ? lastCloses.Average() : 0}; 

UPDATE :

당신이 날짜에 의존하는 대신에 당신은 LINQ 쿼리 구문하지만 Linq에 메서드 구문 사용할 수 없습니다 목록 위치를 사용할 수없는 경우를 들어

int dayspan = 5; 

var result = data.Select(
    delegate(History history, int index) 
    { 
     decimal[] vol = data 
       .Select((history1, index1) => new {History = history1, Index = index1}) 
       .Where(x => x.Index <= index 
        && index - x.Index < dayspan 
        && x.History.Symbol == history.Symbol) 
       .Select(x => x.History.Close).ToArray(); 
     return new 
     { 
      Symbol = history.Symbol, 
      Close = history.Close, 
      Date = history.Date, 
      Vol = vol.Count() == dayspan ? vol.Average() : 0 
     }; 
    }); 

을 가독성의 이유 어쩌면 Linq 대신이 문제를 해결하기 위해 간단한 루프를 사용하는 것이 더 좋습니다 :-)

+0

여기서 날짜는 자연스러운 달력 일이 아니므로 '역사. 날짜 - 기록. 날짜 <시간 = 시간 pan.FromDays (dayspan)'이 정확하지 않을 수 있습니다. 죄송합니다. 저는 LINQ에서 신선한 상태입니다. – user6703592