Deedle - 过滤 FilterRowValues 后的加权平均值

wha*_*ayo 4 f# deedle

我是 F# 新手。我试图在通过两个时间戳和仪器 ID 过滤我的帧后计算加权平均值。

示例数据:

| trade_qty | trade_price | trade_timestamp    | instrument_id 
|  1000     |  100.59     | 1/26/2018 16:00:00 |  1 
|  2000     |  105.10     | 1/26/2018 15:59:30 |  1 
|  3000     |  97.59      | 1/26/2018 15:59:00 |  1 
Run Code Online (Sandbox Code Playgroud)

我发现我可以轻松过滤:例如两次之间的仪器 1

frameVolume
|> Frame.filterRowValues (fun c.GetAs<DateTime>
   ("trade_timestamp)>DateTime(2018,1,27,15,31,0))
|> Frame.filterRowValues (fun c.GetAs<DateTime>
    ("trade_timestamp)<DateTime(2018,1,27,16,00,0))
|> Frame.filterRowValues (fun c.GetAs<int>("instrument_id")=
    1
Run Code Online (Sandbox Code Playgroud)

我被困在这里了。我还没弄清楚如何 1/sum(trade_qty) * Sum(trade_price*trade_qty)

我努力了:

|>Frame.GetColumn<float>("trade_qty") * 
    Frame.GetColumn<float>("trade_price")
Run Code Online (Sandbox Code Playgroud)

对于上下文,我想将其用作要输入到另一个函数中的函数,以便计算几个时间间隔内的加权平均价格。

有什么想法吗?谢谢你!

lje*_*osn 5

很高兴Deedle提供了类似于 F# List、Arrays 和 Seq 的内置高阶函数的高阶函数。利用这些知识,可以使任务变得更简单。这是您所描述的函数的实现:

#I "..\packages\Deedle.1.2.5"
#load "Deedle.fsx"

open System
open Deedle

let weightedAverage after before frame: float =
    let filteredFrame =
        frame
        |> Frame.filterRowValues (fun r -> r.GetAs<DateTime>("trade_timestamp") < before)
        |> Frame.filterRowValues (fun r -> r.GetAs<DateTime>("trade_timestamp") > after)
        |> Frame.filterRowValues (fun r -> r.GetAs<int>("instrument_id") = 1)
    let quantities: Series<int, float> = filteredFrame |> Frame.getCol "trade_qty"
    let tradePrices: Series<int, float> = filteredFrame |> Frame.getCol "trade_price"
    let weightedSum = 
        (quantities, tradePrices) 
        ||> Series.zip 
        |> Series.mapValues (fun (q, p) -> (OptionalValue.get q * OptionalValue.get p)) 
        |> Series.reduceValues (fun acc curr -> acc + curr)
    let total = 
        quantities 
        |> Series.reduceValues (fun acc curr -> acc + curr) 
    weightedSum / total 

let path = __SOURCE_DIRECTORY__ + "\data.csv"
let df = Frame.ReadCsv(path, separators = "|")
let ans = df |> weightedAverage (DateTime(2017, 1, 1)) (DateTime(2019, 1, 1))
Run Code Online (Sandbox Code Playgroud)