Deedle frame indexRowsDate 不再对行进行排序?
Deedle frame indexRowsDate no longer sorting the rows?
我试图使用 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)失败。
为了使其正常工作,需要对数据框进行排序。
这是新行为还是错误?
谢谢
这是设计使然:
ReadCsv
函数按照数据在 CSV 文件中出现的顺序读取数据(对于雅虎股票价格,最新的价格在顶部)
indexRowsDate
函数不会更改顺序 - 它只是用指定列中的值替换键。
据我所知,你发布的代码片段总是这样(但我可能遗漏了什么?)如果你想创建有序的框架,你需要调用 sortRowsByKeys
(就像你所做的那样)或者,如果您正在从 Yahoo 读取数据,您可以只使用 Frame.rev
.
我试图使用 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)失败。
为了使其正常工作,需要对数据框进行排序。
这是新行为还是错误?
谢谢
这是设计使然:
ReadCsv
函数按照数据在 CSV 文件中出现的顺序读取数据(对于雅虎股票价格,最新的价格在顶部)indexRowsDate
函数不会更改顺序 - 它只是用指定列中的值替换键。
据我所知,你发布的代码片段总是这样(但我可能遗漏了什么?)如果你想创建有序的框架,你需要调用 sortRowsByKeys
(就像你所做的那样)或者,如果您正在从 Yahoo 读取数据,您可以只使用 Frame.rev
.