@@ -13,47 +13,85 @@ import org.jetbrains.kotlinx.dataframe.annotations.Refine
13
13
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
14
14
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
15
15
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.Aggregators
16
- import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.aggregateCalculatingValueType
17
16
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.cast
18
17
import org.jetbrains.kotlinx.dataframe.impl.aggregation.intraComparableColumns
19
18
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateAll
20
19
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateFor
21
20
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf
21
+ import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOfRow
22
22
import org.jetbrains.kotlinx.dataframe.impl.columns.toComparableColumns
23
23
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
25
27
import kotlin.reflect.KProperty
26
28
27
29
// region DataColumn
28
30
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" )
30
32
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 )
33
35
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" )
36
40
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)
39
67
40
68
// endregion
41
69
42
70
// region DataRow
43
71
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 )
49
74
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 )
51
77
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 ?>() }
53
80
54
81
public inline fun <reified T : Comparable <T >> AnyRow.rowMedianOf (): T =
55
82
rowMedianOfOrNull<T >().suggestIfNull(" rowMedianOf" )
56
83
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
+
57
95
// endregion
58
96
59
97
// region DataFrame
0 commit comments