私は個人市場分析プロジェクトに取り組んでいます。概念的にClojureの複雑なデータ操作
[{:high 1.121455, :time "2016-08-03T05:15:00.000000Z"}
{:low 1.12109, :time "2016-08-03T05:15:00.000000Z"}
{:high 1.12173, :time "2016-08-03T04:30:00.000000Z"}
{:high 1.121925, :time "2016-08-03T00:00:00.000000Z"}
{:high 1.12215, :time "2016-08-02T23:00:00.000000Z"}
{:high 1.12273, :time "2016-08-02T21:15:00.000000Z"}
{:high 1.12338, :time "2016-08-02T18:15:00.000000Z"}
{:low 1.119215, :time "2016-08-02T12:30:00.000000Z"}
{:low 1.118755, :time "2016-08-02T12:00:00.000000Z"}
{:low 1.117575, :time "2016-08-02T06:00:00.000000Z"}
{:low 1.117135, :time "2016-08-02T04:30:00.000000Z"}
{:low 1.11624, :time "2016-08-02T02:00:00.000000Z"}
{:low 1.115895, :time "2016-08-01T21:30:00.000000Z"}
{:low 1.11552, :time "2016-08-01T11:45:00.000000Z"}
{:low 1.11049, :time "2016-07-29T12:15:00.000000Z"}
{:low 1.108825, :time "2016-07-29T08:30:00.000000Z"}
{:low 1.10839, :time "2016-07-29T08:00:00.000000Z"}
{:low 1.10744, :time "2016-07-29T05:45:00.000000Z"}
{:low 1.10716, :time "2016-07-28T19:30:00.000000Z"}
{:low 1.10705, :time "2016-07-28T18:45:00.000000Z"}
{:low 1.106875, :time "2016-07-28T18:00:00.000000Z"}
{:low 1.10641, :time "2016-07-28T05:45:00.000000Z"}
{:low 1.10591, :time "2016-07-28T01:45:00.000000Z"}
{:low 1.10579, :time "2016-07-27T23:15:00.000000Z"}
{:low 1.105275, :time "2016-07-27T22:00:00.000000Z"}
{:low 1.096135, :time "2016-07-27T18:00:00.000000Z"}]
が、私は、:high
/:low
のペアを一致させる(高 - 低価格帯をうまくしたい:私はこのようになり、市場内のすべての最近の転換点を表すデータ構造を、持っています)と中点(平均は高値の&です)しかし、私は可能なすべてのペアを生成したくありません。私が何をしたいか
コレクション{:high 1.121455, :time "2016-08-03T05:15:00.000000Z"}
に第一のアイテムから開始し、コレクションの残りを通じて「ダウン」を歩く、私は次の:high
項目を当たるまで、すべての:low
項目とペアを作成しています。その次の:high
アイテムにヒットしたら、それ以上のペアには興味がありません。この場合、作成されたペアは1つだけです。:high
と1番目の:low
- 次の(3番目の)アイテムが:high
であるため停止します。 1レコードが次
{:price-range 0.000365, :midpoint 1.121272, :extremes [{:high 1.121455, :time "2016-08-03T05:15:00.000000Z"}{:low 1.12109, :time "2016-08-03T05:15:00.000000Z"}]}
のようになります。生成された私は、次を打つまで、私はすべての
:high
アイテムとペアを作成、収集
{:low 1.12109, :time "2016-08-03T05:15:00.000000Z"}
で第2項目に移動し、コレクションの残りを通じて「ダウン」を歩くと思います
:low
アイテム。この場合、私は
:low
と次の5つの
:high
という項目がすべて連続した5つの新しいレコードを生成します。これらの5つのレコードの最初は、これらの5つのレコードの第二のように
{:price-range 0.000835, :midpoint 1.1215075, :extremes [{:low 1.12109, :time "2016-08-03T05:15:00.000000Z"}{:high 1.121925, :time "2016-08-03T00:00:00.000000Z"}]}
と次のようになり
{:price-range 0.000064, :midpoint 1.12131, :extremes [{:low 1.12109, :time "2016-08-03T05:15:00.000000Z"}{:high 1.12173, :time "2016-08-03T04:30:00.000000Z"}]}
ようになります。
その後、私は:low
を取得します。そこで私はそこで止まります。
3番目の項目{:high 1.12173, :time "2016-08-03T04:30:00.000000Z"}
に移動して、の次の:high
になるまで、すべてのペアで「下に」歩いて歩いてください。この場合、:high
の直後にもう1つの:high
が続きますので、0ペアが生成されます。 3次で同じ:すべての別の:high
直後れる高いアイテム、次に私は、7項目{:high 1.12338, :time "2016-08-02T18:15:00.000000Z"}
に取得し、それは、次の20の:low
項目のそれぞれと対を生成しなければなりません。
マイ生成された結果が作成されたすべてのペアのリストのようになります。
[{:price-range 0.000365, :midpoint 1.121272, :extremes [{:high 1.121455, :time "2016-08-03T05:15:00.000000Z"}{:low 1.12109, :time "2016-08-03T05:15:00.000000Z"}]}
{:price-range 0.000064, :midpoint 1.12131, :extremes [{:low 1.12109, :time "2016-08-03T05:15:00.000000Z"}{:high 1.12173, :time "2016-08-03T04:30:00.000000Z"}]}
...
私は、Pythonのようなものを使ってこれを実装した場合、私はおそらく終了しbreak
を使用して、ネストされたループのカップルを使用したいです内部ループは私が:low
と対にして、逆の場合は:high
を見て停止し、生成されたすべてのレコードを2つのループを横切って配列に累積します。私はちょうどClojureを使用してそれを攻撃する良い方法を働くことができません...
任意のアイデア?
一般的なアドバイス:問題を小さな関数に分割し、その使用法の 'reduce' /' reduced' +例を見てください。 –
これは一般的なインタビューの質問のもう一つの形成です。「ヒストグラムがどれくらいの水分を保持できるか」私は、人々がそれをより抽象的に考えさせるために、代わりにこの絵を使用します。 –
あなたのネストされたループと休憩を使いましょう。Clojureでは、代わりに通常は 'loop'と' recur'を使用します – skrat