C# chart.DataManipulator.FinancialFormula()公式的使用 线性回归预测方法

最近翻阅资料,找到 chart.DataManipulator.FinancialFormula()公式的使用,打开另一扇未曾了解的窗,供大家分享一下。

一 DataManipulator类

运行时,执行数据操作。此类是通过chart中DataManipulator属性对外公开的。

在C#中的继承关系如下:

System.Object           

  System.Web.UI.DataVisualization.Charting.DataFormula

    System.Web.UI.DataVisualization.Charting.DataManipulator

《命名空间:System.Web.UI.DataVisualization.Charting》

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

在DataManipulator属性中囊括了很多数学计算方法(大多都是针对图表的数据序列展开的)以下是这样一个列子:

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

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

 StatisticFormula 类计算统计公式。

二、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;
        }
    }
}

 

原文地址:https://www.cnblogs.com/liuxiaowei0543/p/3712522.html