1. 程式人生 > >[C#] 老古董的 Microsoft Chart Controls 也可以進行資料預測

[C#] 老古董的 Microsoft Chart Controls 也可以進行資料預測

我要先宣告,這篇文章介紹到的內容雖說不是不能用,但玩樂成分居多,大家看看就好,不要太認真。 ## 1. Microsoft Chart Controls 中的 FinancialFormula 在上一篇文章 [使用 Math.Net 進行曲線擬合和資料預測](https://www.cnblogs.com/dino623/p/curve_fitting_and_data_prediction_using_math_net.html) 中,我介紹瞭如何使用 [Math.Net](https://www.mathdotnet.com/) ,這篇文章玩玩“新”花樣,用古老的 Microsoft Chart Controls 實現相同的功能。 ![](https://img2020.cnblogs.com/blog/38937/202101/38937-20210108153008813-1791931147.png) A long time ago in a galaxy far, far away... 微軟推出了一套免費又強大的圖表控制元件,它用於 WinForms 和 WebForms 中,可輕鬆套用各種功能強大的 2D、3D、實時變化的動態圖表,頭髮比較少的 .NET 開發者或多或少都接觸過這套圖表控制元件。雖然現在看來多少有些落後了,但它還是很有用啊,而且還不收錢。 ![](https://img2020.cnblogs.com/blog/38937/202101/38937-20210103163918554-569379066.png) 那麼,在哪裡可以找到這個圖表庫呢?現在微軟的官網也只能找到 for Microsoft .NET Framework 3.5 的[下載](https://www.microsoft.com/en-us/download/details.aspx?id=14422),找不到更新的版本。幸好 Visual Studio 裡就自帶了這個圖示庫,可以直接新增 `System.Windows.Forms.DataVisualization` 的引用: ![](https://img2020.cnblogs.com/blog/38937/202101/38937-20210103164013349-2071652237.png) 這篇我不會介紹如何做圖表,而是講講這個圖示庫中的一樣很有趣的東西:[FinancialFormula](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.datavisualization.charting.dataformula.financialformula?view=netframework-4.8&WT.mc_id=WD-MVP-5003763)。如果只是做簡單的財務資料處理,可以用它玩玩。當圖表中已有其它序列(Series)的資料,DataManipulator 的 `FinancialFormula` 可以使用大部分常見的金融公式處理這些資料併產生新的資料序列。 例指,`數移動平均線 `(Exponential Moving Average) 是對一段時間內的資料計算所得的平均值,它的輸入和輸出如下: ![](https://img2020.cnblogs.com/blog/38937/202101/38937-20210103164412015-22403602.png) 而`蔡金震盪` (Chaikin Oscillator) 指標是指應用於聚散的 3 天指數移動平均線與 10 天指數移動平均線之差,它的輸出如下: ![](https://img2020.cnblogs.com/blog/38937/202101/38937-20210103164418116-974773912.png) FinancialFormula 還有很多其它用法,具體可以參考以下兩個頁面: [FinancialFormula Enum (System.Windows.Forms.DataVisualization.Charting) Microsoft Docs](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.datavisualization.charting.financialformula?view=netframework-4.8&WT.mc_id=WD-MVP-5003763) [Using Financial Formulas](https://origin2.cdn.componentsource.com/sites/default/files/resources/dundas/538236/WinChart2005/Formulas_HowToUseFormulas.html) ## 2. 資料預測 這次我用到的是`預測` (Forecasting) ,它是指使用歷史觀測值來預測未來值。 ![](https://img2020.cnblogs.com/blog/38937/202101/38937-20210103165509145-174722414.png) 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](https://origin2.cdn.componentsource.com/sites/default/files/resources/dundas/538236/WinChart2005/Forecasting.html) 使用 `FinancialFormula` 的程式碼十分簡單,只需建立一個臨時的 `Chart` ,插入原始資料作為一個 `Series` ,然後呼叫 `DataManipulator.FinancialFormula` 即可,所有程式碼加起來也就 30 來行: ``` CS 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(); for (int i = 0; i < trendSeries.Points.Count; i++) { result.Add(trendSeries.Points[i].YValues[0]); } return result.ToArray(); } ``` 這裡我使用了 `Exponential` (指數函式)作為迴歸型別,結果如下,看起來重複性很好,但是轉折處比較生硬,導致最後在實際計算中不太理想。如果想要理想的結果,應該先嚐試找出最合適的迴歸公式。 ![](https://img2020.cnblogs.com/blog/38937/202101/38937-20210103164604420-1972719257.png) ## 3. 最後 `FinancialFormula` 挺好玩的,但它和圖表控制元件耦合在一起,用起來感覺有點邪門歪道,倒是通過它多少學會了一點財務公式。 話說回來當年微軟的控制元件庫都很上心嘛,現在微軟都不會出這麼良心的圖表庫了,逼我們買第三方控制元件。 ![](https://img2020.cnblogs.com/blog/38937/202101/38937-20210108160100040-720937680.png) ## 4.參考 [Time Series and Forecasting Formula](https://origin2.cdn.componentsource.com/sites/default/files/resources/dundas/538236/WinChart2005/Forecasting.html) [DataManipulator Class (System.Web.UI.DataVisualization.Charting) Microsoft Docs](https://docs.microsoft.com/zh-cn/dotnet/api/system.web.ui.datavisualization.charting.datamanipulator?view=netframework-4.8&WT.mc_id=WD-MVP-5003763) [DataFormula.FinancialFormula Method (System.Windows.Forms.DataVisualization.Charting) Microsoft Docs](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.datavisualization.charting.dataformula.financialformula?view=netframework-4.8&WT.mc_id=WD-MVP-5003763) [FinancialFormula Enum (System.Windows.Forms.DataVisualization.Charting) Microsoft Docs](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.datavisualization.charting.financialformula?view=netframework-4.8&WT.mc_id=WD-MVP-5003763) [how to generate graphs using Microsoft Chart Control ](http://www.nullskull.com/q/10352018/how-to-generate-graphs-using-microsoft-chart-control.aspx) ## 5. 原始碼