2017-07-05 5 views
2

Je suis en train d'utiliser Deedle pour sauver .csv fichiersDeedle: Définition des noms d'en-tête lors de l'utilisation SaveCsv

type all_trades_schema = CsvProvider<"/trading/backtesting/strategy logs/all_trades.csv"> 

(new_trades |> Frame.ofRecords).SaveCsv(log_dirname+"/new_trades.csv") 

le problème que j'ai est que le fichier (modèle) d'origine a les noms de colonnes, mais le nouveau fichier n'a pas de noms de colonnes.

Comment puis-je résoudre mon (petit) problème? grâce

(de la note, ma première colonne est DateTime, les autres sont float, mais si cela est important que je voudrais connaître la syntaxe à droite quand il y a d'autres types)

+1

J'ai mis à jour votre question pour indiquer plus clairement que vous utilisez Deedle pour enregistrer un fichier CSV, et non le fournisseur de type Csv. – mydogisbox

Répondre

2

De la documentation, vous avez deux options:

  1. passe includeRowKeys=true comme paramètre à SaveCsv
  2. passe keyNames=*keynames* comme paramètre à SaveCsv, où *keynames* est une liste de noms d'en-tête

Voir http://bluemountaincapital.github.io/Deedle/features.html pour la documentation.

Pour obtenir les noms d'en-tête de la CsvProvider, vous pouvez faire: all_trades_schema.GetSample().Headers

Cela vous donnera un string [] option, vous aurez donc besoin de déballer l'UA comme:

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

Lorsque vous créez Deedle frame à partir des lignes retournées par le fournisseur CSV en utilisant Frame.ofRecords, il ne reçoit malheureusement pas automatiquement les noms de colonnes, car le fournisseur CSV les représente sous la forme d'un tuple - donc les noms sont juste Item1, Item2 et ainsi de suite, correspondant Noms de propriété e du type de tuple .NET standard.

Pour résoudre ce problème, vous pouvez utiliser Frame.indexColsWith qui vous permet de remplacer les noms de colonnes:

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") 

Vous pouvez spécifier keyNames si vous souhaitez inclure les touches de ligne - ce sont des chiffres que ordinales par défaut, dans lequel Dans le cas contraire, vous ne voulez probablement pas les inclure:

df.SaveCsv(log_dirname+"/new_trades.csv", includeRowKeys=false) 

Si vous indexez vos données de telle sorte que, par exemple, la date est l'indice, vous pouvez utiliser:

df.SaveCsv(log_dirname+"/new_trades.csv", includeRowKeys=true,keyNames=["Date"]) 

Notez que le nom keyNames suggère un peu fallacieuse que vous devez spécifier plusieurs noms - c'est seulement le cas lorsque vous avez des indices à plusieurs niveaux, mais c'est caractéristique de Deedle quelque peu étrange et rarement utilisée.