美文网首页
C#中使用dataframe----Microsoft.Data

C#中使用dataframe----Microsoft.Data

作者: 昵称违法 | 来源:发表于2021-12-12 17:43 被阅读0次

一、困境

最近要吃饭,重新端起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"
image.png

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());
        }
image.png

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
image.png
  • 加载一个本地的股票行情数据
var df1 = DataFrame.LoadCsv("D:\\jupyter_work_space\\GPU并行计算\\计算周线-cpu 和 gpu\\data\\cpu周线\\000001.csv");
df1
image.png
  • 打印df的info信息


    image.png
  • 读取一个单元格信息


    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
)

相关文章

网友评论

      本文标题:C#中使用dataframe----Microsoft.Data

      本文链接:https://www.haomeiwen.com/subject/nvwrfrtx.html