/// <summary>
        /// This method reads the training data and calculates a variety of statistical data about each column.
        /// </summary>
        public static MetricStatistics UnderstandData(DataSetColumns dataSetColumns)
        {
            //Calculate and output the statistics for your pleasure
            var stats = MetricStatistics.CalculateMetricStatisticsAsync(dataSetColumns.TimeSeries, DateTime.Now, TimeSpan.FromSeconds(1)).Result;

            Console.WriteLine("Time Series Statistics:");
            Console.WriteLine(stats.ToString());
            return(stats);
        }
        public static void PopulateDataSet(DataSetColumns dataSetColumns)
        {
            var timeSeries = new List <double>();

            using (var reader = new StreamReader(_dataPath2))
            {
                reader.ReadLine(); // headers
                while (!reader.EndOfStream)
                {
                    var line   = reader.ReadLine();
                    var values = line.Split(',');
                    timeSeries.Add(double.Parse(values[1]));
                }
            }
            dataSetColumns.TimeSeries = timeSeries.ToArray();
        }
        private static double[][] GetTrainingData(DataSetColumns dataSetColumns)
        {
            var length = dataSetColumns.TimeSeries.Length - FrameSize;
            var retval = new double[length][];

            // build array where first 24 values are input and the last value is the expected output
            for (int i = 0; i < length; i++)
            {
                retval[i] = new double[FrameSize];
                for (int j = 0; j < FrameSize; j++)
                {
                    retval[i][j] = dataSetColumns.TimeSeries[i + j];
                }
            }

            return(retval);
        }
        public static void ModelAndTrain(DataSetColumns dataSetColumns, double accuracy)
        {
            var trainData = GetTrainingData(dataSetColumns);

            int numInput  = InputSize; // number predictors
            int numHidden = InputSize * 2;
            int numOutput = 1;         // regression

            NeuralNetwork bestNeuralNetwork    = null;
            double        bestTrainingAccuracy = 0.0;

            for (int i = 0; i < 6; i++)
            {
                numHidden += numInput;
                Console.WriteLine("Creating a " + numInput + "-" + numHidden +
                                  "-" + numOutput + " neural network");
                NeuralNetwork nn = new NeuralNetwork(numInput, numHidden, numOutput, true);

                int    maxEpochs = 10000;
                double learnRate = 0.01;
                Console.WriteLine("\nSetting maxEpochs = " + maxEpochs);
                Console.WriteLine("Setting learnRate = " + learnRate.ToString("F2"));

                Console.WriteLine("\nStarting training");
                double[] weights = nn.Train(trainData, maxEpochs, learnRate);
                Console.WriteLine("Done");
                Console.WriteLine("\nFinal neural network model weights and biases:\n");
                ShowVector(weights, 2, 10, true);

                double trainAcc = nn.Accuracy(trainData, accuracy);  // within standard deviation
                if (bestNeuralNetwork == null || bestTrainingAccuracy < trainAcc)
                {
                    bestTrainingAccuracy = trainAcc;
                    bestNeuralNetwork    = nn;
                }
                Console.WriteLine("\nModel accuracy (+/- input accuracy) on training data = " +
                                  trainAcc.ToString("F4"));
            }

            Console.WriteLine("\n========================= Best Model accuracy (+/- input accuracy) on training data = " +
                              bestTrainingAccuracy);
        }
        static void Main(string[] args)
        {
            try
            {
                // Get the data for initial
                var datasetColumns = new DataSetColumns();
                PopulateDataSet(datasetColumns);

                // Learn about your data
                var stats = UnderstandData(datasetColumns);

                //Do Neural Networking
                //ModelAndTrain(datasetColumns, stats.MedianAbsoluteDeviation);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.WriteLine("Execution Complete -- Press Enter");
            Console.ReadLine();
        }