目前我的数据如下所示:
3-150
2-151
4-152
5-154
7-154
1-155
9-155
6-156
这只是人工的“tick”数据,第一个代表tick的值,第二个代表“午夜后的秒数”
因此,对于股票数据,我需要将这些数据分类为“条形”。那就是我需要在给定的时间内将所有的酒吧组合在一起。
一个例子是 4 秒小节。午夜后 0-3 秒的刻度将是 1 个小节,午夜后 4-7 秒将是另一个小节。
我有看起来像这样的导管/水槽,它将计算 1 个条形尺寸:
{-# LANGUAGE OverloadedStrings #-}
import Data.Maybe (isJust, fromJust)
import qualified Data.ByteString.Char8 as C
import Control.Applicative ((<$>), (<*>))
import Data.Conduit -- the core library
import qualified Data.Conduit.List as CL -- some list-like functions
import qualified Data.Conduit.Binary as CB -- bytes
import qualified Data.Conduit.Text as CT
data MyData = MyData Int Int
deriving (Show)
binaryToData :: C.ByteString -> Maybe MyData
binaryToData bn = do
let parts = C.split '-' bn
case parts of
(a:b:[]) -> MyData <$> (fst <$> (C.readInt a)) <*> (fst <$> (C.readInt b))
_ -> Nothing
streamGenerator =
CB.sourceFile "sample.txt" =$=
CB.lines =$=
CL.map binaryToData =$=
CL.filter isJust =$=
CL.map fromJust =$=
CL.groupBy (\(MyData _ x) (MyData _ y) -> (x `quot` 4) == (y `quot` 4))
main :: IO ()
main = do
mlines <- runResourceT $ streamGenerator $$ CL.consume
print mlines
但是,我需要同时关闭流中的多个酒吧信息。例如,对于每 2 秒的小节,我需要一个 4 秒的小节。如果被调用的 2 秒条位于 4 秒条的中间,我想输出前 4 秒条。
这就是我的意思:
标准柱(数字表示柱应包含的按午夜后的秒数计的刻度):
2 second bar : 0-1, 2-3, 4-5, etc...
4 second bar : 0-3, 4-7, 8-11, etc...
combo: (0-1, null), (2-3, 0-3), (4-5, 0-3), (6-7, 4-7), etc...
因此,而不是我当前的 2 秒和 4 秒小节分组管道:
4 second bar : [[MyData 3 150,MyData 2 151],[MyData 4 152,MyData 5 154,MyData 7 154,MyData 1 155,MyData 9 155],[MyData 6 156]]
2 second bar : [[MyData 3 150,MyData 2 151],[MyData 4 152],[MyData 5 154,MyData 7 154,MyData 1 155,MyData 9 155],[MyData 6 156]]
我想要这个管道流:
[([MyData 3 150,MyData 2 151], [MyData 3 150,MyData 2 151])
,([MyData 4 152], [MyData 3 150,MyData 2 151])
,([MyData 5 154,MyData 7 154,MyData 1 155,MyData 9 155], [MyData 4 152,MyData 5 154,MyData 7 154,MyData 1 155,MyData 9 155])
,([MyData 6 156],[MyData 4 152,MyData 5 154,MyData 7 154,MyData 1 155,MyData 9 155])]
但是如果不做一些丑陋的事情,我似乎无法做到这一点。