我如何迭代 Deedle 系列<DateTime,Series<DateTime,ObjectSeries<string>>
How do I iterate over a Deedle Series<DateTime,Series<DateTime,ObjectSeries<string>>
我使用
创建了一个数据框
// Create a dataframe containing the Open, High, Low, and Close
let ohlc =
cl
|> Frame.sliceCols ["Open"; "High"; "Low"; "Close"; "Volume"]
结果输出:
高开低收盘量
12/28/2014 8:00:00 下午 -> 62.13 62.67 62.13 62.27 3206
2014 年 12 月 28 日 9:00:00 下午 -> 62.27 62.42 62.14 62.39 1620
2014 年 12 月 28 日 10:00:00 下午 -> 62.4 62.41 62.16 62.21 1275
2014 年 12 月 28 日 11:00:00 下午 -> 62.21 62.32 61.96 62.19 2791
2014 年 12 月 29 日 12:00:00 上午 -> 62.17 62.25 62.08 62.23 1233
2014 年 12 月 29 日 1:00:00 上午 -> 62.23 62.41 62.21 62.31 1186
12/29/2014 2:00:00 上午 -> 62.32 62.32 62.07 62.21 1446
12/29/2014 3:00:00 上午 -> 62.22 62.35 62.17 62.28 1335
我现在想从上面的每小时样本生成一个更高的时间范围(每天)。
我开始于:
ohlc
|> Frame.rows
|> Series.resampleEquiv (fun d -> d.Date)
其中returns:
Series<DateTime,Series<DateTime,ObjectSeries<string>>>.
我想创建一个包含 Date(key)、Open、High、Low、Close 和 Volume 列的新 DataFrame。打开是系列第 1 行中的第一个打开。 High 是系列中的 Max High。 Low 是系列中的 Min Low。 Close 是系列中的最后一个 Close。体积是系列中体积的总和
所以像这样:
ohlc
|> Frame.rows
|> Series.resampleEquiv (fun d -> d.Date)
|> ??
|> ??
与其尝试使用行在框架级别执行此操作,不如尝试使用列在框架级别执行此操作会更好吗?
更新
这是完成的代码:
ohlc
|> Frame.rows
|> Series.resampleEquiv (fun d -> d.Date)
|> Series.mapValues (fun s ->
let temp = Frame.ofRows s
series ["Open" => Series.firstValue temp?Open
"High" => defaultArg (Stats.max temp?High) nan
"Low" => defaultArg (Stats.min temp?Low) nan
"Close" => Series.lastValue temp?Close
"Volume" => defaultArg (Some( Stats.sum temp?Volume) ) nan ] )
|> Frame.ofRows
我无法使用:
"Volume" => defaultArg (Stats.sum temp?Volume) nan ] )
因为这给了我一条错误消息:这个表达式应该有类型 float 选项,但这里有类型 float。我不得不包装函数 Some()。不知道为什么 Stats.sum 需要这个但是 Stat.max 和 Stats.min 不需要。
在调用resampleEquiv
之后,你最终得到了一个series(表示具有相同日期的块)series(表示具有不同时间但相同日期的值)of object series(表示不同列的原始帧)。
您可以遍历顶级系列并将每个系列对象系列(每个块)转回一个框架。然后你可以在框架上进行聚合并 return 一个新行:
source
|> Series.resampleEquiv (fun d -> d.Date.Year)
|> Series.mapValues (fun s ->
let temp = Frame.ofRows s
series [ "Open" => Series.firstValue temp?Open
"High" => defaultArg (Stats.max temp?High) nan ])
|> Frame.ofRows
我只是为 Open 和 High 做的,但你可以看到这个想法:-)。在每个块上调用 Frame.ofRows
也应该相当快,因为 Deedle 知道块中的所有项目都具有相同的索引。 (或者,您可以遍历各个行,但这会使它更长)。
我使用
创建了一个数据框// Create a dataframe containing the Open, High, Low, and Close
let ohlc =
cl
|> Frame.sliceCols ["Open"; "High"; "Low"; "Close"; "Volume"]
结果输出:
高开低收盘量
12/28/2014 8:00:00 下午 -> 62.13 62.67 62.13 62.27 3206
2014 年 12 月 28 日 9:00:00 下午 -> 62.27 62.42 62.14 62.39 1620
2014 年 12 月 28 日 10:00:00 下午 -> 62.4 62.41 62.16 62.21 1275
2014 年 12 月 28 日 11:00:00 下午 -> 62.21 62.32 61.96 62.19 2791
2014 年 12 月 29 日 12:00:00 上午 -> 62.17 62.25 62.08 62.23 1233
2014 年 12 月 29 日 1:00:00 上午 -> 62.23 62.41 62.21 62.31 1186
12/29/2014 2:00:00 上午 -> 62.32 62.32 62.07 62.21 1446
12/29/2014 3:00:00 上午 -> 62.22 62.35 62.17 62.28 1335
我现在想从上面的每小时样本生成一个更高的时间范围(每天)。
我开始于:
ohlc
|> Frame.rows
|> Series.resampleEquiv (fun d -> d.Date)
其中returns:
Series<DateTime,Series<DateTime,ObjectSeries<string>>>.
我想创建一个包含 Date(key)、Open、High、Low、Close 和 Volume 列的新 DataFrame。打开是系列第 1 行中的第一个打开。 High 是系列中的 Max High。 Low 是系列中的 Min Low。 Close 是系列中的最后一个 Close。体积是系列中体积的总和
所以像这样:
ohlc
|> Frame.rows
|> Series.resampleEquiv (fun d -> d.Date)
|> ??
|> ??
与其尝试使用行在框架级别执行此操作,不如尝试使用列在框架级别执行此操作会更好吗?
更新 这是完成的代码:
ohlc
|> Frame.rows
|> Series.resampleEquiv (fun d -> d.Date)
|> Series.mapValues (fun s ->
let temp = Frame.ofRows s
series ["Open" => Series.firstValue temp?Open
"High" => defaultArg (Stats.max temp?High) nan
"Low" => defaultArg (Stats.min temp?Low) nan
"Close" => Series.lastValue temp?Close
"Volume" => defaultArg (Some( Stats.sum temp?Volume) ) nan ] )
|> Frame.ofRows
我无法使用:
"Volume" => defaultArg (Stats.sum temp?Volume) nan ] )
因为这给了我一条错误消息:这个表达式应该有类型 float 选项,但这里有类型 float。我不得不包装函数 Some()。不知道为什么 Stats.sum 需要这个但是 Stat.max 和 Stats.min 不需要。
在调用resampleEquiv
之后,你最终得到了一个series(表示具有相同日期的块)series(表示具有不同时间但相同日期的值)of object series(表示不同列的原始帧)。
您可以遍历顶级系列并将每个系列对象系列(每个块)转回一个框架。然后你可以在框架上进行聚合并 return 一个新行:
source
|> Series.resampleEquiv (fun d -> d.Date.Year)
|> Series.mapValues (fun s ->
let temp = Frame.ofRows s
series [ "Open" => Series.firstValue temp?Open
"High" => defaultArg (Stats.max temp?High) nan ])
|> Frame.ofRows
我只是为 Open 和 High 做的,但你可以看到这个想法:-)。在每个块上调用 Frame.ofRows
也应该相当快,因为 Deedle 知道块中的所有项目都具有相同的索引。 (或者,您可以遍历各个行,但这会使它更长)。