hanalyze-0.1.0.0: demo/io/ExternalIODemo.hs
{-# LANGUAGE OverloadedStrings #-}
-- | Hanalyze.DataIO.External のデモ。
--
-- Hackage 'dataframe' ライブラリ経由で CSV を読み込み:
-- - 列ごとの自動型推論結果
-- - 欠損値の検出
-- - imputeMean で欠損補完
import qualified Data.Text as T
import Hanalyze.DataIO.CSV (loadCSV)
import Hanalyze.DataIO.Preprocess (countMissing, imputeMean)
import qualified DataFrame as DX
import qualified DataFrame.Internal.DataFrame as DXD
import qualified DataFrame.Internal.Column as DXC
import Text.Printf (printf)
testCSV :: String
testCSV = unlines
[ "name,age,score,group"
, "Alice,30,95.5,A"
, "Bob,25,88.0,B"
, "Carol,35,,A" -- score 欠損
, "Dave,,77.2,B" -- age 欠損
, "Eve,42,NA,C" -- score "NA"
]
main :: IO ()
main = do
let path = "/tmp/external_demo.csv"
writeFile path testCSV
putStrLn "=================================="
putStrLn " Hanalyze.DataIO.External Demo"
putStrLn "=================================="
putStrLn ""
putStrLn "--- loadCSV (Hackage dataframe) ---"
Right df <- loadCSV path
printDFTypes df
putStrLn ""
putStrLn "--- countMissing ---"
mapM_ (\(c, m) ->
if m > 0 then printf " %s: %d missing\n" (T.unpack c) m
else printf " %s: complete\n" (T.unpack c))
(countMissing df)
putStrLn ""
putStrLn "--- imputeMean \"score\" ---"
case imputeMean "score" df of
Just df3 -> do
printDFTypes df3
printf " → score is now numeric (mean-imputed for NA rows)\n"
Nothing -> putStrLn " imputeMean failed"
putStrLn ""
putStrLn "Done."
printDFTypes :: DXD.DataFrame -> IO ()
printDFTypes df = do
let (rows, ncols) = DX.dimensions df
printf " Rows: %d, Columns: %d\n" rows ncols
mapM_ (\n -> case DXD.getColumn n df of
Just c -> printf " %-10s : %s (len=%d)\n"
(T.unpack n)
(DXC.columnTypeString c)
(DXC.columnLength c)
Nothing -> printf " %-10s : <missing>\n" (T.unpack n))
(DX.columnNames df)