1

我试图使用 Deedle(从 gi​​thub 20150407 下载)来测试数据框上的一些 windowInto 函数。但是我注意到以下行为:

#I "../../bin/"
#r "Deedle.dll"

open System
open System.Data
open System.Dynamic
open System.Collections.Generic
open Deedle


let df1 = Frame.ReadCsv(__SOURCE_DIRECTORY__ + "/data/MSFT.csv", inferRows=10)  
           |> Frame.take 5 |> Frame.indexRowsDate "Date" 
df1.Print();
let df2 = df1   |> Frame.sortRowsByKey
df2.Print(); 

                          Open  High  Low   Close Volume   Adj Close 
27/01/2012 12:00:00 AM -> 29.45 29.53 29.17 29.23 44187700 29.23     
26/01/2012 12:00:00 AM -> 29.61 29.70 29.40 29.50 49102800 29.50     
25/01/2012 12:00:00 AM -> 29.07 29.65 29.07 29.56 59231700 29.56     
24/01/2012 12:00:00 AM -> 29.47 29.57 29.18 29.34 51703300 29.34     
23/01/2012 12:00:00 AM -> 29.55 29.95 29.35 29.73 76078100 29.73     
                          Open  High  Low   Close Volume   Adj Close 
23/01/2012 12:00:00 AM -> 29.55 29.95 29.35 29.73 76078100 29.73     
24/01/2012 12:00:00 AM -> 29.47 29.57 29.18 29.34 51703300 29.34     
25/01/2012 12:00:00 AM -> 29.07 29.65 29.07 29.56 59231700 29.56     
26/01/2012 12:00:00 AM -> 29.61 29.70 29.40 29.50 49102800 29.50     
27/01/2012 12:00:00 AM -> 29.45 29.53 29.17 29.23 44187700 29.23     
val df1 : Frame<DateTime,string>
val df2 : Frame<DateTime,string>
val it : unit = ()

indexRowDate 之后的数据帧不再按升序排列其行。这将导致任何基于索引的操作(如 windowInto)失败。

为了使其工作,需要对数据框进行排序。

这是新行为还是错误?

谢谢

4

1 回答 1

1

这是设计使然:

  • ReadCsv函数按照它们在 CSV 文件中出现的顺序读取数据(对于 Yahoo 股票价格,最近的价格位于顶部)

  • indexRowsDate函数不会更改顺序 - 它只是用指定列中的值替换键。

据我所知,你发布的片段总是这样(但我可能会遗漏一些东西?)如果你想创建有序框架,你需要调用sortRowsByKeys(就像你一样)或者如果你正在从雅虎读取数据,您可能只使用Frame.rev.

于 2015-04-07T12:51:18.060 回答