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

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

[C#] 老古董的 Microsoft Chart Controls 也可以进行数据预测的更多相关文章

  1. (原创)用Microsoft Chart Controls(MSChart)实现曲线图,并支持拖动放大到秒

    Microsoft Chart Controls(简称MSChart)控件,给图形统计和报表图形显示提供了很好的解决办法,同时支持Web和WinForm两种方式. MSChart 在.NET 4.0自 ...

  2. 用Microsoft Chart Controls(MSChart)实现曲线图,并支持拖动放大到秒

    Microsoft Chart Controls(简称MSChart)控件,给图形统计和报表图形显示提供了很好的解决办法,同时支持Web和WinForm两种方式. MSChart 在.NET 4.0自 ...

  3. Chart Controls 简介与下载

    虽然博客园已有人介绍过了,还是忍不住介绍一下微软这套免费又功能强大的图表控件「Microsoft Chart Controls for Microsoft .NET Framework 3.5」.本帖 ...

  4. Microsoft.Windows.Controls.Ribbon.RibbonWindow 碰到 AvalonDock出现的诡异现象

    部分一 14年底进入目前公司时,领导准备开发一款新软件平台以取代原有平台.原平台采用C++Build开发界面(window c/s客户端) .Visual Studio(封装dll模块).过完年,领导 ...

  5. C#创建基本图表(Chart Controls)

    在.NET环境下微软提供了强大了图表控件,并给多了很多实例,关于图表的基本元素如下: 并且MSDN给出了创建图表的示例步骤,原文地址:http://msdn.microsoft.com/en-us/l ...

  6. Microsoft Azure News(1) 新的数据中心Japan East, Japan West and Brazil South

    <Windows Azure Platform 系列文章目录> 微软官方博客今天表示,微软宣布将在日本东部(埼玉县)和日本西部(大阪)提供Windows Azure服务.就在最近,微软为W ...

  7. C# Chart 折线图 多条数据展示

    private void btn_Click(object sender, EventArgs e) { DBHelper db = new DBHelper(); DataSet ds = db.G ...

  8. 微软BI 之SSRS 系列 - 不显示 Pie Chart 饼图上 0% 的数据

    SSRS 小技巧系列专门用来记录 SSRS 报表开发过程中常用的小技巧 - 效果图 - 0% 的标签数据不需要显示出来. 效果图 - 正常的效果. 解决方法 - 使用 IIF 条件判断,如果计算值为 ...

  9. .net chart(图表)控件的使用-System.Windows.Forms.DataVisualization.dll

    这个案例指在介绍微软这套免费又功能强大的图表控件Microsoft Chart Controls for Microsoft .NET Framework 3.5,通过它,可让您的项目及报表,轻松套用 ...

  10. 解析大型.NET ERP系统架构设计 Framework+ Application 设计模式

    我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应该具备良好的可扩展性和可维护性,系统中的功能紧密关联.除去业务上的复杂性,如何设计这样的一个协 ...

随机推荐

  1. Ubuntu12.04-x64编译Hadoop2.2.0和安装Hadoop2.2.0集群

      本文Blog地址:http://www.cnblogs.com/fesh/p/3766656.html   本文对Hadoop-2.2.0源码进行重新编译(64位操作系统下不重新编译会有版本问题) ...

  2. 【SQL】SQL中笛卡尔积、内连接、外连接的数据演示

    SQL的查询语句中,常使用到内连接.外连接,以及连接的基础--笛卡尔积运算. 在简单的SQL中,也许我们还分辨清楚数据如何连接,一旦查询复杂了,脑子也犯浆糊了,迷迷糊糊的. 本文,简单以数据形式记录连 ...

  3. 自动化利器-Zabbix

    1.1为何需要监控系统 在一个IT环境中会存在各种各样的设备,例如:硬件设备.软件设备.其系统的构成也是非常复杂的. 多种应用构成负载的IT业务系统,保证这些资源的正常运转,是一个公司IT部门的职责. ...

  4. python使用mongodb

    系统环境:Windows 10 ,python3.x 1.安装mongodb mongodb下载官网:https://www.mongodb.com/download-center?jmp=nav#c ...

  5. MongoDB导入导出以及数据库备份

    -------------------MongoDB数据导入与导出------------------- 1.导出工具:mongoexport     1.概念:         mongoDB中的m ...

  6. 听翁恺老师mooc笔记(8)--字符串2

    字符串的赋值 字符串的输入与输出 对C语言的基础类型,比如int.double等类型,scanf.printf有专门的格式转换,而对字符串,scanf.printf使用%s格式字符进行输入与输出.当使 ...

  7. VCS使用学习笔记(1)——Verilog相关的仿真知识

    本文主要学习Verilog的仿真特性,以及仿真器对Verilog的处理,算是对Verilog知识的增量学习.本文内容与我的另一篇博文(http://www.cnblogs.com/IClearner/ ...

  8. leetcode 3. Longest Substring Without Repeating Characters [java]

    idea: 设置一个hashset存储非重复元素 j:遍历s i:最近的一个非重复指针 注意点: 1.Set set = new HashSet<>(); add remove publi ...

  9. 通用Linux内核优化配置

    通用Linux内核优化配置 针对CentOS6.CentOS7.Redhat6.Redhat7等系统 net.ipv4.ip_forward = net.ipv4.conf. net.ipv4.con ...

  10. BZOJ1334:[Baltic2008]Elect(背包DP)

    Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党 ...