Example #1
0
        public ActionResult BatchResults(int cat = 50)
        {
            Logging.Debug("Entered BatchResults");
            var model = new ChartViewModel();
            model.ChartData = "";

            try
            {
                var tasks = repository.ToList();

                Logging.Debug("Tasks length:{0}", tasks.Count());

                var values = new List<Forecast>();

                foreach (var task in tasks)
                {
                    Logging.Debug("Start task {0}", task);
                    var forecast = task.Forecasts.FirstOrDefault();
                    Logging.Debug("Forecast result error: {0}", forecast.Error);
                    if (forecast.Error.HasValue && !double.IsNaN(forecast.Error.Value))
                    {
                        values.Add(forecast);
                    }
                }

                Logging.Debug("Foreach finished");
                var errors = values.Select(x => x.Error.Value);
                var minError = errors.Min();
                if (double.IsNaN(minError)) minError = 0;
                var maxError = errors.Max();
                var gap = (maxError - minError) / cat;

                Logging.Debug("Start bucketing");

                var buckets = new int[cat];
                foreach (var value in values)
                {
                    var bucket = gap > 0 ? (int)Math.Floor((value.Error.Value - minError) / gap) : 0;
                    if (bucket == cat) bucket--;
                    buckets[bucket]++;
                }

                var result = new List<dynamic>();
                int i = 0;
                double lowerBound = 0;
                double upperBound = 0;
                Logging.Debug("starting foreach");
                foreach (var q in buckets)
                {
                    Logging.Debug("Bucket {0}", q);
                    i++;
                    dynamic value = new ExpandoObject();

                    upperBound = minError + i * gap;
                    value.Error = String.Format("{0} - {1}", (lowerBound / 100).ToString("00.0000"), (upperBound / 100).ToString("00.0000"));
                    lowerBound = upperBound;

                    value.Quantity = q;
                    result.Add(value);
                }

                Logging.Debug("Finished bucketing");

                model.ChartData = JsonConvert.SerializeObject(result);

                return View(model);
            }

            catch (Exception e)
            {
                return Content(e.Message);
            }
        }
Example #2
0
        private ChartViewModel GetTrustIndexChart(string id, out List<Tuple<DateTime, int>> winnerModels)
        {
            winnerModels = new List<Tuple<DateTime, int>>();
            var model = new ChartViewModel();
            model.ChartName = "Trust Index model";

            try
            {
                var forecasts = repository.FirstOrDefault(x => x.MeasurementId == id).Forecasts;
                var startForecastingDate =
                    forecasts.Select(x => x.Results.FirstOrDefault(r => r.PredictedValue != null).TimeStamp).Max();
                    //дата, начиная с которой будем использовать метод trust index

                var lastDate = forecasts[0].Results.LastOrDefault().TimeStamp;
                var startTestDate = testStartDateProvider.GetTimestampOfTestStart(lastDate);
                startForecastingDate = startForecastingDate.AddHours(12).Date; //округляем до ближайшего дня

                var values = new List<ForecastResult>();
                values.AddRange(forecasts[0].Results.TakeWhile(x => x.TimeStamp < startForecastingDate).Select(x =>
                    {
                        x.PredictedValue = null;
                        return x;
                    }));

                var forecastResults = forecasts.Select(x => x.Results.SkipWhile(y => y.TimeStamp < startForecastingDate).ToList()).ToList();

                var trustIndexDict = new Dictionary<int, int>();
                for (int i = 0; i < forecastResults.Count(); i++)
                {
                    trustIndexDict.Add(i, 0);
                }

                var currentDay = startForecastingDate.AddDays(1);

                var errorSum = 0.0;
                var counter = 0;

                while (currentDay.Date <= lastDate.AddDays(1))
                {
                    var innerCurrentDay = currentDay;
                    var nextDay = forecastResults.Select(x => x.TakeWhile(r => r.TimeStamp < innerCurrentDay).ToList()).ToList();
                    forecastResults = forecastResults.Select(x => x.SkipWhile(r => r.TimeStamp < innerCurrentDay).ToList()).ToList();
                    var errors = nextDay.Select(x => CalculateMAPE(x)).ToList();
                    var minError = errors.Min();
                    var winningModelIndex = errors.FindIndex(x => x == minError);
                    trustIndexDict[winningModelIndex]++;

                    var mostTrustedModelIndex = trustIndexDict.FirstOrDefault(x => x.Value == trustIndexDict.Max(y => y.Value)).Key;
                    winnerModels.Add(new Tuple<DateTime, int>(innerCurrentDay.AddDays(-1), mostTrustedModelIndex));

                    values.AddRange(nextDay[mostTrustedModelIndex]);

                    if (currentDay >= startTestDate)
                    {
                        counter++;
                        errorSum += minError;
                    }

                    currentDay = currentDay.AddDays(1);
                }

                model.ChartData = JsonConvert.SerializeObject(GetValuesForChart(values));
                model.Error = CalculateMAPE(values.SkipWhile(x => x.TimeStamp < startTestDate));

                return model;
            }
            catch (Exception)
            {

                throw;
            }
        }
Example #3
0
        private ChartViewModel GetWinnerModelsChart(List<Tuple<DateTime, int>> winnerModels)
        {
            var model = new ChartViewModel();
            model.ChartName = "Winner models chart";

            var values = new List<dynamic>();

            foreach (var winner in winnerModels)
            {
                dynamic value = new ExpandoObject();
                value.TimeStamp = winner.Item1;
                value.ValueReal = winner.Item2;

                values.Add(value);
            }

            model.ChartData = JsonConvert.SerializeObject(values);

            return model;
        }
Example #4
0
        private ChartViewModel GetChart(Forecast forecast)
        {
            var model = new ChartViewModel();
            model.ChartName = forecast.ForecastModelId;

            var results = forecast.Results;
            var values = GetValuesForChart(results);

            model.ChartData = JsonConvert.SerializeObject(values);
            var lastDate = forecast.Results.LastOrDefault().TimeStamp;
            //lastDate = lastDate.AddHours(12).Date; //округляем до ближайшего дня
            model.Error = CalculateMAPE(forecast.Results.SkipWhile(x => x.TimeStamp < testStartDateProvider.GetTimestampOfTestStart(lastDate)));

            return model;
        }