csv - Deedle:使用 SaveCsv 时设置标题名称

标签 csv f# f#-data deedle

我正在尝试使用 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,其他列是 float 的,但如果这很重要,我想知道有其他类型时的正确语法)

最佳答案

当您使用 Frame.ofRecords 从 CSV 提供程序返回的行创建 Deedle 框架时,不幸的是它不会自动获取列名称,因为 CSV 提供程序将这些表示为元组 - 所以名称只是 Item1Item2 等等,匹配标准 .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 功能。

关于csv - Deedle:使用 SaveCsv 时设置标题名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44926962/

相关文章:

Python 将奇怪的 Unicode 写入 CSV

python - 如何在 python pandas 中将 csv 转换为嵌套 json?

java - 从CSV文件添加数据和输出数据必须在java中按行对齐

f# - 为什么 Async.RunSynchronously 挂起?

f# - FSharp.Data Csv.Load() 失败,仅支持 Web 位置

python - 比较两列(在两个文件中),然后打印相似行和不同行

io - 在 F# 中正确处理流

serialization - 使用 Json.net 往返 F# 可区分联合时出现问题

f# - 使用 F# 的 Freebase 国家

f# - 在 HTML 解析器中按类或 id 查找对象