2017-07-05 20 views
2

我试图用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,其他都是浮动的,但如果这是重要的,我想知道当有其他类型正确的语法)

+1

我已更新您的问题,以更清楚地表明您使用的是Deedle来保存CSV,而不是Csv类型的提供者。 – mydogisbox

回答

2

从文档,你有两种选择:

  1. includeRowKeys=true作为作为参数传递给SaveCsv,其中*keynames*是头名的列表中的参数,以SaveCsv
  2. 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") 
4

由CSV提供者使用Frame.ofRecords返回的行中的Deedle框架,但遗憾的是,它不自动获取列名称,因为CSV提供程序将它们表示为元组 - 因此名称仅为Item1Item2等,匹配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功能。