首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何压缩2 Deedle框架并处理丢失的值?

如何压缩2 Deedle框架并处理丢失的值?
EN

Stack Overflow用户
提问于 2020-04-16 13:16:36
回答 3查看 123关注 0票数 1

给定一个价格框架,priceFrame作为

代码语言:javascript
运行
复制
                       28881              29021              29399
2010-01-01 00:00:00 -> 123.535878499576   195.28635425580265 189.92210186152082
2010-01-04 00:00:00 -> 124.19087548338847 198.10448102247753 190.1571733631235
2010-01-05 00:00:00 -> 123.82028508465247 197.8259452373992  190.31388769752525
2010-01-06 00:00:00 -> 124.17363872065654 197.80956077945342 189.98478759528152
2010-01-07 00:00:00 -> 123.4583130672824  197.58017836821244 190.31388769752527
2010-01-08 00:00:00 -> 124.23396739021821 198.10448102247756 190.25120196376457
2010-01-11 00:00:00 -> 125.12166067091142 197.87509861123658 190.73701640041008
2010-01-12 00:00:00 -> 124.9234378994945  195.0569718445617  191.41088803833776
2010-01-13 00:00:00 -> 125.06133200134975 195.64681233060992 191.50491663897884
2010-01-14 00:00:00 -> 124.97514818769021 196.28580619049552 191.56760237273951
2010-01-15 00:00:00 -> 123.71686450826103 192.5829186947483  192.08475967626538
2010-01-18 00:00:00 -> 123.71686450826103 194.10667328370621 192.31983117786805
2010-01-19 00:00:00 -> 123.15666971947407 195.87619474185092 191.94371677530378
2010-01-20 00:00:00 -> 121.5622691667727  191.79646471335064 192.82131704795376
2010-01-21 00:00:00 -> 121.5450324040408  188.38849746062752 192.9937028157957
2010-01-22 00:00:00 -> 121.81220222638535 186.8647428716696  192.9937028157957
2010-01-25 00:00:00 -> 121.94147794687466 184.83307008639233 192.9937028157957
2010-01-26 00:00:00 -> 121.38990153945363 185.9799821425972  193.19743145051802
2010-01-27 00:00:00 -> 120.94174570842405 184.91499237612123 193.3541457849198
2010-01-28 00:00:00 -> 120.44187958919875 182.5392459739825  193.22877431739838
2010-01-29 00:00:00 -> 119.4938576389439  183.75169586197052 193.35414578491978

和红利框架divFrame作为

代码语言:javascript
运行
复制
                       28881     29021     29399
2010-01-04 00:00:00 -> 1.3       <missing> <missing>
2010-01-13 00:00:00 -> <missing> 1.3       <missing>
2010-01-22 00:00:00 -> <missing> <missing> 1.3

我想把它们结合起来,在有红利的情况下,我有价格+红利,否则就保持原来的价格。

以下两次尝试

代码语言:javascript
运行
复制
let dfZipped1 = priceFrame.Zip(divFrame, JoinKind.Left, JoinKind.Left, Lookup.Exact, false, fun (p:float) d -> p + d)
        dfZipped1.Print()
        let dfZipped2 = priceFrame.Zip(divFrame, JoinKind.Left, JoinKind.Left, Lookup.Exact, true, fun (p:float) d -> p + d)
        dfZipped2.Print()

结果相同的输出

代码语言:javascript
运行
复制
                       28881              29021              29399
2010-01-01 00:00:00 -> <missing>          <missing>          <missing>
2010-01-04 00:00:00 -> 125.49087548338846 <missing>          <missing>
2010-01-05 00:00:00 -> <missing>          <missing>          <missing>
2010-01-06 00:00:00 -> <missing>          <missing>          <missing>
2010-01-07 00:00:00 -> <missing>          <missing>          <missing>
2010-01-08 00:00:00 -> <missing>          <missing>          <missing>
2010-01-11 00:00:00 -> <missing>          <missing>          <missing>
2010-01-12 00:00:00 -> <missing>          <missing>          <missing>
2010-01-13 00:00:00 -> <missing>          196.94681233060993 <missing>
2010-01-14 00:00:00 -> <missing>          <missing>          <missing>
2010-01-15 00:00:00 -> <missing>          <missing>          <missing>
2010-01-18 00:00:00 -> <missing>          <missing>          <missing>
2010-01-19 00:00:00 -> <missing>          <missing>          <missing>
2010-01-20 00:00:00 -> <missing>          <missing>          <missing>
2010-01-21 00:00:00 -> <missing>          <missing>          <missing>
2010-01-22 00:00:00 -> <missing>          <missing>          194.2937028157957
2010-01-25 00:00:00 -> <missing>          <missing>          <missing>
2010-01-26 00:00:00 -> <missing>          <missing>          <missing>
2010-01-27 00:00:00 -> <missing>          <missing>          <missing>
2010-01-28 00:00:00 -> <missing>          <missing>          <missing>
2010-01-29 00:00:00 -> <missing>          <missing>          <missing>

没有丢失的数字是正确的。但我想保留那些没有红利的价格。

代码语言:javascript
运行
复制
let dfZipped3 = priceFrame.Zip(divFrame, JoinKind.Left, JoinKind.Left, Lookup.Exact, false, fun (p:float) d -> p + (d |> Option.defaultValue 0.0))
        dfZipped3.Print()

结果:

代码语言:javascript
运行
复制
                       28881              29021              29399
2010-01-01 00:00:00 -> 123.535878499576   195.28635425580265 189.92210186152082
2010-01-04 00:00:00 -> 124.19087548338847 198.10448102247753 190.1571733631235
2010-01-05 00:00:00 -> 123.82028508465247 197.8259452373992  190.31388769752525
2010-01-06 00:00:00 -> 124.17363872065654 197.80956077945342 189.98478759528152
2010-01-07 00:00:00 -> 123.4583130672824  197.58017836821244 190.31388769752527
2010-01-08 00:00:00 -> 124.23396739021821 198.10448102247756 190.25120196376457
2010-01-11 00:00:00 -> 125.12166067091142 197.87509861123658 190.73701640041008
2010-01-12 00:00:00 -> 124.9234378994945  195.0569718445617  191.41088803833776
2010-01-13 00:00:00 -> 125.06133200134975 195.64681233060992 191.50491663897884
2010-01-14 00:00:00 -> 124.97514818769021 196.28580619049552 191.56760237273951
2010-01-15 00:00:00 -> 123.71686450826103 192.5829186947483  192.08475967626538
2010-01-18 00:00:00 -> 123.71686450826103 194.10667328370621 192.31983117786805
2010-01-19 00:00:00 -> 123.15666971947407 195.87619474185092 191.94371677530378
2010-01-20 00:00:00 -> 121.5622691667727  191.79646471335064 192.82131704795376
2010-01-21 00:00:00 -> 121.5450324040408  188.38849746062752 192.9937028157957
2010-01-22 00:00:00 -> 121.81220222638535 186.8647428716696  192.9937028157957
2010-01-25 00:00:00 -> 121.94147794687466 184.83307008639233 192.9937028157957
2010-01-26 00:00:00 -> 121.38990153945363 185.9799821425972  193.19743145051802
2010-01-27 00:00:00 -> 120.94174570842405 184.91499237612123 193.3541457849198
2010-01-28 00:00:00 -> 120.44187958919875 182.5392459739825  193.22877431739838
2010-01-29 00:00:00 -> 119.4938576389439  183.75169586197052 193.35414578491978

所有的价格都在那里,但红利都没有增加。

代码语言:javascript
运行
复制
let dfZipped4 = priceFrame.Zip(divFrame, JoinKind.Left, JoinKind.Left, Lookup.Exact, true, fun (p:float) d -> p + (d |> Option.defaultValue 0.0))
        dfZipped4.Print()

只会导致价值的缺失。

当股息一致时,我该如何将价格加到股息中,但如果不是这样,价格就会保持不变吗?

更新

我已经安排了执行Frocha和zuzhu的每一个答案的时间。合述的第二个答案并没有产生正确的结果。

对于每种技术的1000次连续运行,我得到的是典型的

代码语言:javascript
运行
复制
frocha1: 572.974400
frocha2: 562.867600
zyzhu1: 1099.057100

frocha2始终比frocha1稍快。zyzhu1总是比其他的慢。所以现在我接受弗罗查的回答。

然而,如果zyzhu2可以工作,它可能是最快的,因为它是最简单的。在这种情况下,我将更改接受的答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-16 16:42:20

我的方法不考虑速度限制,如下所示: 1)重命名列以便能够在没有错误的情况下执行联接,2)加入框架。3)用零替换缺失值。4)相应列之和。5)取消股利栏。6)可选:如果不需要"string“转换,则将priceFrame的col名称更改为原始类型。

代码语言:javascript
运行
复制
module Frame =
    //I usually add this handy function to the Frame module
    let mapReplaceCol col f frame =
        frame
        |> Frame.replaceCol col (Frame.mapRowValues f frame)

let priceFrame' = priceFrame |> Frame.mapColKeys string

//appends a "D" in the col key to eliminate col with same name
let dividends' =
    dividends
    |> Frame.mapColKeys (string >> (+) "D") 

let joinedFrame =
    priceFrame'
    |> Frame.join JoinKind.Right dividends'
    |> Frame.fillMissingWith 0.

(joinedFrame,priceFrame'.ColumnKeys |> List.ofSeq)
||> List.fold (fun acc elem ->
    acc|> Frame.mapReplaceCol elem (fun row ->
        row.GetAs<float>("D" + elem) + row.GetAs<float>(elem))
    |> Frame.dropCol ("D" + elem))

编辑

另一种使用Zip的方法。

代码语言:javascript
运行
复制
//generate a dividends frame with the same rows of priceFrame
let dividends2 =
    (priceFrame,priceFrame.ColumnKeys |> List.ofSeq)
    ||> List.fold (fun acc elem -> acc|> Frame.dropCol elem) //empty frame
    |> Frame.join JoinKind.Outer dividends
    |> Frame.fillMissingWith 0.

(priceFrame,dividends2) ||> Frame.zip (fun (p : float) (d : float) -> p + d)
票数 0
EN

Stack Overflow用户

发布于 2020-04-17 17:22:10

若要使用zip,两个框架将逐列匹配,并将两个系列相加在一起。

在您的例子中,divFrame的观察量比priceFrame少。当两个系列没有相同的观测量并加在一起时,无与伦比的结果就会丢失。

这是我的解决方案,创建一个虚拟框架,以便divFrame首先与priceFrame对齐。

代码语言:javascript
运行
复制
let divFrame2 =
  let dummy =
    priceFrame.RowKeys
    |> Seq.collect(fun row -> divFrame.ColumnKeys |> Seq.map(fun col -> row, col, 0) )
    |> Frame.ofValues
  (dummy + divFrame).FillMissing(0.)
priceFrame + divFrame2
票数 0
EN

Stack Overflow用户

发布于 2020-04-23 01:57:59

我有类似的问题,我的解决方案与zyzhu相似,但可以处理多个帧

代码语言:javascript
运行
复制
let zipAll (dfs:Frame<_,_>[]) = 
    let outerKeys = dfs |> Array.collect (fun df -> df.RowKeys |> Array.ofSeq) |> Array.distinct |> Array.sort
    let dfsNew = 
        dfs
        |> Array.map ( Frame.indexRowsWith outerKeys >> Frame.mapRowValues (Series.fillMissingWith 0.) >> Frame.ofRows)
    Array.fold (Frame.zip (+)) (Array.head dfsNew) (Array.tail dfsNew)
代码语言:javascript
运行
复制
[|priceFrame;dividends2|] |> zipAll

它可能很慢,但它可以处理多个帧。

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

https://stackoverflow.com/questions/61251194

复制
相关文章

相似问题

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