【发布时间】:2016-03-07 09:27:06
【问题描述】:
我正在将一系列记录加载到 deedle 数据框中(来自数据库表)。是否可以累积(例如累积总和)值,并取回数据框?例如,有 Series.scanValues 但没有 Frame.scanValues。有 Frame.map,但它没有达到我的预期,它保留了所有值。
#if INTERACTIVE
#r @"Fsharp.Charting"
#load @"..\..\Deedle.fsx"
#endif
open FSharp.Charting
open FSharp.Charting.ChartTypes
open Deedle
type SeriesX = {
DataDate:DateTime
Series1:float
Series2:float
Series3:float
}
let rnd = new System.Random()
rnd.NextDouble() - 0.5
let data =
[for i in [100..-1..1] ->
{SeriesX.DataDate = DateTime.Now.AddDays(float -i)
SeriesX.Series1 = rnd.NextDouble() - 0.5
SeriesX.Series2 = rnd.NextDouble() - 0.5
SeriesX.Series3 = rnd.NextDouble() - 0.5
}
]
# now comes the deedle frame:
let df = data |> Frame.ofRecords
let df = df.IndexRows<DateTime>("DataDate")
df.["Series1"] |> Chart.Line
df.["Series1"].ScanValues((fun acc x -> acc + x),0.0) |> Chart.Line
let df' = df |> Frame.mapValues (Seq.scan (fun acc x -> acc + x) 0.0)
df'.["Series1"] |> Chart.Line
最后两行只是将原始值返回给我,而我希望获得像 df.["Series1"].Scanvalues 中的累积值,用于 Series1、Series2 和 Series3。
【问题讨论】:
-
对不起,不清楚你想得到什么。
-
如果您运行以下代码:dotnetfiddle.net/kiPOy4,您将得到以下结果:pastebin.com/30MBT9Y2。如您所见 - 可以轻松地在框架中添加列。
-
你也可以使用F#样式:
df.["Series1"] |> Series.scanValues((+)) 0.0 -
@FoggyFinder 感谢您对此进行调查。是的,这有点令人费解,所以让我澄清一下:我想累积所有三个系列。在伪代码中 df |> Frame.scanValue((+)) 0.0 这将累积 Frame 中的每个系列。对于您的代码,对于系列 1、系列 2 和系列 3,它将从 1 变为 55。
-
嗯,那你可以这样做:pastebin.com/LEG8vT1d