如何使用Deedle过滤行

时间:2013-12-31 13:27:04

标签: f# deedle

为了适应Deedle,我制作了一个代表视频租借记录的CSV文件。

   RentedOn,Shop,Title
   12/dec/2013 00:00:00,East,Rambo
   12/dec/2013 00:00:00,West,Rocky
   12/dec/2013 00:00:00,West,Rambo
   12/dec/2013 00:00:00,East,Rambo
   13/dec/2013 00:00:00,East,Rocky
   13/dec/2013 00:00:00,East,Rocky
   13/dec/2013 00:00:00,East,Rocky
   14/dec/2013 00:00:00,West,Rocky 2

我有以下功能,按商店(东或西)分组租借:

let overview =
    __SOURCE_DIRECTORY__ + "/rentallog.csv"
    |> Frame.ReadCsv
    |> Frame.groupRowsByString "Shop"
    |> Frame.nest
    |> Series.map (fun dtc df -> 
        df.GetSeries<string>("Title") |> Series.groupBy (fun k v -> v)
        |> Frame.ofColumns |> Frame.countValues )
    |> Frame.ofRows

我希望能够按RentedOn col中的日期过滤行,但是,我不知道如何执行此操作。我知道它可能使用了Frame.filterRowValues函数,但我不确定使用它的最佳方法。任何有关如何过滤的指导将不胜感激。

根据@jeremyh建议进行更新

let overview rentedOnDate =
    let addRentedDate (f:Frame<_,_>) = 
        f.AddSeries ("RentedOnDate", f.GetSeries<DateTime>("RentedOn"))
        f
    __SOURCE_DIRECTORY__ + "/rentallog.csv"
    |> Frame.ReadCsv
    |> addRentedDate
    |> Frame.filterRowValues (fun row -> row.GetAs<DateTime>("RentedOnDate") = rentedOnDate)
    |> Frame.groupRowsByString "Shop"
    |> Frame.nest
    |> Series.map (fun dtc df -> 
        df.GetSeries<string>("Title") |> Series.groupBy (fun k v -> v)
        |> Frame.ofColumns |> Frame.countValues )
    |> Frame.ofRows

谢谢, 罗布

1 个答案:

答案 0 :(得分:3)

嘿,我认为如果你在问题中添加一个f#标签,你可能会得到更快的答案。

我使用以下link来回答您的问题,其中包含一些有用的示例。

这是我提出的解决方案。请注意,我添加了一个新列RentedOnDate,它实际上具有我进行过滤的DateTime类型。

let overview rentedOnDate =
    let rentalLog = 
        __SOURCE_DIRECTORY__ + "/rentallog.csv"
        |> Frame.ReadCsv
    rentalLog
    |> Frame.addSeries "RentedOnDate" (rentalLog.GetSeries<DateTime>("RentedOn"))
    |> Frame.filterRowValues (fun row -> row.GetAs<DateTime>("RentedOnDate") = rentedOnDate)
    |> Frame.groupRowsByString "Shop"
    |> Frame.nest
    |> Series.map (fun dtc df -> 
        df.GetSeries<string>("Title") |> Series.groupBy (fun k v -> v)
        |> Frame.ofColumns |> Frame.countValues )
    |> Frame.ofRows

// Testing
overview (DateTime.Parse "12/dec/2013 00:00:00")