Exemple #1
0
        public IActionResult Index()
        {
            PopulateCurrencies();

            var currencies = _currencyRateService.GetCurrencyList();
            int currency1  = currencies.First(a => a.Name == "VEF").Id;
            int currency2  = currencies.First(a => a.Name == "RSD").Id;

            var investmentChart = new InvestmentChart
            {
                FirstCurrency  = currency1,
                SecondCurrency = currency2,
                StartingDate   = DateTime.Now.AddDays(-70),
                EndingDate     = DateTime.Now.AddDays(30),
                RadioResponse  = "LinearRegression",
                Alpha          = 0.5
            };

            ViewData["ChartJson"] = _chartService.PrepareInvestmentChart(investmentChart);
            return(View(investmentChart));
        }
        public string PrepareInvestmentChart(InvestmentChart investmentChart)
        {
            try
            {
                DataModel model = new DataModel();
                List <ChartDataValues> _data = new List <ChartDataValues>();

                var a = _dbContext.CurrencyRateHistory.ToList();
                var b = _dbContext.Currencies.ToList();

                var data1 = _dbContext.CurrencyRateHistory
                            .Include(a => a.Currency)
                            .OrderBy(x => x.Date)
                            .Where(x => x.CurrencyId == investmentChart.FirstCurrency &&
                                   x.Date >= investmentChart.StartingDate)
                            .ToList();

                var data2 = _dbContext.CurrencyRateHistory
                            .Include(a => a.Currency)
                            .OrderBy(x => x.Date)
                            .Where(x => x.CurrencyId == investmentChart.SecondCurrency &&
                                   x.Date >= investmentChart.StartingDate)
                            .ToList();

                int previousValues = data2.Count();

                for (int i = 0; i < previousValues; i++)
                {
                    if (i != previousValues - 1)
                    {
                        _data.Add(new ChartDataValues()
                        {
                            Date = data1[i].Date.ToString("dd.MM.yyyy"),
                            FirstCurrencyValue  = data1[i].Rate * 100,
                            SecondCurrencyValue = data2[i].Rate * 100
                        });
                    }
                    else
                    {
                        double temp = 0;
                        if (data1[i].Rate > data2[i].Rate)
                        {
                            temp = data1[i].Rate * 100;
                        }
                        else
                        {
                            temp = data2[i].Rate * 100;
                        }
                        _data.Add(new ChartDataValues()
                        {
                            Date = data1[i].Date.ToString("dd.MM.yyyy"),
                            FirstCurrencyValue  = data1[i].Rate * 100,
                            SecondCurrencyValue = data2[i].Rate * 100,
                            ThirdCurrencyValue  = temp
                        });
                    }
                }

                if (investmentChart.RadioResponse.Equals("LinearPrediction"))
                {
                    TimeSpan span      = investmentChart.EndingDate.Subtract(DateTime.Now);
                    TimeSpan decrement = DateTime.Now.Subtract(investmentChart.StartingDate);

                    double FirstIncrement =
                        (data1[previousValues - 1].Rate - data1[0].Rate) / decrement.Days;
                    double SecondIncrement =
                        (data2[previousValues - 1].Rate - data2[0].Rate) / decrement.Days;

                    for (int i = 1; i <= span.Days; i++)
                    {
                        _data.Add(new ChartDataValues()
                        {
                            Date = data1[previousValues - 1].Date.AddDays(i).ToString("dd.MM.yyyy"),
                            FirstCurrencyValue  = data1[previousValues - 1].Rate * 100 + FirstIncrement * i,
                            SecondCurrencyValue = data2[previousValues - 1].Rate * 100 + SecondIncrement * i
                        });
                    }
                }

                if (investmentChart.RadioResponse.Equals("LinearRegression"))
                {
                    TimeSpan span      = investmentChart.EndingDate.Subtract(DateTime.Now);
                    TimeSpan decrement = DateTime.Now.Subtract(investmentChart.StartingDate);

                    double        alpha1, beta1;
                    List <double> rates1 = new List <double>();
                    for (int i = 0; i < previousValues; i++)
                    {
                        rates1.Add(data1[i].Rate * 100);
                    }

                    alpha1 = LinearRegression(previousValues, rates1).ElementAt(0);
                    beta1  = LinearRegression(previousValues, rates1).ElementAt(1);

                    double        alpha2, beta2;
                    List <double> rates2 = new List <double>();
                    for (int i = 0; i < previousValues; i++)
                    {
                        rates2.Add(data2[i].Rate * 100);
                    }

                    alpha2 = LinearRegression(previousValues, rates2).ElementAt(0);
                    beta2  = LinearRegression(previousValues, rates2).ElementAt(1);


                    for (int i = 1; i <= span.Days; i++)
                    {
                        _data.Add(new ChartDataValues()
                        {
                            Date = data1[previousValues - 1].Date.AddDays(i).ToString("dd.MM.yyyy"),
                            FirstCurrencyValue  = alpha1 + beta1 * (decrement.Days + i),
                            SecondCurrencyValue = alpha2 + beta2 * (decrement.Days + i)
                        });
                    }
                }

                if (investmentChart.RadioResponse.Equals("ExponentialSmoothing"))
                {
                    TimeSpan span = investmentChart.EndingDate.Subtract(DateTime.Now);

                    List <double> parameters      = AlphaParameters(investmentChart.Alpha);
                    int           countParameters = parameters.Count();
                    if (countParameters > data1.Count())
                    {
                        countParameters = data1.Count();
                    }

                    var values1 = data1.TakeLast(countParameters).Reverse().ToList();
                    var values2 = data2.TakeLast(countParameters).Reverse().ToList();
                    for (int i = 1; i < span.Days; i++)
                    {
                        double firstValue  = 0;
                        double secondValue = 0;
                        for (int j = 1; j < countParameters; j++)
                        {
                            firstValue  += parameters.ElementAt(j - 1) * values1[j - 1].Rate;
                            secondValue += parameters.ElementAt(j - 1) * values2[j - 1].Rate;
                        }
                        values1.Insert(0, new BusinessModels.CurrencyRateHistory {
                            Rate = firstValue
                        });
                        values2.Insert(0, new BusinessModels.CurrencyRateHistory {
                            Rate = secondValue
                        });

                        _data.Add(new ChartDataValues()
                        {
                            Date = data1[previousValues - 1].Date.AddDays(i).ToString("dd.MM.yyyy"),
                            FirstCurrencyValue  = firstValue * 100,
                            SecondCurrencyValue = secondValue * 100
                        });
                    }
                }

                string json = JsonConvert.SerializeObject(_data.ToArray());
                //string filePath = @"D:\eBanking\eBanking\eBanking\investmentChartData.json";
                string filePath = "./investmentChartData.json";
                Log.Information("ChartService, PrepareInvestmentChart(): Check if investmentChartData.json exists");
                if (!System.IO.File.Exists(filePath))
                {
                    Log.Information("ChartService, PrepareInvestmentChart(): investmentChartData.json doesn't exist");
                    var fs = System.IO.File.Create(filePath);
                    fs.Close();
                    Log.Information("ChartService, PrepareInvestmentChart(): investmentChartData.json created");
                }
                System.IO.File.WriteAllText(filePath, json);
                JsonFileSource jsonFileSource = new JsonFileSource(filePath);
                model.DataSources.Add(jsonFileSource);

                Charts.CombinationChart combiChart = new Charts.CombinationChart("mscombi2d");
                combiChart.Data.Source = model;
                combiChart.Data.LinePlots("FirstCurrencyValue");
                combiChart.Data.LinePlots("SecondCurrencyValue");
                combiChart.Data.ColumnPlots("ThirdCurrencyValue");
                combiChart.XAxis.Text   = "Date";
                combiChart.Caption.Text = "Investment consulting";
                combiChart.Width.Pixel(800);
                combiChart.Height.Pixel(500);

                combiChart.Data.SecondaryYAxisAsParent("SecondCurrencyValue");
                combiChart.PrimaryYAxis.Text   = data1[0].Currency.Name.ToString();
                combiChart.SecondaryYAxis.Text = data2[0].Currency.Name.ToString();
                combiChart.DualY = true;

                combiChart.ThemeName = FusionChartsTheme.ThemeName.FUSION;

                return(combiChart.Render());
            }
            catch (Exception ex)
            {
                Log.Error(ex, "ChartService, PrepareInvestmentChart()");
                throw ex;
            }
        }
Exemple #3
0
 public IActionResult ShowGraph(InvestmentChart investmentChart)
 {
     ViewData["ChartJson"] = _chartService.PrepareInvestmentChart(investmentChart);
     PopulateCurrencies();
     return(View("Index", investmentChart));
 }