Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# Deedle-过滤过滤后的加权平均值_F#_Deedle - Fatal编程技术网

F# Deedle-过滤过滤后的加权平均值

F# Deedle-过滤过滤后的加权平均值,f#,deedle,F#,Deedle,我是新来的。我试图在通过两个时间戳和一个仪器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/201

我是新来的。我试图在通过两个时间戳和一个仪器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 
我发现我可以很容易地过滤:例如,仪器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
frameVolume
|>Frame.filterRowValues(fun c.GetAs
(“交易时间戳)>日期时间(2018,1,27,15,31,0))
|>Frame.filterRowValues(fun c.GetAs
(“交易时间戳”)Frame.filterRowValues(fun c.GetAs(“仪器id”)=
1.
我被困在这里了。我还不知道如何1/求和(交易数量)*求和(交易价格*交易数量)

我试过:

|>Frame.GetColumn<float>("trade_qty") * 
    Frame.GetColumn<float>("trade_price")
|>Frame.GetColumn(“交易数量”)*
Frame.GetColumn(“交易价格”)
在上下文中,我想将此函数作为一个函数输入到另一个函数中,以计算几个区间的加权平均价格

有什么想法吗?谢谢!

很好,它提供了类似于F#List、array和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))
#I.\packages\Deedle.1.2.5”
#加载“Deedle.fsx”
开放系统
开放式Deedle
让加权平均值在帧后和帧前:浮动=
让过滤器框架=
框架
|>Frame.filterRowValues(fun r->r.GetAs(“交易时间戳”)<之前)
|>Frame.filterRowValues(fun r->r.GetAs(“交易时间戳”)>after)
|>Frame.filterRowValues(fun r->r.GetAs(“仪器id”)=1)
let数量:Series=filteredFrame |>Frame.getCol“交易数量”
let tradePrices:Series=filteredFrame |>Frame.getCol“交易价格”
设加权和=
(数量、价格)
||>Series.zip
|>Series.mapValues(fun(q,p)->(OptionalValue.get q*OptionalValue.get p))
|>Series.reduceValue(趣味acc curr->acc+curr)
总数=
量
|>Series.reduceValue(趣味acc curr->acc+curr)
加权总和/总数
让路径=\uuuu源目录\uuuuu+“\data.csv”
设df=Frame.ReadCsv(路径,分隔符=“|”))
设ans=df |>加权平均值(日期时间(2017,1,1))(日期时间(2019,1,1))

这非常棒,非常有用。感谢您的指导。ljeabmreosn快速问题。我正在运行此程序,它似乎被困在(数量、交易价格)| |>Series.zip |>Series.mapValues(乐趣(q,p)->(OptionalValue.get q*OptionalValue.get p))似乎|>Series.zip可能是问题所在,但我不确定。另外,我们是否可以将float用于tradePrices而不是int?忘记添加-我收到此错误消息:错误FS0001:“Series*Series”类型与“Series”类型不兼容@whalekayo您对上述代码做了任何更改?上面的代码片段在我的电脑上运行良好是的,既然你提到了,
tradePrices
应该是
float
系列,而不是
int
系列。谢谢@ljeabmreonsn的确认。我现在成功地使用了代码。我一定是打错了。