Skip to content

Commit fc88cfc

Browse files
committed
wip median
1 parent f6d3309 commit fc88cfc

File tree

5 files changed

+66
-24
lines changed

5 files changed

+66
-24
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/max.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ public inline fun <T, reified R : Comparable<R & Any>?> DataColumn<T>.maxOfOrNul
5959
// region DataRow
6060

6161
@Deprecated(ROW_MAX_OR_NULL, level = DeprecationLevel.ERROR)
62-
public fun AnyRow.rowMaxOrNull(): Any? = error(ROW_MAX_OR_NULL)
62+
public fun AnyRow.rowMaxOrNull(): Nothing? = error(ROW_MAX_OR_NULL)
6363

6464
@Deprecated(ROW_MAX, level = DeprecationLevel.ERROR)
65-
public fun AnyRow.rowMax(): Any = error(ROW_MAX)
65+
public fun AnyRow.rowMax(): Nothing = error(ROW_MAX)
6666

6767
public inline fun <reified T : Comparable<T>> AnyRow.rowMaxOfOrNull(skipNaN: Boolean = skipNaN_default): T? =
6868
Aggregators.max<T>(skipNaN).aggregateOfRow(this) { colsOf<T?>() }

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,47 +13,85 @@ import org.jetbrains.kotlinx.dataframe.annotations.Refine
1313
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1414
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
1515
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.Aggregators
16-
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.aggregateCalculatingValueType
1716
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.cast
1817
import org.jetbrains.kotlinx.dataframe.impl.aggregation.intraComparableColumns
1918
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateAll
2019
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateFor
2120
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf
21+
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOfRow
2222
import org.jetbrains.kotlinx.dataframe.impl.columns.toComparableColumns
2323
import org.jetbrains.kotlinx.dataframe.impl.suggestIfNull
24-
import org.jetbrains.kotlinx.dataframe.math.median
24+
import org.jetbrains.kotlinx.dataframe.math.medianOrNull
25+
import org.jetbrains.kotlinx.dataframe.util.ROW_MEDIAN
26+
import org.jetbrains.kotlinx.dataframe.util.ROW_MEDIAN_OR_NULL
2527
import kotlin.reflect.KProperty
2628

2729
// region DataColumn
2830

29-
public fun <T : Comparable<T>> DataColumn<T?>.median(): T = medianOrNull().suggestIfNull("median")
31+
public fun <T : Comparable<T & Any>?> DataColumn<T>.median(): T & Any = medianOrNull().suggestIfNull("median")
3032

31-
public fun <T : Comparable<T>> DataColumn<T?>.medianOrNull(): T? =
32-
Aggregators.median.cast<T>().aggregateSingleColumn(this)
33+
public fun <T : Comparable<T & Any>?> DataColumn<T>.medianOrNull(): T? =
34+
Aggregators.median<T>().aggregateSingleColumn(this)
3335

34-
public inline fun <T, reified R : Comparable<R>> DataColumn<T>.medianOfOrNull(noinline expression: (T) -> R?): R? =
35-
Aggregators.median.cast<R?>().aggregateOf(this, expression)
36+
public fun <T> DataColumn<T>.median(
37+
skipNaN: Boolean = skipNaN_default,
38+
): Double
39+
where T : Comparable<T & Any>?, T : Number? = medianOrNull(skipNaN = skipNaN).suggestIfNull("median")
3640

37-
public inline fun <T, reified R : Comparable<R>> DataColumn<T>.medianOf(noinline expression: (T) -> R?): R =
38-
medianOfOrNull(expression).suggestIfNull("medianOf")
41+
public fun <T> DataColumn<T>.medianOrNull(
42+
skipNaN: Boolean = skipNaN_default,
43+
): Double?
44+
where T : Comparable<T & Any>?, T : Number? = Aggregators.median<T>(skipNaN).aggregateSingleColumn(this)
45+
46+
public inline fun <T, reified R : Comparable<R & Any>?> DataColumn<T>.medianOf(
47+
crossinline expression: (T) -> R,
48+
): R & Any = medianOfOrNull(expression).suggestIfNull("medianOf")
49+
50+
public inline fun <T, reified R : Comparable<R & Any>?> DataColumn<T>.medianOfOrNull(
51+
crossinline expression: (T) -> R,
52+
): R? = Aggregators.median<R>().aggregateOf(this, expression)
53+
54+
public inline fun <T, reified R> DataColumn<T>.medianOf(
55+
skipNaN: Boolean = skipNaN_default,
56+
crossinline expression: (T) -> R,
57+
): Double
58+
where R : Comparable<R & Any>?, R : Number? =
59+
medianOfOrNull(skipNaN, expression).suggestIfNull("medianOf")
60+
61+
public inline fun <T, reified R> DataColumn<T>.medianOfOrNull(
62+
skipNaN: Boolean = skipNaN_default,
63+
crossinline expression: (T) -> R,
64+
): Double?
65+
where R : Comparable<R & Any>?, R : Number? =
66+
Aggregators.median<R>(skipNaN).aggregateOf(this, expression)
3967

4068
// endregion
4169

4270
// region DataRow
4371

44-
public fun AnyRow.rowMedianOrNull(): Any? =
45-
Aggregators.median.aggregateCalculatingValueType(
46-
values = values().asSequence().filterIsInstance<Comparable<Any?>>(),
47-
valueTypes = df().columns().filter { it.valuesAreComparable() }.map { it.type() }.toSet(),
48-
)
72+
@Deprecated(ROW_MEDIAN_OR_NULL, level = DeprecationLevel.ERROR)
73+
public fun AnyRow.rowMedianOrNull(): Nothing? = error(ROW_MEDIAN_OR_NULL)
4974

50-
public fun AnyRow.rowMedian(): Any = rowMedianOrNull().suggestIfNull("rowMedian")
75+
@Deprecated(ROW_MEDIAN, level = DeprecationLevel.ERROR)
76+
public fun AnyRow.rowMedian(): Nothing = error(ROW_MEDIAN)
5177

52-
public inline fun <reified T : Comparable<T>> AnyRow.rowMedianOfOrNull(): T? = valuesOf<T>().median()
78+
public inline fun <reified T : Comparable<T>> AnyRow.rowMedianOfOrNull(): T? =
79+
Aggregators.median<T>().aggregateOfRow(this) { colsOf<T?>() }
5380

5481
public inline fun <reified T : Comparable<T>> AnyRow.rowMedianOf(): T =
5582
rowMedianOfOrNull<T>().suggestIfNull("rowMedianOf")
5683

84+
public inline fun <reified T> AnyRow.rowMedianOfOrNull(
85+
skipNaN: Boolean = skipNaN_default,
86+
): Double?
87+
where T : Comparable<T>, T : Number =
88+
Aggregators.median<T>(skipNaN).aggregateOfRow(this) { colsOf<T?>() }
89+
90+
public inline fun <reified T> AnyRow.rowMedianOf(
91+
skipNaN: Boolean = skipNaN_default,
92+
): Double
93+
where T : Comparable<T>, T : Number = rowMedianOfOrNull<T>(skipNaN).suggestIfNull("rowMedianOf")
94+
5795
// endregion
5896

5997
// region DataFrame

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/min.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ public inline fun <T, reified R : Comparable<R & Any>?> DataColumn<T>.minOfOrNul
5959
// region DataRow
6060

6161
@Deprecated(ROW_MIN_OR_NULL, level = DeprecationLevel.ERROR)
62-
public fun AnyRow.rowMinOrNull(): Any? = error(ROW_MIN_OR_NULL)
62+
public fun AnyRow.rowMinOrNull(): Nothing? = error(ROW_MIN_OR_NULL)
6363

6464
@Deprecated(ROW_MIN, level = DeprecationLevel.ERROR)
65-
public fun AnyRow.rowMin(): Any = error(ROW_MIN)
65+
public fun AnyRow.rowMin(): Nothing = error(ROW_MIN)
6666

6767
public inline fun <reified T : Comparable<T>> AnyRow.rowMinOfOrNull(skipNaN: Boolean = skipNaN_default): T? =
6868
Aggregators.min<T>(skipNaN).aggregateOfRow(this) { colsOf<T?>() }

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/aggregation/aggregators/Aggregators.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,12 @@ internal object Aggregators {
153153
}
154154
}
155155

156-
@JvmName("medianComparable")
157-
fun <T : Comparable<T & Any>?> median(): Aggregator<T & Any, T?> = median.invoke(skipNaN_default).cast2()
156+
fun <T> median(): Aggregator<T & Any, T?>
157+
where T : Comparable<T & Any>? =
158+
median.invoke(skipNaN_default).cast2()
158159

159-
@JvmName("medianNumber")
160-
fun <T> median(skipNaN: Boolean): Aggregator<T & Any, Double> where T : Comparable<T & Any>?, T : Number? =
160+
fun <T> median(skipNaN: Boolean): Aggregator<T & Any, Double>
161+
where T : Comparable<T & Any>?, T : Number? =
161162
median.invoke(skipNaN).cast2()
162163

163164
// T: Comparable<T>? -> T

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/util/deprecationMessages.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ internal const val ROW_MIN_OR_NULL = "`rowMinOrNull` is deprecated in favor of `
8080
internal const val ROW_MAX = "`rowMax` is deprecated in favor of `rowMaxOf`. $MESSAGE_0_16"
8181
internal const val ROW_MAX_OR_NULL = "`rowMaxOrNull` is deprecated in favor of `rowMaxOfOrNull`. $MESSAGE_0_16"
8282

83+
internal const val ROW_MEDIAN = "`rowMedian` is deprecated in favor of `rowMedianOf`. $MESSAGE_0_16"
84+
internal const val ROW_MEDIAN_OR_NULL = "`rowMedianOrNull` is deprecated in favor of `rowMedianOfOrNull`. $MESSAGE_0_16"
85+
8386
internal const val SUM_NO_SKIPNAN = "This function is just here for binary compatibility. $MESSAGE_0_16"
8487
internal const val MAX_NO_SKIPNAN = "This function is just here for binary compatibility. $MESSAGE_0_16"
8588
internal const val MIN_NO_SKIPNAN = "This function is just here for binary compatibility. $MESSAGE_0_16"

0 commit comments

Comments
 (0)