private void BuildCurrentVsHistchart(DataAroundEvent[] data_) { scsHistVsCurrent.ClearData(); lock (lockobj) { ViewModel.LiveIndex = -1; } var histAvgs = new List<double[]>(); string[] headings = null; var multiEventOrganiser = new MultiEventDisplayOrganiser(data_, m_displayOptions.NumberOfPointsAroundEvent); var repivotEvents = multiEventOrganiser.RepivotEvents; var eventGroups = repivotEvents.GroupBy(d => d.EventCode).ToArray(); int idx = 0; var offsetsToAdd = new Dictionary<string,string>(); int pivotIndex = 0; //var daysToEvent = data_.OrderBy(e => e.EventDate).FirstOrDefault(x => x.DaysToEvents.HasValue); foreach (var @group in eventGroups) { //var eventDataTup = new List<Tuple<string, DataAroundEvent[]>>(); var histEvents = @group.Where(e => e.EventDate < DateTime.Today.AddDays(-m_displayOptions.NumberOfPointsAroundEvent)).ToArray(); // eventDataTup.Add(new Tuple<string, DataAroundEvent[]>("Past Avg", histEvents)); // hist events var con = Helper.TransformToCon(histEvents, m_displayOptions.NumberOfPointsAroundEvent, m_displayOptions.FieldToShow); headings = con.ColumnHeadings; 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).ToArray(); if (!validNumberSeries.Any()) { avgs[i] = double.NaN; continue; } avgs[i] = validNumberSeries.ToArray().Average(); } if (offsetsToAdd.ContainsKey(([email protected]().Offset).ToString())) offsetsToAdd[([email protected]().Offset).ToString()] = offsetsToAdd[([email protected]().Offset).ToString()] + "\n" + @group.Key; else offsetsToAdd.Add(([email protected]().Offset).ToString(), @group.Key); histAvgs.Add(avgs); idx++; } if (headings != null) { // Hist series // average of all the hist average double[] avgs = new double[histAvgs.First().Length]; foreach (var avg in histAvgs) { for (int i = 0; i < avgs.Length; i++) { avgs[i] += avg[i]; } } var avgavg = avgs.Select(a => a/histAvgs.Count).ToArray(); scsHistVsCurrent.ApplyData("Past Avg", headings, avgavg); scsHistVsCurrent.Chart.VerticalLinesXValuesLabels = offsetsToAdd; // set seconardy y-axis var axisValues = avgavg.Where(a => !double.IsNaN(a)).ToArray(); if (axisValues.Any()) { if (m_displayOptions.YAXesSymmetric) { var largerValue = Math.Max(Math.Abs(axisValues.Max()), Math.Abs(axisValues.Min())); scsHistVsCurrent.Chart.SetSecondaryYAxis("Past Avg", largerValue, -largerValue); } else { scsHistVsCurrent.Chart.SetSecondaryYAxis("Past Avg", axisValues.Max(), axisValues.Min()); } } if (!data_.First().IsIntraday) { // Current series //var curEvents = repivotEvents.OrderBy(x => x.EventDate).FirstOrDefault(e => e.EventDate > DateTime.Today.AddDays(-m_displayOptions.NumberOfPointsAroundEvent)); var curEvents = multiEventOrganiser.MidEvent; //if (eventData.Item1 == "Current") if (curEvents != null) { // current level var currentCon = Helper.TransformToCon(new[] {curEvents}, m_displayOptions.NumberOfPointsAroundEvent, DataAroundEventField.Filled_Level); var currentPivot = currentCon.GetColumnValues(repivotEvents.First().PivotIndex).Average(); ViewModel.Pivot = currentPivot; var con = Helper.TransformToCon(new[] {curEvents}, m_displayOptions.NumberOfPointsAroundEvent, m_displayOptions.FieldToShow); if (curEvents != null) { double busday; if (curEvents.EventDate > DateTime.Today) busday = -1*(MyCalendar.NumBusinessDaysBetween(DateTime.Today, curEvents.EventDate) - 1); else busday = MyCalendar.NumBusinessDaysBetween(curEvents.EventDate, DateTime.Today) - 1; //ViewModel.PivotIndex = repivotEvents.First().PivotIndex; ViewModel.LiveIndex = m_displayOptions.NumberOfPointsAroundEvent + (int) busday; scsHistVsCurrent.ApplyData("Current", headings, con.LastValues()); } } ViewModel.Headings = headings; var todayPts = ExtensionMethods.CreateArrayRep<double>(double.NaN, headings.Length); if (ViewModel.LiveIndex > 0) { todayPts[ViewModel.LiveIndex] = avgavg[ViewModel.LiveIndex]; // mark today's point scsHistVsCurrent.ApplyScatterData("Now", headings, todayPts); var axisValues2 = avgavg.Where(a => !double.IsNaN(a)).ToArray(); if (axisValues2.Any()) { if (m_displayOptions.YAXesSymmetric) { var largerValue = Math.Max(Math.Abs(axisValues2.Max()), Math.Abs(axisValues2.Min())); scsHistVsCurrent.Chart.SetSecondaryYAxis("Now", largerValue, -largerValue); } else { scsHistVsCurrent.Chart.SetSecondaryYAxis("Now", axisValues2.Max(), axisValues2.Min()); } } } } } scsHistVsCurrent.SetupForDataType(m_displayOptions.FieldToShow); }
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; }
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_); } }