【问题标题】:How to functionally Join multiple Deedle series in C#?如何在 C# 中功能性地加入多个 Deedle 系列?
【发布时间】:2014-09-08 11:12:12
【问题描述】:

我正在考虑使用 deedle 将数百个系列连接到一个框架中。实现这一目标的最佳功能方式是什么?

直接(必要)的想法是在循环之外创建一个框架对象持有者。然后在循环中,这个对象 old 用作系列连接的左侧。

再想一想,C# 尾递归?我做了一些研究,我对 c# 是否可以进行尾递归有点迷茫。 Tomas 的《面向现实世界的函数式编程》一书中只有 F# 示例

还有人拥有数百列(1000 行)的 deedle 框架吗?对性能有很大影响吗?这听起来可能有些过分,但通常在电子表格中完成

欢迎提出任何建议。 谢谢 卡比

【问题讨论】:

    标签: c# f# functional-programming tail-recursion deedle


    【解决方案1】:

    创建框架的正确方法取决于数据的来源。

    如果您已经拥有所有系列并且想要创建一个包含它们作为列的框架,那么方法Frame.FromColumns 可能是要走的路。该方法采用键值对的集合,其中键是列名,值是列(系列)。

    这是一个最小的示例,它创建了一个包含名称和序列的键值对数组:

    var cols = new KeyValuePair<string, Series<int, object>>[]{
      KeyValue.Create("IDs", (new object[] {1,2,2}).ToOrdinalSeries() ),
      KeyValue.Create("Namess", (new object[] {"A", "B", "C"}).ToOrdinalSeries() )
    };
    var frame = Frame.FromColumns(cols);
    

    我假设在您的情况下,您已经在某个集合中拥有该系列,因此功能方法是使用 LINQ 和 Select 将您的数据投影为正确的格式。所以你的代码可能看起来像:

    var cols = someSource.Select(item =>
      KeyValue.Create(item.Key, item.Series));
    var frame = Frame.FromColumns(cols);
    

    FromColumns 操作在底层使用了外连接,但它已经过优化(例如,如果您有具有相同索引的系列)。 C# documentation for Deedle 中还有很多其他示例。

    【讨论】:

    • 再次感谢托马斯。在我发布问题后,我开始在 VS 中胡思乱想,最终想出了与您的建议有点相似的东西: Series s1 = new SeriesBuilder() { { 1, 2.5 }, { 2 , 3.1 }, { 3, 4.5 } }.系列; Series s2 = new SeriesBuilder() { { 1, double.NaN }, { 2, 3.1 }, { 3, double.NaN } }.Series; var s = new SeriesBuilder(); s.Add("A", s1).Add("B", s1).Add("C", s1).Add("D", s2); var sObjt = s.Series; var dFrame = Frame.FromColumns(sObjt);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多