Beispiel #1
0
        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));
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        /// <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)
 {
 }
Beispiel #6
0
        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;
            }
        }