我正在尝试使用 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 提供程序将这些表示为元组 - 所以名称只是 Item1
、Item2
等等,匹配标准 .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/