1

为了熟悉 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

谢谢,罗伯

4

1 回答 1

3

嘿,我认为如果您也将 f# 标签添加到您的问题中,您可能会得到更快的答案。

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

这是我想出的解决方案。请注意,我添加了一个新列 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")
于 2014-01-04T20:39:21.353 回答