blob: 64e2dbe62bda316a755e476927ba23b3ec6d527a [file]
import org.jetbrains.kotlinx.dataframe.*
import org.jetbrains.kotlinx.dataframe.annotations.*
import org.jetbrains.kotlinx.dataframe.api.*
import org.jetbrains.kotlinx.dataframe.io.*
fun box(): String {
val csv = """
pclass;survived;name;sex;age;sibsp;parch;ticket;fare;cabin;embarked;boat;body;homedest
1;1;Allen, Miss. Elisabeth;female;29;0;0;24160;211.34;B5;S;2;;St Louis, MO
1;1;Anderson, Mr. Harry;male;48;0;0;19952;26.55;E12;S;3;;New York, NY
1;0;Andrews, Mr. Thomas;male;39;0;0;112050;0;A36;S;;;Belfast, NI
1;1;Appleton, Mrs. Charlotte;female;53;2;0;11769;51.48;C101;S;D;;Bayside, Queens, NY
1;0;Astor, Col. John Jacob;male;47;1;0;PC17757;227.53;C62;C;;124;New York, NY
1;1;Astor, Mrs. Madeleine;female;18;1;0;PC17757;227.53;C62;C;4;;New York, NY
1;1;Behr, Mr. Karl;male;26;0;0;111369;30;C148;C;5;;New York, NY
1;0;Blackwell, Mr. Stephen;male;45;0;0;113784;35.5;T;S;;;Trenton, NJ
1;1;Bonnell, Miss. Caroline;female;30;0;0;36928;164.87;C7;S;8;;Youngstown, OH
1;1;Smith, Miss. Jane;female;15;0;0;12345;50;B10;S;2;;New York, NY
""".trim()
val df = DataFrame.readCsvStr(csv, delimiter = ';')
// Complete schema is not necessary,
// a few string api operations can provide enough info for further type safe data manipulations
.convert { "survived"<Int>() }.with { it == 1 }
.convert("age").toInt()
// filter
df.filter {
survived && "homedest"<String?>().orEmpty().endsWith("NY") && (age?.let { it in 10..20 } ?: false)
}.let {
val v: Boolean = it[0].survived
it.compareSchemas()
}
// add column
df.add("birthYear") { age?.let { 1912 - it } }.let {
val v: Int? = it[0].birthYear
it.compareSchemas()
}
// sort rows
df.sortByDesc { age }.let {
val v: Int? = it[0].age
it.compareSchemas()
}
// aggregate data
df.groupBy { "pclass"() }.aggregate {
maxBy { age }["name"] into "oldest person"
count { survived } into "survived"
}.let {
val v: Any? = it[0].`oldest person`
it.compareSchemas()
}
return "OK"
}