我正在进行个人市场分析项目。我已经得到了所有代表在目前市场上的转折点的数据结构,看起来像这样: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"}
在开始走“下”通过收集的剩余部分,创建与每个:low
项对,直到我打接下来的:high
项目。一旦我击中了下一个:high
项目,我对任何其他对都不感兴趣。在这种情况下,只会创建一对,即:high
和第一个:low
- 我在那里停止,因为下一个(第三个)项目是: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"}]}
接下来,我会移动到第二个项目集合{:low 1.12109, :time "2016-08-03T05:15:00.000000Z"}
在走“下”通过收集的剩余部分,创建与每个:high
项对,直到我打的未来:low
item。在这种情况下,我得到5个新记录,即:low
和接下来的5个:high
项目都是连续的;这些第一条记录看起来像
{: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"}]}
的这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"}]}
等。
之后,我得到一个:low
,所以我停在那里。
然后,我会转到第3项{:high 1.12173, :time "2016-08-03T04:30:00.000000Z"}
,然后“向下”,直到每个:low
创建一对,直到我点击下一个:high
。在这种情况下,我生成了0对,因为:high
后面紧接着是另一个:high
。同样在未来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
退出当我停止看到:high
s与我的:low
配对时,反之亦然,并在我遍历2个循环时将所有生成的记录累积到数组中。我只是不能找出一个很好的方法来使用Clojure攻击它...
任何想法?
一般建议:将问题分解为小函数,并查看'reduce' /'reduced' +的使用示例。 –
这是另一种常见面试问题的形式:“直方图可以存多少水”我想我会用这个方法让人们更加抽象地思考它 –
继续并使用您的嵌套循环和中断。在Clojure中,您通常会使用'loop'和'recur'代替 – skrat