2017-04-12 100 views
1

我不明白爲什麼resmplU在下面的代碼是一個空的系列。爲什麼Series.resampleUniform會返回一個空系列?

我懷疑問題是我不明白參數nextKeyresampleUniform的簽名中的作用。該幫助表示它「用於生成範圍內的所有鍵」,但我無法弄清楚這意味着什麼。

open Deedle 
let dateRange skip (startDate: System.DateTime) endDate = 
    Seq.initInfinite float 
    |> Seq.map (fun i -> startDate.AddDays (skip * i)) 
    |> Seq.takeWhile (fun dt -> dt <= endDate) 

let dt3 = DateTime(2017,4,1)  
let dt4 = DateTime(2017,4,30) 
let dt5 = DateTime(2017,4,15) 

let dateR = dateRange 2.0 dt3 dt4 
let valsR = [1..dateR |> Seq.length] 
let tseries = Series(dateR, valsR) 
let resmplU = 
    tseries 
    |> Series.resampleUniform Lookup.ExactOrGreater (fun x -> x < dt5) id 

運行此代碼後,我得到:

val dt3 : DateTime = 4/1/2017 12:00:00 AM 
val dt4 : DateTime = 4/30/2017 12:00:00 AM 
val dt5 : DateTime = 4/15/2017 12:00:00 AM 
val dateR : seq<DateTime> 
val valsR : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15] 
val tseries : Series<DateTime,int> = 
    series [ 4/1/2017 12:00:00 AM => 1; 4/3/2017 12:00:00 AM => 2; 4/5/2017 12:00:00 AM => 3; 4/7/2017 12:00:00 AM => 4; 4/9/2017 12:00:00 AM => 5; ... ; 4/29/2017 12:00:00 AM => 15] 
val resmplU : Series<bool,Series<DateTime,int>> = series [ ] 

任何見解?

回答

3

Series.resampleUniform函數可讓您將一系列值重新定標爲一組新的鍵。例如,假設您的系列:

01/04/2017 -> 1 
03/04/2017 -> 2 
05/04/2017 -> 3 
07/04/2017 -> 4 
09/04/2017 -> 5 
11/04/2017 -> 6 
13/04/2017 -> 7 
15/04/2017 -> 8 
17/04/2017 -> 9 
19/04/2017 -> 10 
21/04/2017 -> 11 
23/04/2017 -> 12 
25/04/2017 -> 13 
27/04/2017 -> 14 
29/04/2017 -> 15 

您可以重新取樣的系列,這樣的鍵是天從1月至29對於每個鍵(一天),你會得到特定日期值,或第二天他們所提供的值:

tseries 
|> Series.resampleUniform Lookup.ExactOrGreater (fun dt -> dt.Day) (fun d -> d + 1) 

第一個函數dt -> dt.Day輪流從原來的一系列鍵進入新的一系列鍵(說明是如何工作的,我使用int作爲鑰匙返回的系列),第二個功能d -> d + 1計算目標系列的下一個鍵。

編輯我想與你使用bool爲重點的思想的問題是重採樣功能需要你想獲得的系列來計算一個更重要的這兩個鍵 - 這樣它可以使肯定它達到了最後。這不適用於bool,因爲只有兩個值。下面的作品,但:

tseries 
|> Series.resampleUniform Lookup.ExactOrGreater 
     (fun x -> if x < dt5 then 0 else 1) (fun n -> n + 1) 
+0

好了,我現在好理解。我發現我在使用'id'作爲'nextKey'參數時犯了一個錯誤。但是在我看來,示例代碼應該用'not'替換'id',因爲函數'not'應該計算下一個布爾鍵。如果是這樣的話,我應該得到一個有兩個鍵的系列,真假。但我得到一個空的系列。我錯過了什麼? – Soldalma

+0

也許問題在於'not'計算下一個鍵,但不會在'bool'類型中建立傳遞關係(排序)。 – Soldalma

+0

我明白你現在要做的事情!請參閱編輯。 –

相關問題