Je cours un peu de code qui calcule une séquence d'enregistrements et appelle Frame.ofRecords
avec cette séquence comme argument. Les enregistrements sont calculés en utilisant PSeq.map
à partir de la bibliothèque FSharp.Collections.ParallelSeq
.Pourquoi Frame.ofRecords brouille-t-il ses résultats lorsqu'il reçoit une séquence générée par un calcul parallèle?
Si je convertis la séquence en liste, la sortie est OK. Voici le code et la sortie:
let summaryReport path (writeOpenPolicy: WriteOpenPolicy) (outputs: Output seq) =
let foo (output: Output) =
let temp =
{ Name = output.Name
Strategy = string output.Strategy
SharpeRatio = (fst output.PandLStats).SharpeRatio
CalmarRatio = (fst output.PandLStats).CalmarRatio }
printfn "************************************* %A" temp
temp
outputs
|> Seq.map foo
|> List.ofSeq // this is the line that makes a difference
|> Frame.ofRecords
|> frameToCsv path writeOpenPolicy ["Name"] "Summary_Statistics"
Name Name Strategy SharpeRatio CalmarRatio
0 Singleton_AAPL MyStrategy 0.317372564 0.103940018
1 Singleton_MSFT MyStrategy 0.372516931 0.130150478
2 Singleton_IBM MyStrategy Infinity
La commande printfn
me laisser vérifier par des inspections que dans chaque cas a été calculé correctement la temp
variable. La dernière ligne de code est juste une enveloppe autour de FrameExtensions.SaveCsv
.
Si je supprime la ligne |> List.ofSeq
alors ce qui sort est brouillée:
Name Name Strategy SharpeRatio CalmarRatio
0 Singleton_IBM MyStrategy 0.317372564 0.130150478
1 Singleton_MSFT MyStrategy 0.103940018
2 Singleton_AAPL MyStrategy 0.372516931 Infinity
Notez que le vide (correspondant à NaN
) et Infinity
articles sont maintenant dans les différentes lignes et d'autres choses sont également mélangés.
Pourquoi cela se produit-il?
Merci. Pourriez-vous me donner un indice sur la façon d'envoyer un PR aux docs? – Soldalma
@Soldalma - Les documents se trouvent dans le dépôt https://github.com/BlueMountainCapital/Deedle. Si vous avez fait des PR pour d'autres projets Github, cela devrait être tout ce dont vous avez besoin pour commencer. – rmunn
@rmunn - J'ai regardé dedans et je ne suis pas à l'aise de faire un PR. J'ai peur que je puisse endommager quelque chose. En tout cas, tout ce que je peux penser à faire est de convertir la séquence en une liste avant que 'Frame.ofRecords' la traite. Toute autre alternative serait assez compliquée et probablement très lente. – Soldalma