packages feed

dataframe-0.4.0.2: app/Benchmark.hs

{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}

import Data.Time
import qualified Data.Vector.Unboxed as VU
import qualified DataFrame as D
import qualified DataFrame.Functions as F
import System.Random.Stateful

import Data.Text (Text)
import DataFrame ((|>))
import DataFrame.DecisionTree
import DataFrame.Functions ((.=))

$(F.declareColumnsFromCsvFile "../../Downloads/playground-series-s5e11/train.csv")

main :: IO ()
main = do
    train <- D.readCsv "../../Downloads/playground-series-s5e11/train.csv"
    -- Create a new symbol for loan paid back since we are changing the type.
    let (loanPaidBack, train') =
            train
                |> D.deriveWithExpr
                    (F.name loan_paid_back)
                    (F.lift (round @Double @Int) loan_paid_back)

    let model = fitDecisionTree (TreeConfig 15 2) loanPaidBack (train' |> D.exclude ["id"])
    let trainPred = D.derive "prediction" model train'
    print $
        trainPred
            |> D.groupBy [F.name loanPaidBack, "prediction"]
            |> D.aggregate ["count" .= F.count loanPaidBack]
            |> D.sortBy [D.Desc "prediction", D.Desc (F.name loanPaidBack)]

    test <- D.readCsv "../../Downloads/playground-series-s5e11/test.csv"
    let withPredictions = D.derive "prediction" model test
    D.writeCsv
        "predictions.csv"
        ( withPredictions
            |> D.select ["id", "prediction"]
            |> D.rename "prediction" (F.name loan_paid_back)
        )