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
输入值:
此公式采用一个输入 Y 值。
Historical:用于预测的历史数据。
输出值:
此公式输出三个 Y 值。
Forecast:预测测值。
UpperError:上限误差。
下面的示例以 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; } } }