1

次のデータがあります。

let data = [(41609.00 , 10000., 3.822); (41609.00, 60000., 3.857); (41974.00 , 20000., 4.723 ); (41974.00, 30000., 3.22 ); (41974.00 , 4000., 4.655 ); (42339.00, 7000., 4.22 ); (42339.00 , 5000., 3.33)]

最初の列 = OADate、2 番目 = 出来高、3 番目 = 価格。

日付ごとにグループ化し、ボリュームを合計して、加重平均価格を計算したいと思います。これは私がこれまでに持っているものです:

let aggr data = 
    data
    //Multiply second and third column element by element
    |> Seq.map (fun (a, b, c) -> (a, b, b * c))
    //Group by first column
    |> Seq.groupBy fst
    //Sum column 2 & 3 based on group of column 1
    |> Seq.map (fun (d, e, f) -> (d, e |> Seq.sum, f |> Seq.sum)) 
    //take the sum and grouped column 1 & 2 and compute weighted average of the third
    |> Seq.map (fun (g, h, i) -> (g, h, i/h)) 

タプルの長さが異なるというタイプの不一致が発生しています。以前も同様の構文を問題なく使用していました。誰かが私を正しい方向に向けてもらえますか?

アップデート:

誰かが興味を持っている場合の解決策は次のとおりです。トーマスとリーフに感謝します

let aggr data = 
data
|> Seq.map (fun (a, b, c) -> (a, b, b * c))
|> Seq.groupBy (fun (a, b, c) -> a)
|> Seq.map (fun (key, group) -> group |> Seq.reduce (fun (a, b, c) (x, y, z) -> a, b+y , c+z))
|> Seq.map (fun (g, h, i) -> (g, h, i/h)) 
4

1 に答える 1

4

コードの最初の問題は、引数として呼び出しSeq.groupByていることです。は 2 要素タプルの最初の要素を返す関数ですが、入力が 3 要素タプルであるfstため、これは機能しません。残念ながら、この関数はどのタプルでもfst機能しません。3 つのうち最初の値を選択するラムダを記述する必要があります。

(...)
|> Seq.groupBy (fun (a, b, c) -> a)

次の問題は、次のステップでのマッピングです。グループ化により、最初の要素としてキー (時間) を含むタプルのリストと、元の入力シーケンスからの要素のリストを含むグループ (この場合は 3 要素のタプル) が生成されます。グループ内のすべての 2 番目のコンポーネントの合計と共にキーを返すには、次のように記述できます。

(...)
|> Seq.map (fun (key, group) -> key, group |> Seq.sumBy (fun (_, v, _) -> v))

2 列目と 3 列目で何をしたいのかよくわかりませんが、これで続行する方法がわかると思います。

于 2013-10-07T14:57:04.850 に答える