为什么 Series.resampleUniform return 是一个空系列?

Why does Series.resampleUniform return an empty series?

我无法理解为什么下面代码中的 resmplU 是一个空系列。

我怀疑问题是我不明白 resampleUniform 的签名中参数 nextKey 的作用。帮助说 "is used to generate all keys in the range," 但我不明白那是什么意思。

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 [ ]

有什么见解吗?

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 计算目标序列的下一个键。

EDIT 我认为你使用 bool 作为键的想法的问题是重采样函数需要在 之后再计算一个键 您想要获得的系列中的两个键 - 以便它可以确保它到达结尾。这不适用于 bool,因为只有两个值。不过以下工作:

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