2

假设我有两个框架,firstFrame ( Frame<(int * int),string>) 和secondFrame ( Frame<int,string>)。我想找到一种方法来连接框架,以使 firstFrame 中复合键第一部分的值与 secondFrame 中键的值相匹配。

以下是我正在使用的框架的示例:

val firstFrame : Deedle.Frame<(int * int),string> =

       Premia 
1 1 -> 125    
2 1 -> 135    
3 1 -> 169    
1 2 -> 231    
2 2 -> 876    
3 2 -> 24     

val secondFrame : Deedle.Frame<int,string> =

     year month 
1 -> 2014 Apr   
2 -> 2014 May   
3 -> 2014 Jun   

用于生成上述示例的代码:

#I @"w:\\\dev\packages\Deedle.0.9.12"
#load "Deedle.fsx"
open Deedle
open System

let periodMembers =[(1,1);(2,1);(3,1);(1,2);(2,2);(3,2);]
let premia =[125;135;169;231;876;24;]
let firstSeries = Series(periodMembers,premia)
let firstFrame = Frame.ofColumns["Premia"=>firstSeries]

let projectedYears = series([1=>2014;2=>2014;3=>2014;])
let projectedMonths = series([1=>"Apr";2=>"May";3=>"Jun"])
let secondFrame = Frame(["year";"month"],[projectedYears;projectedMonths;])
4

1 回答 1

0

好问题!这并不像它应该的那么容易(并且它可能与我们记录为问题的关于加入框架的另一个问题有关)。我认为应该有更好的方法来做到这一点,我会在这个问题上添加一个链接到这个问题。

也就是说,您可以使用加入可以对齐不完全匹配的键的事实来执行此操作。您可以首先在第二帧中添加零作为键的第二个元素:

> let m = secondFrame |> Frame.mapRowKeys (fun k -> k, 0);;

val m : Frame<(int * int),string> =      
       year month 
1 0 -> 2014 Apr   
2 0 -> 2014 May   
3 0 -> 2014 Jun   

现在,第二帧中的关键点总是小于第一帧中匹配的关键点(假设数字是正数)。因此,例如,我们希望将第二帧中的(1, 0)值与键对齐到第一帧中的值与键(1, 1)(1, 2)...您可以Lookup.NearestSmaller用来告诉 Deedle 您想要找到具有最近较小键的值(这将是(1, 0)对于任何键(1, k))。

要使用它,您首先需要对第一帧进行排序,然后它就可以很好地工作:

> firstFrame.SortByRowKey().Join(m, JoinKind.Left, Lookup.NearestSmaller);;

val it : Frame<(int * int),string> =      
       Premia year month 
1 1 -> 125    2014 Apr   
  2 -> 231    2014 Apr   
2 1 -> 135    2014 May   
  2 -> 876    2014 May   
3 1 -> 169    2014 Jun   
  2 -> 24     2014 Jun   

这不是特别明显,但它确实有效。虽然,我希望我们能想出一个更好的方法!

于 2014-02-26T17:40:17.143 回答