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); } }
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; } }
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; }
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; }