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)); }
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); }
/// <summary> /// Update data in specified chart controll /// </summary> /// <param name="chart">Chart, which need to update</param> /// <param name="data">New data</param> public static void RefreshForecastChart(LiveCharts.WinForms.CartesianChart chart, FResult data) { Dictionary <string, List <double> > lines = new Dictionary <string, List <double> > { { "Forecast points", Enumerable.Repeat(double.NaN, data.TimeSeriesPoints.Count).ToList() }, { "Lo 80", Enumerable.Repeat(double.NaN, data.TimeSeriesPoints.Count).ToList() }, { "Hi 80", Enumerable.Repeat(double.NaN, data.TimeSeriesPoints.Count).ToList() }, { "Lo 95", Enumerable.Repeat(double.NaN, data.TimeSeriesPoints.Count).ToList() }, { "Hi 95", Enumerable.Repeat(double.NaN, data.TimeSeriesPoints.Count).ToList() }, { "Time Series", data.TimeSeriesPoints } }; int count = 0; for (int i = 0; i < data.ResultDataFrame.Data[0].Count; i++) { for (int j = 0; j < data.ResultDataFrame.Data.Count; j++) { if (count == 0) { lines["Forecast points"].Add(Convert.ToDouble(data.ResultDataFrame.Data[j][i])); } else if (count == 1) { lines["Lo 80"].Add(Convert.ToDouble(data.ResultDataFrame.Data[j][i])); } else if (count == 2) { lines["Hi 80"].Add(Convert.ToDouble(data.ResultDataFrame.Data[j][i])); } else if (count == 3) { lines["Lo 95"].Add(Convert.ToDouble(data.ResultDataFrame.Data[j][i])); } else if (count == 4) { lines["Hi 95"].Add(Convert.ToDouble(data.ResultDataFrame.Data[j][i])); } count++; if (count == 5) { count = 0; } } } List <SeriesOption> lineOptions = lines.Select((line) => new SeriesOption { Title = line.Key, Values = line.Value }).ToList(); lineOptions.Where(line => line.Title.Equals("Forecast points")) .ToList() .ForEach(line => { line.IsDashed = true; line.PointGeometry = DefaultGeometries.Diamond; }); lineOptions.Where(line => line.Title.Equals("Time Series")) .ToList() .ForEach(line => { line.LineColor = Brushes.Black; }); chart.Series = CreateSeriesCollection(lineOptions); }
/// <summary> /// this is the recommended constructor. Use others if you know what you're doing. /// </summary> public FAIStimulus(UAISense sense, float stimulusStrength, FVector inStimulusLocation, FVector inReceiverLocation, FResult result, string inStimulusTag) : base(E_CreateStruct_FAIStimulus_UAISense_float_FVector_FVector_FResult_FName(sense, stimulusStrength, inStimulusLocation, inReceiverLocation, (byte)result, inStimulusTag), false) { }
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; } }