首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何累积(扫描) Deedle数据帧值

如何累积(扫描) Deedle数据帧值
EN

Stack Overflow用户
提问于 2016-03-07 17:27:06
回答 2查看 301关注 0票数 1

我正在将一系列记录加载到一个deedle数据框中(从数据库表)。是否有可能累加(例如累加)这些值,并返回一个数据帧?例如,有Series.scanValues,但没有Frame.scanValues。有Frame.map,但它没有做我期望的事情,它让所有的值保持原样。

代码语言:javascript
复制
#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、Series2和Series3的“Series1”.Scanvalues。

EN

回答 2

Stack Overflow用户

发布于 2016-03-08 17:42:49

用于过滤和投影的

系列提供了Where和Select方法以及相应的Series.map和Series.filter函数(如果您只想转换一个方面,还有Series.mapValues和Series.mapKeys )。

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

代码语言:javascript
复制
let allSum = 
    df.Columns
    |> Series.mapValues(Series.scanValues(fun acc v -> acc + (v :?> float)) 0.0)
    |> Frame.ofColumns

并使用Frame.ofColumns将结果转换为帧。

编辑:

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

代码语言:javascript
复制
let allSum = 
    df
    |> Frame.getNumericCols
    |> Series.mapValues(Series.scanValues (+) 0.0)
    |> Frame.ofColumns

没有显式的类型转换,代码变得更漂亮了:)

票数 1
EN

Stack Overflow用户

发布于 2017-02-01 11:34:56

这里有一个Series.scanValues函数。您可以从数据框中的每一列中获取一个系列,如下所示:frame$column,它将为您提供一个Series

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35840150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档