程序地带

[C#] 老古董的 Microsoft Chart Controls 也可以进行数据预测


我要先声明,这篇文章介绍到的内容虽说不是不能用,但玩乐成分居多,大家看看就好,不要太认真。


1. Microsoft Chart Controls 中的 FinancialFormula

在上一篇文章 使用 Math.Net 进行曲线拟合和数据预测 中,我介绍了如何使用 Math.Net ,这篇文章玩玩“新”花样,用古老的 Microsoft Chart Controls 实现相同的功能。



A long time ago in a galaxy far, far away... 微软推出了一套免费又强大的图表控件,它用于 WinForms 和 WebForms 中,可轻松套用各种功能强大的 2D、3D、实时变化的动态图表,头发比较少的 .NET 开发者或多或少都接触过这套图表控件。虽然现在看来多少有些落后了,但它还是很有用啊,而且还不收钱。



那么,在哪里可以找到这个图表库呢?现在微软的官网也只能找到 for Microsoft .NET Framework 3.5 的下载,找不到更新的版本。幸好 Visual Studio 里就自带了这个图表库,可以直接添加 System.Windows.Forms.DataVisualization 的引用:



这篇我不会介绍如何做图表,而是讲讲这个图表库中的一样很有趣的东西:FinancialFormula。如果只是做简单的财务数据处理,可以用它玩玩。当图表中已有其它序列(Series)的数据,DataManipulator 的 FinancialFormula 可以使用大部分常见的金融公式处理这些数据并产生新的数据序列。


例指,数移动平均线 (Exponential Moving Average) 是对一段时间内的数据计算所得的平均值,它的输入和输出如下:



而蔡金震荡 (Chaikin Oscillator) 指标是指应用于聚散的 3 天指数移动平均线与 10 天指数移动平均线之差,它的输出如下:



FinancialFormula 还有很多其它用法,具体可以参考以下两个页面:


FinancialFormula Enum (System.Windows.Forms.DataVisualization.Charting) Microsoft Docs


Using Financial Formulas


2. 数据预测

这次我用到的是预测 (Forecasting) ,它是指使用历史观测值来预测未来值。



Forecasting公式采用四个可选参数:


RegressionType: 回归类型。使用一个数字来指示特定次数的多元回归,或者使用以下值之一指定不同的回归类型:Linear、Exponential、Logarithmic、Power。默认值为 2,与指定 Linear 等效。


Period: 预测时段。公式会预测此指定的未来天数内的数据变化。默认值为序列长度的一半。


ApproxError: 是否输出近似误差。如果设置为 false,则输出误差序列不包含相应历史数据的数据。默认值为 true。


ForecastError: 是否输出预测误差。如果设置为 false,并且 ApproxError 设置为 true,则输出误差序列将包含所有预测数据点的近似误差。默认值为 true。


输出值有三个序列:


Forecast: 预测测值。


UpperError: 上限误差。


LowerError: 下限误差。


输入参数中回归类型的具体值所代表的公式可以参考以下链接:


Time Series and Forecasting Formula


使用 FinancialFormula 的代码十分简单,只需创建一个临时的 Chart ,插入原始数据作为一个 Series ,然后调用 DataManipulator.FinancialFormula 即可,所有代码加起来也就 30 来行:


public double[] GetPredictData(int forecastingPoints, double[] points)
{
var tempChart = new Chart();
tempChart.ChartAreas.Add(new ChartArea());
tempChart.ChartAreas[0].AxisX = new Axis();
tempChart.ChartAreas[0].AxisY = new Axis();
tempChart.Series.Add(new Series());
for (int i = 0; i < points.Length; i++)
{
tempChart.Series[0].Points.AddXY(i, points[i]);
}
var trendSeries = new Series();
tempChart.Series.Add(trendSeries);
var typeRegression = "Exponential";
var forecasting = forecastingPoints.ToString();
var error = "false";
var forecastingError = "false";
var parameters = typeRegression + "," + forecasting + "," + error + "," + forecastingError;
tempChart.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, parameters, tempChart.Series[0], trendSeries);
var result = new List<double>();
for (int i = 0; i < trendSeries.Points.Count; i++)
{
result.Add(trendSeries.Points[i].YValues[0]);
}
return result.ToArray();
}

这里我使用了 Exponential (指数函数)作为回归类型,结果如下,看起来重复性很好,但是转折处比较生硬,导致最后在实际计算中不太理想。如果想要理想的结果,应该先尝试找出最合适的回归公式。



3. 最后

FinancialFormula 挺好玩的,但它和图表控件耦合在一起,用起来感觉有点邪门歪道,倒是通过它多少学会了一点财务公式。


话说回来当年微软的控件库都很上心嘛,现在微软都不会出这么良心的图表库了,逼我们买第三方控件。



4.参考

Time Series and Forecasting Formula


DataManipulator Class (System.Web.UI.DataVisualization.Charting) Microsoft Docs


DataFormula.FinancialFormula Method (System.Windows.Forms.DataVisualization.Charting) Microsoft Docs


FinancialFormula Enum (System.Windows.Forms.DataVisualization.Charting) Microsoft Docs


how to generate graphs using Microsoft Chart Control


5. 源码

https://github.com/DinoChan/SimpleDataPrediction


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dino623/p/curve_fitting_and_data_prediction_using_Microsoft_Chart_Controls.h

随机推荐

Wireshark的使用初步

可以分析导入的日志记录,也可以实时监控本地接口,这里以本地接口为例:wireshark的基本使用方法有数据包筛选、数据包搜索、数据包还原、数据提取四大部分。First.数据包筛选源筛选ip,如图或者手...

m0_51193993 阅读(371)

了解行业信息的数据渠道

了解行业信息的数据渠道部分细分行业数据源信息类型途径渠道示例评价行业信息官方统计国家统计局、中国人民银行、教育部、CNNIC等《中国统计年鉴》、《统计公报》数据权威、偏宏观、缺少细节、不够深入行业协会...

产品君 阅读(322)

7-14 帅到没朋友

当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。输入格式:输入第一行给出一个正整数N(≤100&#x...

胡先生啦 阅读(507)

解决小伙伴们使用YOLOv3训练时的硬件问题

最近在学习YOLOv3来训练voc模型可想而知一个15年的mac或者老版本的Windows电脑难堪重负。在学完理论准备操刀开始部署训练时,才发现GPU是个大难题,而本人是个...

cwxprogrammer 阅读(709)

多态

packagetest.src.com.oop.Demo06;publicclassApplication{publicstaticvoidmain(String[]args){//一个对象的实际类型...

天天向上的小太阳 阅读(341)

python核心基础(3)- 字符串string

1.字符串基础基本概念:字符串是由独立字符组成的一个序列,通常包含在单引号(’’)双引号("")或者...

MustangBOY 阅读(449)

LintCode算法之n!

在java代码之中,计算n的阶乘的算法第一种就是利用for循环publicintcalculation1(intnum){intm=1;for(inti=1;i<&...

微微笑再加油 阅读(367)

弱电工程项目经理部及各相关人员岗位职责

一、项目经理部职责二、项目经理岗位职责三、项目副经理岗位职责四、技术负责人岗位职责五、专业技术工程师岗位职责六、安全员岗位职责七、质检员岗位职责八、材料员岗位职责一、项目经理部职责负责整个项目的日常管...

东边的小山 阅读(481)