public override async Task <FResult> Forecast(List <double> data, int lead, string savePlot, int frequency, int plotWidth, int plotHeight) { var returnData = new FResult(); var template = $@" data <- ts(data, {(frequency > 0 ? $"frequency = {frequency}" : "")}) forec <- holt(data,h={lead}) "; returnData = await IBasicMethod.Forecast(returnData, data, template, savePlot, plotWidth, plotHeight); return(returnData); }
public async Task <ActionResult> Result(ForecastingRequest request) { ForecastingResult dataResult = new ForecastingResult(); List <double> items = null; using (var db = new dbContext()) { items = db.Sales_Histories.Where(x => x.Entry_No >= request.From && x.Entry_No <= request.To).OrderBy(x => x.Entry_No).Select(x => (double)x.Sales_Quantity).ToList(); } IBasicMethod method = null; foreach (var cMethod in methods) { if (cMethod.GetMethodName() == request.Method) { method = cMethod; } } if (method == null) { dataResult.Error = "Couldn't found method that you need!"; return(View(dataResult)); } FResult result = null; var imageName = Guid.NewGuid().ToString(); var dir = Server.MapPath("/Images"); var imageFileName = Path.Combine(dir, imageName + ".png"); dataResult.Image = imageName; try { result = await method.Forecast(items, request.Count, imageFileName, request.Periodicity, request.ImageWidth, request.ImageHeight); } catch (Exception ex) { dataResult.Error = "Unknown error appeared while trying to forecast data"; return(View(dataResult)); } if (result.Data != null) { dataResult.ForecastData = result.Data; dataResult.Low80Data = result.Low80; dataResult.High80Data = result.High80; dataResult.Low95Data = result.Low95; dataResult.High95Data = result.High95; dataResult.Error = ""; } else { dataResult.Error = result.Error; } return(View(dataResult)); }
static Forecast_Method GetForecastMethodSetup(IBasicMethod method) { using (var db = new dbContext()) { var setup = db.Forecast_Methods.First(x => x.Code == method.GetMethodName()); if (setup == null) { setup = new Forecast_Method(); setup.Code = method.GetMethodName(); db.Forecast_Methods.Add(setup); db.SaveChanges(); } return(setup); } }
public override async Task <FResult> Forecast(List <double> data, int lead, string savePlot, int frequency, int plotWidth, int plotHeight) { var returnData = new FResult(); if (frequency <= 1) { returnData.Error = "Period should be higher than 1"; return(returnData); } var template = $@" data <- ts(data, frequency = {frequency}) forec <- hw(data,h={lead}) "; returnData = await IBasicMethod.Forecast(returnData, data, template, savePlot, plotWidth, plotHeight); return(returnData); }
private async void button2_Click(object sender, EventArgs e) { if (comboBox1.SelectedIndex == -1) { MessageBox.Show("Please, select fitting method to use!"); return; } if (comboBox1.SelectedIndex > availableMethods.Count) { MessageBox.Show("Method currently not available!"); return; } int days; var ok = int.TryParse(textBox1.Text, out days); int count; var ok2 = int.TryParse(textBox2.Text, out count); int period; var ok3 = int.TryParse(textBox3.Text, out period); if (!ok || !ok2 || days <= 0 || count <= 0 || (ok3 && period < 0)) { MessageBox.Show("Invalid count!"); return; } List <double> items = null; using (var db = new dbContext()) { /*items = db.Sales_Histories * .OrderByDescending(u => u.Entry_No) * .Take(days) * .OrderBy(u => u.Entry_No) * .Select(x => (double)x.Sales_Quantity) * .ToList();*/ items = db.Sales_Histories .GroupBy(x => x.Invoice_Date) .OrderByDescending(x => x.Key) .Take(days) .OrderBy(x => x.Key) .Select(x => x.Select(o => (double)o.Sales_Quantity).ToList().Sum()) .ToList(); } IBasicMethod method = availableMethods[comboBox1.SelectedIndex]; if (!ok3) { period = 0; } FResult result = null; if (items.Count != days) { textBox1.Text = items.Count.ToString(); } var filepath = Directory.GetCurrentDirectory() + "\\result.png"; try { result = await method.Forecast(items, count, filepath, period, 1920, 1080); } catch (Exception ex) { Console.WriteLine(ex); MessageBox.Show("Unknown error appeared while trying to forecast data " + ex.Message); return; } if (result.Data == null) { MessageBox.Show(result.Error); } else { pictureBox1.ImageLocation = filepath; dataGridView1.Columns.Clear(); dataGridView1.Columns.Add("Value", "Value"); dataGridView1.Rows.Clear(); foreach (var item in result.Data) { dataGridView1.Rows.Add(new object[] { item }); } ChartService.RefreshForecastChart(testChart, result); testChart.Zoom = ZoomingOptions.Xy; testChart.LegendLocation = LegendLocation.Left; } }