Come unirsi a fotogrammi usando F # Deedle dove uno dei telai ha una chiave composita?

StackOverflow https://stackoverflow.com//questions/22048401

  •  21-12-2019
  •  | 
  •  

Domanda

Dì che ho due fotogrammi, firstframe (Frame<(int * int),string>) e secondframe (Frame<int,string>).Mi piacerebbe trovare un modo per unirsi ai telai in modo che i valori della prima parte della chiave composita da FirstFrame corrispondano ai valori dalla chiave nella seconda fotografica.

Di seguito è riportato un esempio dei telai con cui sto lavorando:

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   
.

Codice utilizzato per generare il campione sopra:

#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;])
.

È stato utile?

Soluzione

Grande domanda! Questo non è così facile come dovrebbe essere (ed è probabilmente legato a un'altra domanda sull'obiezione dei telai che registrato come un problema ). Penso che ci dovrebbe essere un modo più bello per farlo e aggiungerò un link a questa domanda al problema.

Detto questo, è possibile utilizzare il fatto che l'unione può allineare le chiavi che non corrispondono esattamente per farlo. È prima possibile aggiungere zero come il secondo elemento della chiave nel secondo fotogramma:

> 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   
.

Ora, la chiave del secondo fotogramma è sempre più piccola dei tasti corrispondenti nel primo fotogramma (supponendo che i numeri siano positivi). Quindi, ad es. Vogliamo allineare un valore n il secondo frame con chiave (1, 0) ai valori nel primo fotogramma con tasti (1, 1), (1, 2), ... è possibile utilizzare Lookup.NearestSmaller per dire a Deedle che si desidera trovare un valore con il tasto più piccolo più vicino (che lo farà essere (1, 0) per qualsiasi tasto (1, k)).

Per utilizzare questo, devi prima ordinare il primo fotogramma, ma poi funziona bene:

> 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   
.

Questo non è particolarmente ovvio, ma fa il trucco. Anche se, spero che possiamo trovare un modo più bello!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top