F# 如何累积(扫描)数据帧值

F# 如何累积(扫描)数据帧值,f#,deedle,F#,Deedle,我正在将一系列记录从数据库表加载到deedle数据框中。是否可以累积(例如,对值进行累积求和)并返回数据帧?例如,有Series.scanValues,但没有Frame.scanValues。有Frame.map,但它没有达到我预期的效果,它保留了所有的值 #if INTERACTIVE #r @"Fsharp.Charting" #load @"..\..\Deedle.fsx" #endif open FSharp.Charting open FSharp.Charting.ChartTy

我正在将一系列记录从数据库表加载到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]中的累积值。扫描Series1、Series2和Series3的值

对于过滤和投影,series提供了Where和Select方法 以及相应的Series.map和Series.filter函数 如果只想变换,还可以使用Series.mapValues和Series.mapKeys 一方面

因此,您只需将函数应用于每个系列:

let allSum = 
    df.Columns
    |> Series.mapValues(Series.scanValues(fun acc v -> acc + (v :?> float)) 0.0)
    |> Frame.ofColumns
并使用Frame.ofColumns将结果转换为帧

编辑:

如果只需要选择数字列,可以使用Frame.getNumericCols:

let allSum = 
    df
    |> Frame.getNumericCols
    |> Series.mapValues(Series.scanValues (+) 0.0)
    |> Frame.ofColumns
没有显式类型转换,代码变得更加漂亮:

有一个Series.scanValues函数。您可以从数据帧中的每一列中获得一个序列,如下所示:frame$column,这将获得一个序列


如果需要同时扫描所有列,可以首先将每一行映射为一个值(例如元组),然后将Series.scanValues应用于该新列。

抱歉,但不清楚要获得什么。如果运行以下代码:将得到以下结果:。如您所见-可以轻松地在框架中添加列。您还可以使用样式F:df。[Series1]|>Series.scanValues+0。0@FoggyFinder谢谢你调查这件事。是的,这有点复杂,所以让我澄清一下:我想把这三个系列都累加起来。在伪码df |>Frame.scanValue+0.0中,这将累加帧中的每个序列。对于系列1、系列2和系列3,您的代码将从1变为55。嗯,然后您可以这样做:已经投入生产。很不错的。非常感谢。需要进一步探索Deedle。我实际上使用的是Series.scanValues: