packages feed

dataframe 0.3.1.1 → 0.3.1.2

raw patch · 7 files changed

+42/−38 lines, 7 filesdep ~granitePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: granite

API changes (from Hackage documentation)

+ DataFrame.Functions: median :: Expr Double -> Expr Double
+ DataFrame.Functions: percentile :: Int -> Expr Double -> Expr Double
- DataFrame.Internal.Statistics: median' :: Vector Double -> Double
+ DataFrame.Internal.Statistics: median' :: (Real a, Unbox a) => Vector a -> Double

Files

CHANGELOG.md view
@@ -1,5 +1,8 @@ # Revision history for dataframe +## 0.3.1.2+* Update granite version, again, for stackage.+ ## 0.3.1.1 * Aggregation now works on expressions rather than just column references. * Export writeCsv
app/Main.hs view
@@ -1,37 +1,27 @@-{-# LANGUAGE NumericUnderscores #-} -- Useful Haskell extensions. -- Allow string literal to be interpreted as any other string type.+ {-# LANGUAGE OverloadedStrings #-}  import qualified DataFrame as D -- import for general functionality.-import Data.Time-import qualified Data.Vector.Unboxed as VU-import System.Random.Stateful+import qualified DataFrame.Functions as F+import DataFrame ((|>)) +import Data.Function+import qualified Data.List as L+import Data.Maybe+import System.Environment+ main :: IO () main = do-    let n = 100_000_000-    g <- newIOGenM =<< newStdGen-    let range = (-20.0 :: Double, 20.0 :: Double)-    startGeneration <- getCurrentTime-    ns <- VU.replicateM n (uniformRM range g)-    xs <- VU.replicateM n (uniformRM range g)-    ys <- VU.replicateM n (uniformRM range g)-    let df = D.fromUnnamedColumns (map D.fromUnboxedVector [ns, xs, ys])-    endGeneration <- getCurrentTime-    let generationTime = diffUTCTime endGeneration startGeneration-    putStrLn $ "Data generation Time: " ++ show generationTime-    startCalculation <- getCurrentTime-    print $ D.mean "0" df-    print $ D.variance "1" df-    print $ D.correlation "1" "2" df-    endCalculation <- getCurrentTime-    let calculationTime = diffUTCTime endCalculation startCalculation-    putStrLn $ "Calculation Time: " ++ show calculationTime-    startFilter <- getCurrentTime-    print $ D.filter "0" (>= (19.9 :: Double)) df D.|> D.take 10-    endFilter <- getCurrentTime-    let filterTime = diffUTCTime endFilter startFilter-    putStrLn $ "Filter Time: " ++ show filterTime-    let totalTime = diffUTCTime endFilter startGeneration-    putStrLn $ "Total Time: " ++ show totalTime+    (d:b:_) <- fmap (map read) getArgs+    df <- D.readCsv "./data/housing.csv"+    let (Right e) = F.synthesizeFeatureExpr "median_house_value" d b (df |> D.exclude ["ocean_proximity", "total_bedrooms", "median_income"])++    print e++    mapM_ print (L.sortBy (flip compare `on` snd) (correlations (df  |> D.derive "n" e)))++correlations d = map (`correlationWithHouseValue` d) (D.columnNames d)+    where+        correlationWithHouseValue columnName d = (columnName, fromMaybe 0 (D.correlation columnName "median_house_value" d))
dataframe.cabal view
@@ -1,6 +1,6 @@ cabal-version:      2.4 name:               dataframe-version:            0.3.1.1+version:            0.3.1.2  synopsis: A fast, safe, and intuitive DataFrame library. @@ -75,7 +75,7 @@                       bytestring-lexing >= 0.5 && < 0.6,                       containers >= 0.6.7 && < 0.8,                       directory >= 1.3.0.0 && < 2,-                      granite ^>= 0.2,+                      granite ^>= 0.3,                       hashable >= 1.2 && < 2,                       process ^>= 1.6,                       snappy-hs ^>= 0.1,
src/DataFrame/Functions.hs view
@@ -97,6 +97,12 @@ mean :: (Columnable a, Real a, VU.Unbox a) => Expr a -> Expr Double mean expr = AggNumericVector expr "mean" mean' +median :: Expr Double -> Expr Double+median expr = AggNumericVector expr "mean" median'++percentile :: Int -> Expr Double -> Expr Double+percentile n expr = AggNumericVector expr (T.pack $ "percentile " ++ show n) ((VU.! 0) . quantiles' (VU.fromList [n]) 100)+ standardDeviation :: (Columnable a, Real a, VU.Unbox a) => Expr a -> Expr Double standardDeviation expr = AggNumericVector expr "stddev" (sqrt . variance') @@ -117,6 +123,11 @@     | (i, p) <- zip [0..] existingPrograms     , (j, q) <- zip [0..] existingPrograms     , i Prelude.>= j+    ] +++    [ ifThenElse (p DataFrame.Functions.>= percentile n p) p q+    | p <- existingPrograms+    , q <- existingPrograms ++ [lit 1, lit 0, lit (-1)]+    , n <- [1, 25, 50, 75, 99]     ] ++     [ p - q     | p <- existingPrograms
src/DataFrame/Internal/Expression.hs view
@@ -484,7 +484,7 @@     show :: forall a. (Show a) => Expr a -> String     show (Col name) = "(col @" ++ show (typeRep @a) ++ " " ++ show name ++ ")"     show (Lit value) = show value-    show (If cond l r) = "(ifThenElse " ++ show l ++ " " ++ show r ++ ")"+    show (If cond l r) = "(ifThenElse " ++ show cond ++ " " ++ show l ++ " " ++ show r ++ ")"     show (UnaryOp name f value) = "(" ++ T.unpack name ++ " " ++ show value ++ ")"     show (BinaryOp name f a b) = "(" ++ T.unpack name ++ " " ++ show a ++ " " ++ show b ++ ")"     show (AggNumericVector expr op _) = "(" ++ T.unpack op ++ " " ++ show expr ++ ")"
src/DataFrame/Internal/Statistics.hs view
@@ -15,7 +15,7 @@ mean' samp = VU.sum (VU.map realToFrac samp) / fromIntegral (VU.length samp) {-# INLINE mean' #-} -median' :: VU.Vector Double -> Double+median' :: (Real a, VU.Unbox a) => VU.Vector a -> Double median' samp     | VU.null samp = throw $ EmptyDataSetException "median"     | otherwise = runST $ do@@ -25,10 +25,10 @@             middleIndex = len `div` 2         middleElement <- VUM.read mutableSamp middleIndex         if odd len-            then pure middleElement+            then pure (realToFrac middleElement)             else do                 prev <- VUM.read mutableSamp (middleIndex - 1)-                pure ((middleElement + prev) / 2)+                pure (realToFrac (middleElement + prev) / 2) {-# INLINE median' #-}  -- accumulator: count, mean, m2
tests/Operations/Statistics.hs view
@@ -16,7 +16,7 @@     TestCase         ( assertEqual             "Median of an odd length data set"-            (D.median' (VU.fromList [179.94, 231.94, 839.06, 534.23, 248.94]))+            (D.median' (VU.fromList @Double [179.94, 231.94, 839.06, 534.23, 248.94]))             248.94         ) @@ -25,7 +25,7 @@     TestCase         ( assertEqual             "Median of an even length data set"-            (D.median' (VU.fromList [179.94, 231.94, 839.06, 534.23, 248.94, 276.37]))+            (D.median' (VU.fromList @Double [179.94, 231.94, 839.06, 534.23, 248.94, 276.37]))             262.655         ) @@ -35,7 +35,7 @@         ( assertExpectException             "[Error Case]"             (D.emptyDataSetError "median")-            (print $ D.median' (VU.fromList []))+            (print $ D.median' (VU.fromList @Double []))         )  skewnessOfDataSetWithSameElements :: Test