首页 > 代码库 > C# chart.DataManipulator.FinancialFormula()公式的使用 线性回归预测方法
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:上限误差。
1 2 | 下面的示例以 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轴的间隔是一定的,否则影响数据的回归分析
四:以下是自己编写的线性回归预测方法的一个公用类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | 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; } } } |