我无法理解为什么下面代码中的resmplU
是一个空系列。
我怀疑问题是我不理解参数nextKey
在resampleUniform
签名中的作用。帮助说它"用于生成范围内的所有键,"但我无法弄清楚这意味着什么。
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 [ ]
任何见解?
答案 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)