F#を学んでいます。Map<string, seq<DateTime * float>>
aを Deedle データフレーム ( http://bluemountaincapital.github.io/Deedle/tutorial.html#creating )に変換しようとしています。
次のコードを作成しました。
let folderFnct (aFrame:Frame) colName datesAndValues =
let newSerie = Series(Seq.map (fun x -> fst x) datesAndValues, Seq.map (fun y -> snd y) datesAndValues)
let newFrame = aFrame.Join([colName], [newSerie], kind=JoinKind.Inner)
newFrame
let mapToDeedleFrame myMap frame =
Map.fold ( fun s ticker datesAndValues -> folderFnct s ticker datesAndValues) frame myMap
mapToDeedleFrame
既存のフレームを使用してマップを折りたたみます。フォルダ機能folderFnct
:
- フレームを取る
- Map キーをフレーム内の列名として使用し、
- 値 (
<DateTime * float>
) を処理して、それらの Series を作成します。
問題は次のとおりです。
let newFrame = aFrame.Join([colName], [newSerie], kind=JoinKind.Inner)
どこ:
フィールド、コンストラクター、またはメンバー「結合」が定義されていません
この問題の潜在的な原因を 3 つ特定しました。
- なぜ
aFrame.Join
定義されていないのですか?の型を明示的に指定してみましたaFrame
- 空のフレームにフィード
mapToDeedleFrame
するにはどうすればよいですか? - が空
folderFnct
の場合に対してパターンマッチする必要がありますか?aFrame
どうもありがとう!
編集1
Tomas の提案に基づいて、これが私がこれまでに作成したものです。
let folderFnct (aFrame:Frame<'a, 'b>) columnName (seqOfTuples: seq<'a*'b>) =
let newSerie = Series(Seq.map (fun x -> fst x) seqOfTuples, Seq.map (fun y -> snd y) seqOfTuples)
let otherFrame = Frame([columnName], [newSerie])
let newFrame = aFrame.Join((otherFrame), kind=JoinKind.Inner)
newFrame
let mapToDeedleFrame myMap frame =
Map.fold ( fun state k vals -> folderFnct state k vals) frame myMap
不足している最後のステップは次のとおりです。空のフレームをすばやく渡すにはどうすればよいですか (おそらくダミーのフレームを作成しないようにしmapToDeedleFrame
ます)。私はのように試し[]
ました
let frame = mapToDeedleFrame mapTS []
これはばかげた質問かもしれませんが、私は F# をEmpty
初めて使用するので、言語に型が組み込まれているかどうか疑問に思っていました。
フォローアップの質問
私が読んだソースファイル(https://github.com/BlueMountainCapital/Deedle/blob/master/src/Deedle/Frame.fs):
member frame.Join<'V>(colKey, series:Series<'TRowKey, 'V>, kind, lookup) =
let otherFrame = Frame([colKey], [series])
frame.Join(otherFrame, kind, lookup)
関数の説明が画面に飛び出している間:
上の図から、フレームのタイプは colKey と同じであると推測できますが、私が理解しているように、colKey はシリーズからの結合で追加されたデータフレーム列のキーにすぎません。完全な初心者として、私はかなり混乱しています..
編集2
私はコードを書き直しました:
let seriesListMapper (colName:string, series:Series<'a, 'b>) =
[colName => series] |> frame
let frameListReducer (accFrame: Frame<'a, 'b>) (aFrame: Frame<'a, 'b>) =
accFrame.Join(aFrame, kind=JoinKind.Outer)
let seriesListToFrame (seriesList: List<string * Series<'a, 'b>>) =
seriesList |> List.map (fun elem -> seriesListMapper elem) |> List.reduce(fun acc elem -> frameListReducer acc elem)
問題はそれです:
let frame = seriesListToFrame seriesList
frame を Frame として返しますが、代わりに seriesList を使用します(string *Series<DateTime, float>) list
問題は次のとおりだと思います。
let seriesListMapper (colName:string, series:Series<'a, 'b>) =
[colName => series] |> frame
実際seriesListMapper
には次のように示されます。
seriesListMapper: colName:string * series:Series<'a, 'b> -> Frame<'a, string>
string
値がfromに変換される方法と理由がわかりませんfloat
。
興味深い点の 1 つは、frame.Format()
実際に でフレームをプロットすると、データが正しいように見えることです。へのこの「奇妙な」変換string
です。