Как получить недостающие значения в статистических данных? - PullRequest
0 голосов
/ 12 ноября 2011

Я пишу статистические отчеты и работаю с кучей данных, поэтому мы только получаем кусочки.Например, мы выводим объекты DateTime / Data и отслеживаем в интервалах месяцев от даты начала до даты окончания.

Проблема в том, что данные содержат только те месяцы, в которых есть данные, например, это будет толькодайте декабрь 2010 г. февраль 2011 г. и август 2011 г. Мне нужно знать, как бы я его построил, чтобы я мог поставить 0, где находятся январь 2011 г., март 2011 г. и т. д.

Может кто-нибудь дать мне представление о том, как я мог бы построить это без больших накладных расходов?Я думал о том, чтобы сначала получить цикл, затем получить необходимый интервал (например, минуты, месяцы, годы) и поместить его в список, а затем, когда я проверяю свои объекты DateTime / Data, проверяя, заменяет ли его больше 0.Также это для создания точек на графике.

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

Если это возможно, я бы посоветовал изменить хранимую процедуру и / или вызов SQL для этой процедуры и вставить недостающие данные с помощью частичных соединений (LEFT / RIGHT JOIN) и функций COALESCE / ISNULL.

Как то так:

DECLARE @range AS TABLE (datePoint DATETIME);
DECLARE @data AS TABLE (datePoint DATETIME, value INT);

-- setup date range
DECLARE @currentDatePoint AS DATETIME;
SET @currentDatePoint = '01/01/2011'
WHILE @currentDatePoint < '01/01/2012'
BEGIN
    INSERT INTO @range VALUES (@currentDatePoint);
    SET @currentDatePoint = DATEADD(MONTH, 1, @currentDatePoint);
END

-- setup test data
SET @currentDatePoint = '01/01/2011'
WHILE @currentDatePoint < '01/01/2012'
BEGIN
    INSERT INTO @data VALUES (@currentDatePoint, DATEPART(MONTH, @currentDatePoint));
    SET @currentDatePoint = DATEADD(MONTH, 2, @currentDatePoint);
END
--end setup

-- actual select
SELECT 
    r.datePoint, 
    ISNULL(d.value, 0) 
FROM 
    @range r
LEFT JOIN 
    @data d ON r.datePoint = d.datePoint
1 голос
/ 13 ноября 2011

Загрузите ваши данные в связанный список и вставьте отсутствующие точки данных:

using System;
using System.Collections.Generic;

namespace Whatever
{
  public struct DataPoint
  {
    private DateTime time;
    private int value;

    public DataPoint(DateTime time, int value)
    {
      this.time = time;
      this.value = value;
    }

    public DateTime Time
    {
      get { return this.time; }
    }

    public int Value
    {
      get { return this.value; }
    }

    public override string ToString()
    {
      return string.Format("{0:D2}/{1}: {2}", this.time.Month, this.time.Year, this.value);
    }
  }

  public static class Program
  {
    public static void Main()
    {
      // List of the datapoints, e.g. loaded from a database
      var dataPoints = new List<DataPoint>();
      dataPoints.Add(new DataPoint(new DateTime(2010, 11, 1), 10));
      dataPoints.Add(new DataPoint(new DateTime(2011,  2, 1), 20));
      dataPoints.Add(new DataPoint(new DateTime(2011,  3, 1), 30));
      dataPoints.Add(new DataPoint(new DateTime(2011,  6, 1), 40));
      dataPoints.Add(new DataPoint(new DateTime(2011,  9, 1), 50));
      dataPoints.Add(new DataPoint(new DateTime(2011, 12, 1), 60));
      dataPoints.Add(new DataPoint(new DateTime(2012,  2, 1), 70));

      // Endpoints of the measurement interval
      var begin = new DateTime(2010, 9, 1);
      var end   = new DateTime(2012, 4, 1);

      // Check each month and insert missing datapoints
      var time = begin;
      var i = 0;
      while (time <= end)
      {
        if (i < dataPoints.Count)
        {
          if (time < dataPoints[i].Time)
          {
            var dataPoint = new DataPoint(time, 0);
            dataPoints.Insert(i, dataPoint);
          }
        }
        else
        {
          var dataPoint = new DataPoint(time, 0);
          dataPoints.Add(dataPoint);
        }
        ++i;
        time = time.AddMonths(1);
      }

      // Print list
      foreach (var dataPoint in dataPoints)
        Console.WriteLine(dataPoint);
    }
  } 
}

РЕДАКТИРОВАТЬ: Если вам нужно только построить эти данные, то нет необходимости вставлять отсутствующиеТочки данных.Я бы просто интерполировал между существующими точками, я имею в виду, связывал их.Если существующие точки обозначены закрашенными кружками, то недостающие точки могут быть обозначены пустыми кружками, расположенными на этих соединительных линиях (такой элемент управления графиком может быть записан для построения точек, заданных интерполяцией, без их сохранения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...