C# chart.DataManipulator.FinancialFormula()公式的使用 線性迴歸預測方法

最近翻閱資料,找到 chart.DataManipulator.FinancialFormula()公式的使用,打開另外一扇不曾瞭解的窗,供你們分享一下。

一 DataManipulator類

運行時,執行數據操做。此類是經過chart中DataManipulator屬性對外公開的。html

在C#中的繼承關係以下:編程

System.Object           函數

  System.Web.UI.DataVisualization.Charting.DataFormulaui

    System.Web.UI.DataVisualization.Charting.DataManipulatorspa

《命名空間:System.Web.UI.DataVisualization.Charting》3d

《程序集:System.Web.DataVisualization(在 System.Web.DataVisualization.dll 中)》orm

在DataManipulator屬性中囊括了不少數學計算方法(大多都是針對圖表的數據序列展開的)如下是這樣一個列子:htm

double result = Chart1.DataManipulator.Statistics.Mean("Series1");平均值函數blog

double result = Chart1.DataManipulator.Statistics.Median("Series1");中值函數繼承

 StatisticFormula 類計算統計公式。

2、DataFormula.FinancialFormula 方法

使用指定的參數從公式模塊調用方法。

重載此成員。有關此成員的完整信息(包括語法、用法和示例),請單擊重載列表中的相應名稱。

在這裏特別講到的是預測函數功能的實現狀況。

預測公式嘗試根據歷史數據找出擬合度最佳的迴歸函數,而後根據最擬合的函數預測最可能的將來數據值。

Chart.DataManipulator.FinancialFormula(
    FinancialFormula.Forecasting,
    "RegressionType,Period,ApproxError,ForecastError",
    "Historical",
    "Forecast,UpperError,LowerError")

三 預測函數的語法分析說明

此公式採用四個可選參數。

RegressionType

迴歸類型。使用一個數字來指示特定次數的多元迴歸,或者使用如下值之一指定不一樣的迴歸類型:LinearExponentialLogarithmicPower默認值爲 2,與指定 Linear 等效。

Period

預測時段。公式會預測此指定的將來天數內的數據變化。默認值爲序列長度的一半。

ApproxError

是否輸出近似偏差。若是設置爲 false,則輸出偏差序列不包含相應歷史數據的數據。默認值爲 true

ForecastError

是否輸出預測偏差。若是設置爲 false,而且 ApproxError 設置爲 true,則輸出偏差序列將包含全部預測數據點的近似偏差。默認值爲 true

輸入值:

此公式採用一個輸入 Y 值。

Historical:用於預測的歷史數據。

輸出值:

此公式輸出三個 Y 值。

Forecast:預測測值。

UpperError:上限偏差。

LowerError: 下限偏差。
下面的示例以 Series1 (Series1:Y) 做爲輸入,在 Series2 上輸出預測值 (Series2:Y),在 Series3 上輸出偏差範圍(Series3:Y、Series3:Y2)。該示例採用二次多元迴歸,預測期間爲 40 天。
Chart1.DataManipulator.FinancialFormula (FinancialFormula.Forecasting, "2,40,true,true", "Series1:Y", "Series2:Y,Series3:Y,Series3:Y2");

 在編程的過程當中,注意原始歷史數據的輸入,要求X軸的間隔是必定的,不然影響數據的迴歸分析

四:如下是本身編寫的線性迴歸預測方法的一個公用類

using System.Drawing;
using System.Windows.Forms.DataVisualization.Charting;
using System;

namespace WindowsFormsApplication8
{
    class RegressionModelClass
    {
        #region  字段
        double[] sourceData_X = new double[4];  // 樣本數據 X 軸座標值
        double[] sourceData_Y = new double[4];  // 樣本數據 Y 軸座標值

        double[] predictData_Y = new double[8]; // 預測的將來數據的 Y 軸座標值
        int n = 4;                              // 樣本數據的個數

        // Chart
        System.Windows.Forms.DataVisualization.Charting.Chart chart_temp = new System.Windows.Forms.DataVisualization.Charting.Chart();

        #endregion

        /// <summary>
        /// 構造函數
        /// </summary>
        public RegressionModelClass(double[] data_x, double[] data_y)
        {
            for (int i = 0; i < n;i++)
            {
                sourceData_X[i] = data_x[i];
                sourceData_Y[i] = data_y[i];
            }

            InitialChart(chart_temp, sourceData_X, sourceData_Y);
        }

        // 初始化 Chart 控件
        private void InitialChart(System.Windows.Forms.DataVisualization.Charting.Chart chart, double[] data_x, double[] data_y)
        {
            #region  1. Title 設置
            Title title = new Title();  //* 實例化
            title.Text = "信息預測";
            //** 關聯
            chart.Titles.Add(title);  //* 當使用這種重載方式時,能夠將屬性傳遞
            #endregion

            #region 2. ChartArea 設置
            ChartArea chartarea1 = new ChartArea();  //* 實例化
            chartarea1.Name = "chartarea1";     //* ChartArea 的惟一名稱
            // 關聯
            chart.ChartAreas.Add(chartarea1);  //重要//使用這種重載方法
            #endregion

            #region 3. 座標軸設置
            #region  3.1 X軸
            Axis axis_X = new Axis();
            axis_X.IntervalType = DateTimeIntervalType.Days;  
            axis_X.Title = "時 間";  //* 軸的標題
            // ** 關聯
            chart.ChartAreas[0].AxisX = axis_X;
            chart.ChartAreas[0].AxisX.Enabled = AxisEnabled.True;
            #endregion

            #region   3.2.1  深度 -- Y 軸
            Axis axisY_depth = new Axis();
            axisY_depth.Title = "深度";
            axisY_depth.LineColor = Color.Black;
            axisY_depth.ArrowStyle = AxisArrowStyle.None;
            axisY_depth.TextOrientation = TextOrientation.Stacked;
            axisY_depth.TitleFont = new Font("微軟雅黑", 14F, FontStyle.Bold);
            axisY_depth.TitleForeColor = Color.Black;
            axisY_depth.TitleAlignment = StringAlignment.Far;
            axisY_depth.IsLabelAutoFit = false;

            axisY_depth.IntervalType = DateTimeIntervalType.Number;
            axisY_depth.IsStartedFromZero = false;
            axisY_depth.Minimum = 0;
            axisY_depth.Maximum = 10;
            axisY_depth.IntervalAutoMode = IntervalAutoMode.FixedCount;
            axisY_depth.InterlacedColor = Color.Red;

            // ** 關聯
            chart.ChartAreas[0].AxisY = axisY_depth;
            chart.ChartAreas[0].AxisY.Enabled = AxisEnabled.True;
            #endregion

            #endregion

            #region 4. Series 設置

            Series series = new Series();
            series.Name = "樣本數據曲線";
            series.ChartType = SeriesChartType.Line;
            series.XAxisType = AxisType.Primary;
            series.YAxisType = AxisType.Primary;
            // important
            series.XValueType = ChartValueType.DateTime;
            series.YValueType = ChartValueType.Double;
            series.Enabled = true;

            //關聯
            series.ChartArea = chart.ChartAreas[0].Name;
            chart.Series.Clear();
            chart.Series.Add(series);  // 注意要使用這個重載方法,不該該使用 Add(string)重載方法
            #endregion

            #region 5. Points 設置

            // 清除全部數據點
            chart.Series[0].Points.Clear();

            // 添加數據點
            int m = data_x.Length;
            for (int i = 0; i < m; i++)
            {
                chart.Series[0].Points.AddXY(data_x[i], data_y[i]);
            }
            #endregion
        }

        /// <summary>
        /// 獲得基於迴歸分析預測的數據
        /// </summary>
        /// 
        public double[] GetPredictData()
        {
            Series trendSeries = new Series();
            trendSeries.Name = "trend";
            trendSeries.ChartType = SeriesChartType.Line;
            
            // 關聯
            trendSeries.ChartArea = chart_temp.ChartAreas[0].Name;
            chart_temp.Series.Add(trendSeries);

            string typeRegression = "2";
            // The number of days for Forecasting (備註:該數字對應的單位與X軸的數據間隔單位有關,並不必定是「天」)
            string forecasting = "4";
            string error = "false";
            string forecastingError = "false";
            string parameters = typeRegression + ',' + forecasting + ',' + error + ',' + forecastingError;

            chart_temp.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, parameters, chart_temp.Series[0], chart_temp.Series["trend"]);


            for (int i = 0; i < 8; i++)  // 共4個預測值
            {
                predictData_Y[i] = Math.Round(chart_temp.Series["trend"].Points[i].YValues[0], 5);   // chart.Series["trend"]共8個數據點
            }

            return predictData_Y;
        }
    }
}
相關文章
相關標籤/搜索