美文网首页
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