Deedle:使用SaveCsv
问题描述:
我试图用Deedle保存.csv
文件Deedle:使用SaveCsv
type all_trades_schema = CsvProvider<"/trading/backtesting/strategy logs/all_trades.csv">
(new_trades |> Frame.ofRecords).SaveCsv(log_dirname+"/new_trades.csv")
我的问题是,原来的(模板)文件中有列名, 但新文件没有任何列名称。
我该如何解决我的(小)问题?感谢
(附注,我的第一列是DateTime
,其他都是浮动的,但如果这是重要的,我想知道当有其他类型正确的语法)
答
从文档,你有两种选择:
- 通
includeRowKeys=true
作为作为参数传递给SaveCsv
,其中*keynames*
是头名的列表中的参数,以SaveCsv
- 通
keyNames=*keynames*
查看http://bluemountaincapital.github.io/Deedle/features.html的文档。
要获得从CsvProvider的头名,你可以这样做: all_trades_schema.GetSample().Headers
这会给你一个string [] option
,所以你需要解开了杜这样的:当你创建
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")
答
由CSV提供者使用Frame.ofRecords
返回的行中的Deedle框架,但遗憾的是,它不自动获取列名称,因为CSV提供程序将它们表示为元组 - 因此名称仅为Item1
,Item2
等,匹配th标准.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功能。
我已更新您的问题,以更清楚地表明您使用的是Deedle来保存CSV,而不是Csv类型的提供者。 – mydogisbox