2

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 つ特定しました。

  1. なぜaFrame.Join定義されていないのですか?の型を明示的に指定してみましたaFrame
  2. 空のフレームにフィードmapToDeedleFrameするにはどうすればよいですか?
  3. が空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です。

4

1 に答える 1

6

の型注釈にはfolderFnct、 がありますaFrame:Frame。ただし、データ フレームを表す型は、2 つの型引数 (それぞれ行と列のインデックスの型を表す) を持つジェネリック型であるため、注釈はaFrame:Frame<_, _>.

シリーズをフレームに追加する別の方法は、変更操作を使用することです。

aFrame.AddSeries(colName, newSeries)

ただし、これは左結合のみをサポートします (データ フレームは、新しいシリーズを追加することによってのみ変更できますが、インデックスを変更する方法では変更できません)。ただし、このアプローチを使用して、フレームが構築されたら、フレームからすべての欠損値を削除できる場合があります。

編集:ジェネリック型に関する質問に答えるには:

  • Series<K, V>Ktypeの値を含むtype のキーを持つシリーズを表しますV(たとえば、通常インデックス付きの観測値を持つシリーズは と を持ちK=intますV=float)

  • Frame<R, C>Rは、行が によって索引付けされ、列が によって索引付けされている異種データ (列ごとに異なるタイプの可能性がある) を含むフレームを表しますC。通常はインデックス付きフレームR=intの場合、通常、列にはそのように名前が付けられますC=string(ただし、他のインデックスも使用できます)

于 2013-11-05T18:35:49.943 に答える