public static Tuple<ConstructGen<double>, int, DateTime> TransformToCompoChartDataAndShift(DataAroundEvent[] data_, int numberAroundEvents_, DataAroundEventField field_) { ConstructGen<double> ret = new ConstructGen<double>(numberAroundEvents_ + 1); ret.ColumnHeadings = new string[ret.ArrayLength]; //ret.ColumnHeadings[0] = DateTime.Today.ToString("dd-MMM-yyyy"); for (int i = 0; i <= numberAroundEvents_; ++i) { ret.ColumnHeadings[i] = i.ToString(); } var headings = new List<string>(ret.ColumnHeadings); int dayShift=0; DateTime closestEvent=DateTime.MinValue; if (data_ != null) { var eventdates = data_.Select(d => d.EventDate).ToArray(); // first find out any events falls within next 15 days var maxAllowEventDate = DateTime.Today.AddDays(numberAroundEvents_); var includeEvents = eventdates .Where(newEvent => newEvent >= DateTime.Today && newEvent <= maxAllowEventDate); if (includeEvents.Any()) { closestEvent = includeEvents.OrderBy(e => e).First(); dayShift = (int)(closestEvent -DateTime.Today).TotalDays; int firstDataIndex = numberAroundEvents_ - dayShift; foreach (var eve in data_.OrderBy(x => x.EventDate)) { // initialise to NaN ret.SetValues(eve.EventDate, Utils.GetArrayOfValue<double>(double.NaN, ret.ArrayLength)); var subData = eve[field_]; if (subData != null) for (int i = 0; i <= numberAroundEvents_; i++) { if (firstDataIndex + i > subData.Data.Length -1) continue; if (subData.Data[firstDataIndex+i] == null) continue; ret.SetValue(eve.EventDate, i, subData.Data[firstDataIndex+i].Value); } } } } return new Tuple<ConstructGen<double>, int, DateTime>(ret, dayShift, closestEvent); }
public static ConstructGen<double> TransformToCon(DataAroundEvent[] data_, int numberAroundEvents_, DataAroundEventField field_) { ConstructGen<double> ret = new ConstructGen<double>((numberAroundEvents_ * 2) + 1); ret.ColumnHeadings = new string[ret.ArrayLength]; ret.ColumnHeadings[numberAroundEvents_] = "0"; for (int i = 1; i <= numberAroundEvents_; ++i) { ret.ColumnHeadings[numberAroundEvents_ - i] = (-i).ToString(); ret.ColumnHeadings[numberAroundEvents_ + i] = i.ToString(); } var headings = new List<string>(ret.ColumnHeadings); if(data_!=null) foreach (var eve in data_.OrderBy(x => x.EventDate)) { // initialise to NaN ret.SetValues(eve.EventDate, Utils.GetArrayOfValue<double>(double.NaN, ret.ArrayLength)); var subData = eve[field_]; if(subData!=null) foreach (var point in subData.Data) { if (point == null) continue; var index = headings.IndexOf((point.Index - data_.First().Offset).ToString()); ret.SetValue(eve.EventDate, index, point.Value); } } return ret; }