我试图使用Deedle(从github 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之后的dataFrame不再按升序排序。这将导致任何基于索引的操作,如windowInto失败。
为了使其工作,需要对数据框进行排序。
这是新行为还是错误?
谢谢
答案 0 :(得分:1)
这是设计:
ReadCsv
函数按CSV文件中出现的顺序读取数据(对于Yahoo股票价格,最近的价格位于顶部)
indexRowsDate
函数不会更改顺序 - 它只是用指定列中的值替换键。
据我所知,你发布的片段总是这样(但我可能会遗漏一些东西?)如果你想创建有序帧,你需要调用sortRowsByKeys
(就像你做的那样)或者你正在阅读雅虎的数据,你可以使用Frame.rev
。