Skip to content

Commit 1317fa1

Browse files
committed
Merge branch 'mean' into sum
# Conflicts: # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/sum.kt
2 parents c0ed438 + 33e35bc commit 1317fa1

File tree

7 files changed

+39
-35
lines changed

7 files changed

+39
-35
lines changed

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

+4-9
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,10 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1414
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
1515
import org.jetbrains.kotlinx.dataframe.columns.toColumnsSetOf
1616
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.Aggregators
17-
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.cast2
1817
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateAll
1918
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateFor
2019
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf
2120
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOfRow
22-
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.of
2321
import org.jetbrains.kotlinx.dataframe.impl.aggregation.primitiveNumberColumns
2422
import org.jetbrains.kotlinx.dataframe.impl.columns.toNumberColumns
2523
import org.jetbrains.kotlinx.dataframe.impl.primitiveNumberTypes
@@ -42,11 +40,8 @@ public fun DataColumn<Number?>.mean(skipNA: Boolean = skipNA_default): Double =
4240

4341
public inline fun <T, reified R : Number> DataColumn<T>.meanOf(
4442
skipNA: Boolean = skipNA_default,
45-
noinline expression: (T) -> R?,
46-
): Double =
47-
Aggregators.mean(skipNA)
48-
.cast2<R?, Double>()
49-
.aggregateOf(this, expression)
43+
crossinline expression: (T) -> R?,
44+
): Double = Aggregators.mean(skipNA).aggregateOf(this, expression)
5045

5146
// endregion
5247

@@ -112,8 +107,8 @@ public fun <T, C : Number> DataFrame<T>.mean(vararg columns: KProperty<C?>, skip
112107

113108
public inline fun <T, reified D : Number> DataFrame<T>.meanOf(
114109
skipNA: Boolean = skipNA_default,
115-
noinline expression: RowExpression<T, D?>,
116-
): Double = Aggregators.mean(skipNA).of(this, expression)
110+
crossinline expression: RowExpression<T, D?>,
111+
): Double = Aggregators.mean(skipNA).aggregateOf(this, expression)
117112

118113
// endregion
119114

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import org.jetbrains.kotlinx.dataframe.impl.aggregation.intraComparableColumns
1818
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateAll
1919
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateFor
2020
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf
21-
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.of
2221
import org.jetbrains.kotlinx.dataframe.impl.columns.toComparableColumns
2322
import org.jetbrains.kotlinx.dataframe.impl.suggestIfNull
2423
import org.jetbrains.kotlinx.dataframe.math.median
@@ -101,7 +100,7 @@ public fun <T, C : Comparable<C>> DataFrame<T>.medianOrNull(vararg columns: KPro
101100

102101
public inline fun <T, reified R : Comparable<R>> DataFrame<T>.medianOf(
103102
crossinline expression: RowExpression<T, R?>,
104-
): R? = Aggregators.median.of(this, expression) as R?
103+
): R? = Aggregators.median.aggregateOf(this, expression) as R?
105104

106105
// endregion
107106

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import org.jetbrains.kotlinx.dataframe.impl.aggregation.intraComparableColumns
1616
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateAll
1717
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateFor
1818
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf
19-
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.of
2019
import org.jetbrains.kotlinx.dataframe.impl.columns.toComparableColumns
2120
import org.jetbrains.kotlinx.dataframe.impl.suggestIfNull
2221
import org.jetbrains.kotlinx.dataframe.math.percentile
@@ -121,7 +120,7 @@ public fun <T, C : Comparable<C>> DataFrame<T>.percentileOrNull(percentile: Doub
121120
public inline fun <T, reified R : Comparable<R>> DataFrame<T>.percentileOf(
122121
percentile: Double,
123122
crossinline expression: RowExpression<T, R?>,
124-
): R? = Aggregators.percentile(percentile).of(this, expression) as R?
123+
): R? = Aggregators.percentile(percentile).aggregateOf(this, expression) as R?
125124

126125
// endregion
127126

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.cast2
1818
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateAll
1919
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateFor
2020
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf
21-
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.of
2221
import org.jetbrains.kotlinx.dataframe.impl.aggregation.numberColumns
2322
import org.jetbrains.kotlinx.dataframe.math.std
2423
import kotlin.reflect.KProperty
@@ -99,7 +98,7 @@ public inline fun <T, reified R : Number> DataFrame<T>.stdOf(
9998
skipNA: Boolean = skipNA_default,
10099
ddof: Int = ddof_default,
101100
crossinline expression: RowExpression<T, R?>,
102-
): Double = Aggregators.std(skipNA, ddof).of(this, expression) ?: .0
101+
): Double = Aggregators.std(skipNA, ddof).aggregateOf(this, expression) ?: .0
103102

104103
// endregion
105104

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ public fun DataColumn<Double?>.sum(): Double = Aggregators.sum.aggregate(this) a
5252
@JvmName("sumNumber")
5353
public fun DataColumn<Number?>.sum(): Number = Aggregators.sum.aggregate(this)
5454

55-
public inline fun <T, reified R : Number> DataColumn<T>.sumOf(crossinline expression: (T) -> R): R? =
56-
(Aggregators.sum as Aggregator<*, *>).cast<R>().of(this, expression)
55+
public inline fun <T, reified R : Number> DataColumn<T>.sumOf(noinline expression: (T) -> R): R? =
56+
(Aggregators.sum as Aggregator<*, *>).cast<R>().aggregateOf(this, expression)
5757

5858
// endregion
5959

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/aggregation/modes/ofRowExpression.kt

+8-18
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,23 @@ import kotlin.reflect.typeOf
1919
@PublishedApi
2020
internal inline fun <C, reified V, R> Aggregator<V, R>.aggregateOf(
2121
values: Iterable<C>,
22-
noinline transform: (C) -> V,
22+
crossinline transform: (C) -> V?,
2323
): R =
2424
aggregate(
25-
values = values.asSequence().mapNotNull(transform).asIterable(),
25+
values = values.asSequence().mapNotNull { transform(it) }.asIterable(),
2626
type = typeOf<V>().withNullability(false),
2727
)
2828

2929
@PublishedApi
3030
internal inline fun <C, reified V, R> Aggregator<V, R>.aggregateOf(
3131
column: DataColumn<C>,
32-
noinline transform: (C) -> V,
32+
crossinline transform: (C) -> V?,
3333
): R = aggregateOf(column.values(), transform)
3434

3535
@PublishedApi
3636
internal inline fun <T, reified C, R> Aggregator<*, R>.aggregateOf(
3737
frame: DataFrame<T>,
38-
crossinline expression: RowExpression<T, C>,
38+
crossinline expression: RowExpression<T, C?>,
3939
): R = (this as Aggregator<C, R>).aggregateOf(frame.rows()) { expression(it, it) }
4040

4141
@PublishedApi
@@ -48,33 +48,23 @@ internal fun <T, C, R> Aggregator<*, R>.aggregateOfDelegated(
4848
body(this, this)
4949
}
5050

51-
@PublishedApi
52-
internal inline fun <T, reified C, R> Aggregator<*, R>.of(
53-
data: DataFrame<T>,
54-
crossinline expression: RowExpression<T, C>,
55-
): R = aggregateOf(data as DataFrame<T>, expression)
56-
57-
@PublishedApi
58-
internal inline fun <C, reified V, R> Aggregator<V, R>.of(data: DataColumn<C>, crossinline expression: (C) -> V): R =
59-
aggregateOf(data.values()) { expression(it) }
60-
6151
@PublishedApi
6252
internal inline fun <T, reified C, reified R> Aggregator<*, R>.aggregateOf(
6353
data: Grouped<T>,
6454
resultName: String? = null,
65-
crossinline expression: RowExpression<T, C>,
55+
crossinline expression: RowExpression<T, C?>,
6656
): DataFrame<T> = data.aggregateOf(resultName, expression, this as Aggregator<C, R>)
6757

6858
@PublishedApi
6959
internal inline fun <T, reified C, reified R> Aggregator<*, R>.aggregateOf(
7060
data: PivotGroupBy<T>,
71-
crossinline expression: RowExpression<T, C>,
61+
crossinline expression: RowExpression<T, C?>,
7262
): DataFrame<T> = data.aggregateOf(expression, this as Aggregator<C, R>)
7363

7464
@PublishedApi
7565
internal inline fun <T, reified C, reified R> Grouped<T>.aggregateOf(
7666
resultName: String?,
77-
crossinline expression: RowExpression<T, C>,
67+
crossinline expression: RowExpression<T, C?>,
7868
aggregator: Aggregator<C, R>,
7969
): DataFrame<T> {
8070
val path = pathOf(resultName ?: aggregator.name)
@@ -97,7 +87,7 @@ internal inline fun <T, reified C, reified R> Grouped<T>.aggregateOf(
9787

9888
@PublishedApi
9989
internal inline fun <T, reified C, R> PivotGroupBy<T>.aggregateOf(
100-
crossinline expression: RowExpression<T, C>,
90+
crossinline expression: RowExpression<T, C?>,
10191
aggregator: Aggregator<C, R>,
10292
): DataFrame<T> =
10393
aggregate {

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/statistics/median.kt

+22
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,36 @@ import io.kotest.matchers.shouldBe
44
import org.jetbrains.kotlinx.dataframe.api.Infer
55
import org.jetbrains.kotlinx.dataframe.api.columnOf
66
import org.jetbrains.kotlinx.dataframe.api.dataFrameOf
7+
import org.jetbrains.kotlinx.dataframe.api.groupBy
78
import org.jetbrains.kotlinx.dataframe.api.mapToColumn
89
import org.jetbrains.kotlinx.dataframe.api.median
10+
import org.jetbrains.kotlinx.dataframe.api.medianOf
911
import org.jetbrains.kotlinx.dataframe.api.rowMedian
1012
import org.junit.Test
13+
import kotlin.reflect.typeOf
1114

1215
@Suppress("ktlint:standard:argument-list-wrapping")
1316
class MedianTests {
1417

18+
val personsDf = dataFrameOf("name", "age", "city", "weight", "height", "yearsToRetirement")(
19+
"Alice", 15, "London", 99.5, "1.85", 50,
20+
"Bob", 20, "Paris", 140.0, "1.35", 45,
21+
"Charlie", 100, "Dubai", 75.0, "1.95", 0,
22+
"Rose", 1, "Moscow", 45.33, "0.79", 64,
23+
"Dylan", 35, "London", 23.4, "1.83", 30,
24+
"Eve", 40, "Paris", 56.72, "1.85", 25,
25+
"Frank", 55, "Dubai", 78.9, "1.35", 10,
26+
"Grace", 29, "Moscow", 67.8, "1.65", 36,
27+
"Hank", 60, "Paris", 80.22, "1.75", 5,
28+
"Isla", 22, "London", 75.1, "1.85", 43,
29+
)
30+
31+
@Test
32+
fun `medianOf test`() {
33+
val d = personsDf.groupBy("city").medianOf("newAge") { "age"<Int>() * 10 }
34+
d["newAge"].type() shouldBe typeOf<Int>()
35+
}
36+
1537
@Test
1638
fun `median of two columns`() {
1739
val df = dataFrameOf("a", "b")(

0 commit comments

Comments
 (0)