2016-04-07 4 views
1

Deedleシリーズ<日時、シリーズ<日時、ObjectSeries >を反復処理を行います/ 2014 8:00:00 PM - > 62.13 62.67 62.13 62.27 3206
12/28/2014 9:00:00 PM - > 62.27 62.42 62.14 62.39 1620
12/28/2014 10:00:00 PM - > 62.4 62.41 62.16 62.21 1275
12/28/2014 11:00:00 PM - > 62.21 62.32 61.96 62.19 2791
12/29/2014 12:00:00 - > 62.17 62.25 62.08 62.23 1233
12:29/2014 1:00:00 AM - > 62.23 62.41 62.21 62.31 1186
12/29/2014 2:00: 00 AM - > 62.32 62.32 62.07 62.21 1446
2014年12月29日午前3時00分○○秒AM - > 62.22 62.35 62.17 62.28 1335
は、どのように私は、結果の出力で</p> <pre><code>// Create a dataframe containing the Open, High, Low, and Close let ohlc = cl |> Frame.sliceCols ["Open"; "High"; "Low"; "Close"; "Volume"] </code></pre> <p>を使用してデータフレームを作成している

今上記毎時試料から高い時間枠(毎日)を生成する

。返し

ohlc 
|> Frame.rows 
|> Series.resampleEquiv (fun d -> d.Date) 

は私が始める Series<DateTime,Series<DateTime,ObjectSeries<string>>>.

は私が(キー)、オープン、高、低、閉じるとボリューム列の日付を含む新しいデータフレームを作成します。オープンはシリーズの第1列の第1オープンです。 HighはシリーズのMax Highです。 Lowは、シリーズのMin Lowです。クローズは最後のクローズです。ボリュームだからシリーズ

に何かボリュームの合計です:代わりに行を使用してフレームレベルでこれをやろうとしているの

ohlc 
|> Frame.rows 
|> Series.resampleEquiv (fun d -> d.Date) 
|> ?? 
|> ?? 

、私が列を使用して、フレームでこれを行うしようとしたほうが良いでしょうか?ここで

UPDATE は、完成したコードです:

ohlc 
|> Frame.rows 
|> Series.resampleEquiv (fun d -> d.Date) 
|> Series.mapValues (fun s -> 
    let temp = Frame.ofRows s 
    series ["Open" => Series.firstValue temp?Open 
      "High" => defaultArg (Stats.max temp?High) nan 
      "Low" => defaultArg (Stats.min temp?Low) nan 
      "Close" => Series.lastValue temp?Close 
      "Volume" => defaultArg (Some(Stats.sum temp?Volume)) nan ]) 
|> Frame.ofRows 

私が使用することができませんでした:

"Volume" => defaultArg (Stats.sum temp?Volume) nan ]) 

これは私にエラーメッセージを出した。この式は、float型のオプションを持っていることが予想されましたここにはfloat型があります。 Some()関数をラップする必要がありました。 Stats.sumがこれを必要としているのにStat.maxとStats.minが必要な理由がわからない。

答えて

1

resampleEquivを呼び出した後、オブジェクト系列(元のフレームの異なる列を表す)のシリーズ(同じ日付のチャンクを表す)とシリーズ(異なる日付で同じ日付の値を表す)となります。

トップレベルシリーズを反復処理して、一連のオブジェクトシリーズ(各チャンク)をフレームに戻すことができます。そして、あなたは枠の上に集計を行い、新しい行を返すことができます。

source 
|> Series.resampleEquiv (fun d -> d.Date.Year) 
|> Series.mapValues (fun s -> 
    let temp = Frame.ofRows s 
    series [ "Open" => Series.firstValue temp?Open 
      "High" => defaultArg (Stats.max temp?High) nan ]) 
|> Frame.ofRows 

を私はオープンと高のためにそれをやっていますが、:-)アイデアを見ることができます。 Deedleは、チャンク内のすべてのアイテムが同じインデックスを持つことを知っているので、各チャンク上のFrame.ofRowsの呼び出しもかなり速くなければなりません。(あるいは、個々の行を繰り返し処理することもできますが、それは長くなります)。

関連する問題

 関連する問題