【问题标题】:Deedle Row based calculation基于 Deedle Row 的计算
【发布时间】:2014-08-17 00:54:05
【问题描述】:

我正在尝试使用 Deedle 进行一些基于行的计算。但是大多数示例都是基于列的。例如我有这个简单的结构:

let tt = Series.ofObservations[ 1=>10.0; 3=>20.0;5=> 30.0 ]
let tt2 = Series.ofObservations[1=> 10.0; 3=> Double.NaN; 6=>30.0 ]
let f1 = frame ["cola" => tt; "colb"=>tt2]

 val f1 : Frame<int,string> =
          cola      colb      
      1 -> 10        10        
      3 -> 20        <missing> 
      5 -> 30        <missing> 
      6 -> <missing> 30  

我想计算可乐和可乐的平均值。如果我这样做了

f1.Rows |> Series.mapValues(fun r -> (r.GetAs<float>("cola") + r.GetAs<float>("colb") )/2.0)
val it : Series<int,float> =
     1 -> 10        
     3 -> <missing> 
     5 -> <missing> 
     6 -> <missing>  

我知道我可以匹配每一列来处理平均值,但是如果有很多列,这将不切实际。

f1.Rows 返回的每一行都是一个 ObjectSeries 可以将其转换为浮点系列并将 stats.mean 应用于一行吗?

谢谢 卡比

更新:

我想我可能已经找到了一种方法来做到这一点(参考:https://github.com/BlueMountainCapital/Deedle/issues/100):

折叠操作:

 f1.Rows |> Series.mapValues(fun v -> v.As<float>() |> Series.foldValues (fun acc elem -> elem + acc) 0.0 ) 

mean(它正确跳过缺失值):

 f1.Rows |> Series.mapValues(fun v -> v.As<float>() |> Stats.mean )

计数:

 f1.Rows |> Series.mapValues(fun v -> v.As<float>() |> Stats.count )

如果有不同的方法,请告诉我。希望这对像我这样的新人有用。

【问题讨论】:

    标签: f# deedle


    【解决方案1】:

    您使用f1.Rows 的方法,将每一行转换为一个数字系列,然后应用Stats 函数正是我要建议的答案,所以我认为这种方法非常有意义。

    我能想到的另一个选择是将框架转换为非规范化表示,然后按 colacolb 值对行进行分组(因此,您将所有数据作为行,但分组由另一个属性):

    let byCol = 
      f1
      |> Frame.stack
      |> Frame.groupRowsByString "Column";;
    

    这给了你:

              Row Column Value 
    cola 0 -> 1   cola   10    
         2 -> 3   cola   20    
         3 -> 5   cola   30    
    colb 1 -> 1   colb   10    
         4 -> 6   colb   30    
    

    现在您可以使用处理分层索引的函数来进行计算。例如,要计算两组Value 的平均值,可以这样写:

    byCol?Value |> Stats.levelMean fst
    

    目前我不确定我会推荐哪种方法 - 这可能取决于您需要对数据执行的其他操作。但最好牢记替代方案..

    【讨论】:

    • 感谢您的建议和支持。我根本不知道堆栈功能。我使用 Deedle 的次数越多,我就越意识到我可能遗漏了 API 中的某些内容。这是一个如此全面的包。
    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2010-12-23
    • 2021-07-15
    相关资源
    最近更新 更多