timeseries 0.4.0 → 0.4.1
raw patch · 15 files changed
+120/−20 lines, 15 files
Files
- CHANGES.md +6/−1
- src/Data/TimeSeries.hs +14/−6
- src/Data/TimeSeries/IO/CSVReader.hs +10/−0
- src/Data/TimeSeries/IO/CSVWriter.hs +8/−0
- src/Data/TimeSeries/Series.hs +11/−10
- src/Data/TimeSeries/Sessions.hs +14/−1
- src/Data/TimeSeries/Stats.hs +8/−0
- src/Data/TimeSeries/Time.hs +9/−1
- test-src/Data/TimeSeries/IO/CSVSpec.hs +1/−0
- test-src/Data/TimeSeries/SeriesSpec.hs +1/−0
- test-src/Data/TimeSeries/SessionsSpec.hs +1/−0
- test-src/Data/TimeSeries/StatsSpec.hs +28/−0
- test-src/Data/TimeSeries/TimeSpec.hs +1/−0
- test-src/Spec.hs +2/−0
- timeseries.cabal +6/−1
CHANGES.md view
@@ -1,4 +1,9 @@-# Version 0.4+# Version 0.5++ * Removed implicit Prelude from cabal+++# Version 0.4 (2016-12-22) * reimplemented resampling function * Implemented Sessions
src/Data/TimeSeries.hs view
@@ -1,7 +1,15 @@ -- | TimeSeries library-module Data.TimeSeries (module X) where- import Data.TimeSeries.Series as X- import Data.TimeSeries.Stats as X- import Data.TimeSeries.Time as X- import Data.TimeSeries.IO.CSVReader as X- import Data.TimeSeries.IO.CSVWriter as X+module Data.TimeSeries+ ( module Data.TimeSeries.Series+ , module Data.TimeSeries.Stats+ , module Data.TimeSeries.Time+ , module Data.TimeSeries.IO.CSVReader+ , module Data.TimeSeries.IO.CSVWriter+ ) where+++import Data.TimeSeries.Series+import Data.TimeSeries.Stats+import Data.TimeSeries.Time+import Data.TimeSeries.IO.CSVReader+import Data.TimeSeries.IO.CSVWriter
src/Data/TimeSeries/IO/CSVReader.hs view
@@ -1,12 +1,21 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE OverloadedStrings #-} +{-|+Module: Data.TimeSeries.IO.CSVReader+Copyright: (c) 2016 Krzysztof Langner+License: BSD3+Stability: experimental+Portability: portable+Reading Time Series from CSV file+-} module Data.TimeSeries.IO.CSVReader ( HasHeader(..) , loadCSV )where +import Prelude import qualified Data.ByteString.Lazy as BS import qualified Data.Text as T import qualified Data.Csv as CSV@@ -18,6 +27,7 @@ , series ) +-- | Define if csv file has header data HasHeader = HasHeader | NoHeader -- | Load data from CSV file and create Time Series from it
src/Data/TimeSeries/IO/CSVWriter.hs view
@@ -1,4 +1,12 @@ {-# LANGUAGE OverloadedStrings #-}+{-|+Module: Data.TimeSeries.IO.CSVWriter+Copyright: (c) 2016 Krzysztof Langner+License: BSD3+Stability: experimental+Portability: portable+Write Time Series to the csv file.+-} module Data.TimeSeries.IO.CSVWriter( saveCSV ) where
src/Data/TimeSeries/Series.hs view
@@ -37,9 +37,10 @@ import Data.TimeSeries.Time (TimeResolution, nextTime) --- | Data points is single index value od time series-data DataPoint a = DP { dpIndex :: !UTCTime- , dpValue :: a }+-- | Data points is a time indexed value+data DataPoint a = DP { dpIndex :: !UTCTime -- ^ Get data point index.+ , dpValue :: a -- ^ Get data point value.+ } deriving (Show, Eq) instance Functor DataPoint where@@ -61,12 +62,12 @@ length = size --- | Create empty series+-- | Create empty series. emptySeries :: Series a emptySeries = Series [] --- | Create series+-- | Create series from UTCTime and value. series :: [(UTCTime, a)] -> Series a series xs = Series $ map (uncurry DP) xs @@ -82,12 +83,12 @@ where idx = map (posixSecondsToUTCTime . fromIntegral) ts --- | Convert Time Series to list+-- | Convert Time Series to the list. toList :: Series a -> [(UTCTime, a)] toList (Series xs) = map (\(DP x y) -> (x, y)) xs --- | Get series values+-- | Get series values as list. values :: Series a -> [a] values ts = map snd (toList ts) @@ -115,7 +116,7 @@ safeHead (i:_) = Just i --- | Return series subset+-- | Return series subset. -- Complexity O(n) -- -- >slice (Series [DP 1 41.3, DP 2 52.22, DP 3 3.0]) 2 3 == Series [DP 2 52.22, DP 3 3.0]@@ -128,7 +129,7 @@ slice start end (Series xs) = Series [DP x y | DP x y <- xs, x >= start && x <= end] --- | Apply function to rolling window to create new Series+-- | Apply rolling window to create a new Series. -- Rolling window is also called Sliding Window. rolling :: TimeResolution -- ^ Window size -> ([a] -> b) -- ^ Function applied to each window@@ -151,7 +152,7 @@ isInTimeRange dt (DP i _) (DP j _) = j < nextTime dt i --- | Resample Time series+-- | Resample Series. resample :: Fractional a => UTCTime -- ^ Starting time -> TimeResolution -- ^ Resampling resolution
src/Data/TimeSeries/Sessions.hs view
@@ -1,9 +1,19 @@+{-|+Module: Data.TimeSeries.Sessions+Copyright: (c) 2016 Krzysztof Langner+License: BSD3+Stability: experimental+Portability: portable+Operation on sessions.+-} module Data.TimeSeries.Sessions ( Session(..) , find ) where ++import Prelude import Data.Time (UTCTime) import Data.TimeSeries.Series (Series, toList) @@ -12,14 +22,17 @@ -- | Session is a time range of a single event -- Some examples:+-- -- * Session with web application+-- -- * Rain event+-- data Session = Session { sessionStart :: UTCTime , sessionEnd :: UTCTime } deriving (Eq, Show) --- | Find all session in a given time series+-- | Find all session in a given Time Series find :: TimeResolution -> Series Bool -> [Session] find dt ts = map (uncurry Session) xs' where
src/Data/TimeSeries/Stats.hs view
@@ -1,3 +1,11 @@+{-|+Module: Data.TimeSeries.Stats+Copyright: (c) 2016 Krzysztof Langner+License: BSD3+Stability: experimental+Portability: portable+Calculate Series statistics.+-} module Data.TimeSeries.Stats ( mean
src/Data/TimeSeries/Time.hs view
@@ -1,4 +1,11 @@--- | Helper functions operating on date and Time+{-|+Module: Data.TimeSeries.Time+Copyright: (c) 2016 Krzysztof Langner+License: BSD3+Stability: experimental+Portability: portable+Helper functions operating on date and Time+-} module Data.TimeSeries.Time ( TimeResolution , days@@ -8,6 +15,7 @@ , years ) where +import Prelude (Integer, Int, fromIntegral, (*)) import Data.Time( UTCTime(..) , NominalDiffTime , addDays
test-src/Data/TimeSeries/IO/CSVSpec.hs view
@@ -1,5 +1,6 @@ module Data.TimeSeries.IO.CSVSpec (spec) where +import Prelude import Test.Hspec import Data.Text.Time (parseISODateTime)
test-src/Data/TimeSeries/SeriesSpec.hs view
@@ -1,5 +1,6 @@ module Data.TimeSeries.SeriesSpec (spec) where +import Prelude import Test.Hspec import Control.Arrow (first) import Data.Time (UTCTime)
test-src/Data/TimeSeries/SessionsSpec.hs view
@@ -1,5 +1,6 @@ module Data.TimeSeries.SessionsSpec (spec) where +import Prelude import Test.Hspec import Data.Time.Clock.POSIX (posixSecondsToUTCTime, utcTimeToPOSIXSeconds) import Data.Time (NominalDiffTime)
+ test-src/Data/TimeSeries/StatsSpec.hs view
@@ -0,0 +1,28 @@+module Data.TimeSeries.StatsSpec (spec) where++import Prelude+import Test.Hspec+import Data.Time.Clock.POSIX (posixSecondsToUTCTime, utcTimeToPOSIXSeconds)++import qualified Data.TimeSeries as TS+++spec :: Spec+spec =++ describe "Base" $ do++ it "mean" $ do+ let idx = [1..]+ let values = [1.0, 2.0, 3.0] :: [Double]+ TS.mean (TS.tsSeries idx values) `shouldBe` 2.0++ it "variance" $ do+ let idx = [1..]+ let values = [1.0..6.0] :: [Double]+ TS.variance (TS.tsSeries idx values) `shouldBe` 35/12++ it "standard deviation" $ do+ let idx = [1..]+ let values = [1.0..6.0] :: [Double]+ TS.std (TS.tsSeries idx values) `shouldBe` sqrt (35/12)
test-src/Data/TimeSeries/TimeSpec.hs view
@@ -1,5 +1,6 @@ module Data.TimeSeries.TimeSpec (spec) where +import Prelude import Data.Time hiding (months) import Test.Hspec import Test.QuickCheck
test-src/Spec.hs view
@@ -1,3 +1,5 @@++import Prelude import Test.Hspec import qualified Data.TimeSeries.SeriesSpec import qualified Data.TimeSeries.SessionsSpec
timeseries.cabal view
@@ -1,5 +1,5 @@ name: timeseries-version: 0.4.0+version: 0.4.1 synopsis: Library for Time Series processing License: BSD3 License-file: LICENSE@@ -28,6 +28,8 @@ library hs-source-dirs: src default-language: Haskell2010+ default-extensions:+ NoImplicitPrelude ghc-options: -O2 -Wall -fwarn-tabs -funbox-strict-fields build-depends: base >= 4.7 && < 5,@@ -52,6 +54,8 @@ type: exitcode-stdio-1.0 main-is: Spec.hs default-language: Haskell2010+ default-extensions:+ NoImplicitPrelude ghc-options: -threaded -rtsopts -fsimpl-tick-factor=500 build-depends: base >= 4 && <5,@@ -72,6 +76,7 @@ Data.TimeSeries.Stats Data.TimeSeries.Time Data.TimeSeries.SeriesSpec+ Data.TimeSeries.StatsSpec Data.TimeSeries.SessionsSpec Data.TimeSeries.TimeSpec Data.TimeSeries.IO.CSVReader