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); }
internal void Apply(DataAroundEvent[] data_) { try { chartScaleLimit = 0.0; // recent { scsRecent.ClearData(); var recentEvents = data_.GroupBy(d => d.EventDate).Select(g => new DataAroundEvent(g.First().EventDate, g.Select(x => x.Instrument).Aggregate((a, b) => a + "\n" + b), g.First().RawData, g.First().NumPointsAroundEvent, g.Select(x => x.EventCode).Aggregate((a, b) => a + "\n" + b))) .OrderByDescending(x => x.EventDate) .Where(ev => ev.EventDate <= DateTime.Today.AddDays(m_displayOptions.NumberOfRecentQuartersToShow)) .Take(m_displayOptions.NumberOfRecentEventsToShow).ToArray(); scsRecent.ApplyData(recentEvents, m_displayOptions.NumberOfPointsAroundEvent, m_displayOptions.FieldToShow); scsRecent.SetupForDataType(m_displayOptions.FieldToShow); scsRecent.ApplyStats(recentEvents, m_displayOptions.NumberOfPointsAroundEvent, m_displayOptions.FieldToShow); updateRecentChartSeries(); } // quarters { scsQuarterly.ClearData(); var quarters = data_.Select(x => getQuarterEnd(x.EventDate)).Distinct().OrderByDescending(x => x).ToList(); quarters = quarters.Count > m_displayOptions.NumberOfRecentQuartersToShow ? quarters.Take(m_displayOptions.NumberOfRecentQuartersToShow).ToList() : quarters; foreach (var quarterEnd in quarters) { var des = data_.Where(x => quarterEnd == getQuarterEnd(x.EventDate)).OrderBy(x => x.EventDate).ToArray(); var con = Helper.TransformToCon(des, m_displayOptions.NumberOfPointsAroundEvent, m_displayOptions.FieldToShow); double[] avgs = new double[con.ArrayLength]; for (int i = 0; i < avgs.Length; ++i) { var validNumberSeries = con.GetColumnValues(i).Where(x => double.IsNaN(x) == false); if (!validNumberSeries.Any()) continue; avgs[i] = validNumberSeries.ToArray().Average(); } scsQuarterly.ApplyData(getQuarterHeading(quarterEnd), con.ColumnHeadings, avgs); } scsQuarterly.SetupForDataType(m_displayOptions.FieldToShow); } // year-on-year { scsYearly.ClearData(); var years = data_.Select(x => x.EventDate.Year).Distinct().OrderByDescending(x => x).ToList(); // going to use -1 for 'all' if (m_displayOptions.AddLineForAllToYearly) years.Add(-1); var currentYearlyProbComboText = cmbYearlyProb.Text; m_reloadingCombo = true; cmbYearlyProb.Items.Clear(); cmbYearlyProb.Items.Add("None"); m_yearlyProbs.Clear(); foreach (var year in years) { // default combo to last year if not previously set if (string.Compare(string.Empty, currentYearlyProbComboText) == 0) currentYearlyProbComboText = year.ToString(); var yearString = year == -1 ? "All" : year.ToString(); cmbYearlyProb.Items.Add(yearString); // get dataaroundevent that is within this year var des = year == -1 ? data_ : data_.Where(x => x.EventDate.Year == year).OrderBy(x => x.EventDate).ToArray(); var con = Helper.TransformToCon(des, m_displayOptions.NumberOfPointsAroundEvent, m_displayOptions.FieldToShow); var conForProbability = Helper.TransformToCon(des, m_displayOptions.NumberOfPointsAroundEvent, DataAroundEventField.RawDataAroundEvent_Diffs); double[] avgs = new double[con.ArrayLength]; double[] yearlyProbs = new double[conForProbability.ArrayLength]; for (int i = 0; i < avgs.Length; ++i) { var validNumberSeries = con.GetColumnValues(i).Where(x => double.IsNaN(x) == false); if (!validNumberSeries.Any()) continue; avgs[i] = validNumberSeries.ToArray().Average(); { var alldiffs = conForProbability.GetColumnValues(i).Where(x => double.IsNaN(x) == false).ToList(); yearlyProbs[i] = ProbabilityCalc.CalcProb(alldiffs, m_displayOptions.ProbCalcMethod); } } m_yearlyProbs.Add(yearString, new Tuple<string[], double[]>(conForProbability.ColumnHeadings, yearlyProbs)); scsYearly.ApplyData(yearString, con.ColumnHeadings, avgs); } m_lastLoadedMaxProbability = ProbabilityCalc.GetMaxValue(m_displayOptions.ProbCalcMethod); // re-set the selected combobox to its original value if it's there if (!string.IsNullOrEmpty(currentYearlyProbComboText)) { for (int i = 0; i < cmbYearlyProb.Items.Count; ++i) if (string.Compare(currentYearlyProbComboText, cmbYearlyProb.Items[i].ToString()) == 0) { cmbYearlyProb.SelectedIndex = i; break; } } m_reloadingCombo = false; reloadYearlyProbability(); scsYearly.SetupForDataType(m_displayOptions.FieldToShow); } // current vs hist chart BuildCurrentVsHistchart(data_); // hist chart // filter n/a for chart series var rawData = data_.First().EODData ?? data_.First().RawData; var filteredData = rawData.Dates.Where(d => !double.IsNaN(rawData.ValueOnDate(d))) .Select(date => new { d = date, data = rawData.ValueOnDate(date) }).ToArray(); if (filteredData.Any()) { var filteredSeries = new DatedDataCollectionGen<double>(filteredData.Select(x => x.d).ToArray(), filteredData.Select(x => x.data).ToArray()); AddChartSeries(filteredSeries, "Time Series"); var eventdates = data_.Select(d => new {d.EventCode, d.EventDate}).ToArray(); var eventGroup = eventdates.GroupBy(ev => ev.EventCode).ToArray(); var eventDateList = eventGroup.Select(g => g.Select(x => x.EventDate).ToArray()).ToList(); var desc = eventGroup.Select((g,i) => string.IsNullOrEmpty(g.Key) ? "test"+ i+1 : g.Key).ToArray(); EventHistChart.SetScatterValues(eventDateList, desc); //AddScatterSeries(eventdates, eventdates.Select(x => data_.First().RawData.ValueOnDate(x)).ToArray(), "Events", Color.GreenYellow, 40, "##0.000", null, Infragistics.UltraChart.Shared.Styles.NullHandling.DontPlot, null, SymbolIcon.Triangle); } // scale y-axis { var ctrls = new[] {scsRecent.Chart, scsYearly.Chart, scsQuarterly.Chart, scsHistVsCurrent.Chart}; Rescale(ctrls); } } catch (Exception ex_) { Logger.Error("Error loading charts", typeof (SeasonalityCharts), ex_); } }