为什么Series.resampleUniform返回一个空系列?

时间:2017-04-12 22:17:46

标签: f# time-series deedle

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

我怀疑问题是我不理解参数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 [ ]

任何见解?

1 个答案:

答案 0 :(得分: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)