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);
      }
示例#2
0
    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_);
          }
      }