一、困境
最近要吃饭,重新端起Unity + c#的饭碗。
但是我还想继续玩一玩数据分析(量化),因为不想在上班和下班中间频繁切换诸如python、julia、c#、rust的等东东,于是打算用一种语言来开发。
想要的东西就是:
- 有用户界面:曾经在QT和微软家套件之间徘徊过
- 编写的东西能够:编译成dll,也能弄成exe。
(1)python + pyqt之前弄过,可以build成exe,但是考虑计算速度,放弃了,使用python只是用来抓数据。
(2)julia我主要用来数据预处理、指标计算、回测、CUDA密集计算。一直没有放弃找寻一套合适的GUI,但是都不成功。也看了build成dll和app的包,但是总觉得不放心。
(3)rust虽然号称匹敌C++,但是生态很弱,一年来,我都在关注dataframe的相关包,前段时间终于可以用了,但是发现资料很少,在谷歌上都搜不到啥,考虑到自己单枪匹马,就不要去折腾了。另外他也面临GUI的问题。
(4).net是我用的最多的了,毕竟从.net framework1.0开始用,算下来也是许多年了,用起来最顺手。
左思右想之后,我还是决定用C#来弄,GUI + 程序主体 + 数据库 + 网络。
至于密集计算的部分,到时候看看有没有顺手的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

- 加载一个本地的股票行情数据
var df1 = DataFrame.LoadCsv("D:\\jupyter_work_space\\GPU并行计算\\计算周线-cpu 和 gpu\\data\\cpu周线\\000001.csv");
df1

-
打印df的info信息
image.png
-
读取一个单元格信息
image.png

-
修改一个cell的信息
image.png
-
显示某一行的数据
image.png
-
显示某一列的信息
image.png
-
增加一列新的
image.png
-
空值处理
image.png
-
orderby处理
image.png
-
groupby之后count
image.png
看到最后也不容易,奉上[参考文档](Getting started with C# DataFrame and XPlot.Ploty | Refinitiv Developers
)
网友评论