一、困境
最近要吃飯怜奖,重新端起Unity + c#的飯碗。
但是我還想繼續(xù)玩一玩數(shù)據(jù)分析(量化)翅阵,因為不想在上班和下班中間頻繁切換諸如python歪玲、julia、c#掷匠、rust的等東東滥崩,于是打算用一種語言來開發(fā)。
想要的東西就是:
- 有用戶界面:曾經在QT和微軟家套件之間徘徊過
- 編寫的東西能夠:編譯成dll讹语,也能弄成exe钙皮。
(1)python + pyqt之前弄過,可以build成exe顽决,但是考慮計算速度短条,放棄了,使用python只是用來抓數(shù)據(jù)才菠。
(2)julia我主要用來數(shù)據(jù)預處理茸时、指標計算、回測赋访、CUDA密集計算屹蚊。一直沒有放棄找尋一套合適的GUI,但是都不成功进每。也看了build成dll和app的包汹粤,但是總覺得不放心。
(3)rust雖然號稱匹敵C++田晚,但是生態(tài)很弱嘱兼,一年來,我都在關注dataframe的相關包贤徒,前段時間終于可以用了芹壕,但是發(fā)現(xiàn)資料很少,在谷歌上都搜不到啥接奈,考慮到自己單槍匹馬踢涌,就不要去折騰了。另外他也面臨GUI的問題序宦。
(4).net是我用的最多的了睁壁,畢竟從.net framework1.0開始用,算下來也是許多年了,用起來最順手潘明。
左思右想之后行剂,我還是決定用C#來弄,GUI + 程序主體 + 數(shù)據(jù)庫 + 網(wǎng)絡钳降。
至于密集計算的部分厚宰,到時候看看有沒有順手的cuda包,沒有的話遂填,用julia來算铲觉,或者等rust成熟,用rust也行吓坚,不能直接call的撵幽,就跑兩個進程,中間用進程通信凌唬。
以前用julia寫的代碼并齐,看看能不能build成dll或者exe,不好弄的話客税,重新擼一個况褪。
二、c#使用dataframe:Microsoft.Data.Analysis
配置請看上文更耻,本文直接干活:
1测垛、下載相關的包
#r "nuget:XPlot.Plotly,4.0.6"
#r "nuget:Microsoft.Data.Analysis,0.19.0"
2、一個案例【直接從vs項目扒過來的】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Data.Analysis;
private void main()
{
var data = new PrimitiveDataFrameColumn<int>("Ints");
data.Append(0);
data.Append(1);
data.Append(2);
var data2 = new PrimitiveDataFrameColumn<int>("Ints2");
data2.Append(0);
data2.Append(2);
data2.Append(3);
var data31 = new PrimitiveDataFrameColumn<int>("Ints31");
data31.Append(0);
data31.Append(2);
var data32 = new PrimitiveDataFrameColumn<int>("Ints32");
data32.Append(0);
data32.Append(1);
var data33 = new PrimitiveDataFrameColumn<int>("Ints33");
data33.Append(4);
data33.Append(6);
DataFrame frame = new DataFrame(data, data2);
DataFrame frame2 = new DataFrame(data31, data32, data33);
Console.WriteLine(frame.Multiply<int>(5));
getDotProducts(frame, frame2);
}
public static void getDotProducts(DataFrame firstFrame, DataFrame secondFrame)
{
List<DataFrameColumn> list = new List<DataFrameColumn>();
foreach (var column in firstFrame.Columns)
{
list.Add(column.Multiply(2).CumulativeSum(true));
foreach (var row in secondFrame.Rows)
{
Console.WriteLine(column.Multiply(2).CumulativeSum(true));
}
}
var newFrame = new DataFrame(list);
Console.WriteLine(newFrame.ToString());
}
3秧均、案例二食侮、生成一個dataframe
var start = new DateTime(2009,1,1);
Random rand = new Random();
var numDataPoint = 200;
PrimitiveDataFrameColumn<DateTime> date = new PrimitiveDataFrameColumn<DateTime>("Date",
Enumerable.Range(0, numDataPoint)
.Select(offset => start.AddDays(offset))
.ToList());
PrimitiveDataFrameColumn<int> data = new PrimitiveDataFrameColumn<int>("Data",
Enumerable.Range(0, numDataPoint)
.Select(r => rand.Next(100))
.ToList());
var df = new DataFrame(date, data);
df
- 加載一個本地的股票行情數(shù)據(jù)
var df1 = DataFrame.LoadCsv("D:\\jupyter_work_space\\GPU并行計算\\計算周線-cpu 和 gpu\\data\\cpu周線\\000001.csv");
df1
-
打印df的info信息
-
讀取一個單元格信息
-
修改一個cell的信息
-
顯示某一行的數(shù)據(jù)
-
顯示某一列的信息
-
增加一列新的
-
空值處理
-
orderby處理
-
groupby之后count
看到最后也不容易,奉上[參考文檔](Getting started with C# DataFrame and XPlot.Ploty | Refinitiv Developers
)