2017-07-05 58 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功能。