【问题标题】:Deedle: Setting header names when using SaveCsvDeedle:使用 SaveCsv 时设置标题名称
【发布时间】:2017-07-05 12:57:49
【问题描述】:

我正在尝试使用 Deedle 来保存 .csv 文件

type all_trades_schema = CsvProvider<"/trading/backtesting/strategy logs/all_trades.csv">

(new_trades |> Frame.ofRecords).SaveCsv(log_dirname+"/new_trades.csv")

我遇到的问题是原始(模板)文件有列名, 但新文件没有任何列名。

如何解决我的(小)问题?谢谢

(请注意,我的第一列是DateTime,其他列是浮点数,但如果这很重要,我想知道其他类型时的正确语法)

【问题讨论】:

  • 我已更新您的问题,以更清楚地表明您正在使用 Deedle 保存 CSV,而不是 Csv 类型提供程序。

标签: csv f# f#-data deedle


【解决方案1】:

当您使用 Frame.ofRecords 从 CSV 提供程序返回的行创建 Deedle 框架时,遗憾的是它不会自动获取列名,因为 CSV 提供程序将这些表示为一个元组 - 所以名称只是 Item1、@ 987654323@等,匹配标准.NET元组类型的属性名。

要解决此问题,您可以使用 Frame.indexColsWith 替换列名:

let headers = match csv.Headers with Some v -> v | _ -> failwith "No headers!"
let df = 
  csv.Rows 
  |> Frame.ofRecords
  |> Frame.indexColsWith headers

df.SaveCsv(log_dirname+"/new_trades.csv")

如果您想包含行键,您可以指定 keyNames - 默认情况下它们只是序数,在这种情况下,您可能不想包含它们:

df.SaveCsv(log_dirname+"/new_trades.csv", includeRowKeys=false)

如果您为数据编制索引,例如日期是索引,那么你可以使用:

df.SaveCsv(log_dirname+"/new_trades.csv", includeRowKeys=true,keyNames=["Date"])

请注意,名称 keyNames 略微误导您需要指定多个名称 - 只有当您拥有多级索引时才会出现这种情况,但这有点奇怪且很少使用 Deedle 功能。

【讨论】:

    【解决方案2】:

    从文档中,您有两个选择:

    1. includeRowKeys=true 作为参数传递给SaveCsv
    2. keyNames=*keynames* 作为参数传递给SaveCsv,其中*keynames* 是标题名称列表

    有关文档,请参阅 http://bluemountaincapital.github.io/Deedle/features.html

    要从 CsvProvider 获取标头名称,您可以执行以下操作: all_trades_schema.GetSample().Headers

    这会给你一个string [] option,所以你需要像这样解开DU:

    match all_trades_schema.GetSample().Headers with
    | Some headers 
       -> (new_trades |> Frame.ofRecords).SaveCsv(log_dirname+"/new_trades.csv", keyNames = headers)
    | None 
       -> (new_trades |> Frame.ofRecords).SaveCsv(log_dirname+"/new_trades.csv")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多