Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 0 additions & 53 deletions core/api/core.api
Original file line number Diff line number Diff line change
Expand Up @@ -10796,73 +10796,20 @@ public final class org/jetbrains/kotlinx/dataframe/jupyter/RenderedContent$Compa
public final fun truncatedText (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/jupyter/RenderedContent;
}

public final class org/jetbrains/kotlinx/dataframe/math/BasicStats {
public fun <init> (IDD)V
public final fun component1 ()I
public final fun component2 ()D
public final fun component3 ()D
public final fun copy (IDD)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
public static synthetic fun copy$default (Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;IDDILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
public fun equals (Ljava/lang/Object;)Z
public final fun getCount ()I
public final fun getMean ()D
public final fun getVariance ()D
public fun hashCode ()I
public final fun std (I)D
public fun toString ()Ljava/lang/String;
}

public final class org/jetbrains/kotlinx/dataframe/math/MeanKt {
public static final fun bigDecimalMean (Ljava/lang/Iterable;)D
public static final fun bigIntegerMean (Ljava/lang/Iterable;)D
public static final fun byteMean (Ljava/lang/Iterable;)D
public static final fun doubleMean (Ljava/lang/Iterable;Z)D
public static synthetic fun doubleMean$default (Ljava/lang/Iterable;ZILjava/lang/Object;)D
public static final fun floatMean (Ljava/lang/Iterable;Z)D
public static synthetic fun floatMean$default (Ljava/lang/Iterable;ZILjava/lang/Object;)D
public static final fun intMean (Ljava/lang/Iterable;)D
public static final fun longMean (Ljava/lang/Iterable;)D
public static final fun mean (Ljava/lang/Iterable;Lkotlin/reflect/KType;Z)D
public static final fun mean (Lkotlin/sequences/Sequence;Z)D
public static synthetic fun mean$default (Ljava/lang/Iterable;Lkotlin/reflect/KType;ZILjava/lang/Object;)D
public static synthetic fun mean$default (Lkotlin/sequences/Sequence;ZILjava/lang/Object;)D
public static final fun meanFloat (Lkotlin/sequences/Sequence;Z)D
public static synthetic fun meanFloat$default (Lkotlin/sequences/Sequence;ZILjava/lang/Object;)D
public static final fun shortMean (Ljava/lang/Iterable;)D
}

public final class org/jetbrains/kotlinx/dataframe/math/PercentileKt {
public static final fun quickSelect (Ljava/util/List;I)Ljava/lang/Comparable;
}

public final class org/jetbrains/kotlinx/dataframe/math/StdKt {
public static final fun bigDecimalStd (Ljava/lang/Iterable;I)D
public static synthetic fun bigDecimalStd$default (Ljava/lang/Iterable;IILjava/lang/Object;)D
public static final fun bigIntegerStd (Ljava/lang/Iterable;I)D
public static synthetic fun bigIntegerStd$default (Ljava/lang/Iterable;IILjava/lang/Object;)D
public static final fun doubleStd (Ljava/lang/Iterable;ZI)D
public static synthetic fun doubleStd$default (Ljava/lang/Iterable;ZIILjava/lang/Object;)D
public static final fun floatStd (Ljava/lang/Iterable;ZI)D
public static synthetic fun floatStd$default (Ljava/lang/Iterable;ZIILjava/lang/Object;)D
public static final fun intStd (Ljava/lang/Iterable;I)D
public static synthetic fun intStd$default (Ljava/lang/Iterable;IILjava/lang/Object;)D
public static final fun longStd (Ljava/lang/Iterable;I)D
public static synthetic fun longStd$default (Ljava/lang/Iterable;IILjava/lang/Object;)D
public static final fun std (Ljava/lang/Iterable;Lkotlin/reflect/KType;ZI)D
public static synthetic fun std$default (Ljava/lang/Iterable;Lkotlin/reflect/KType;ZIILjava/lang/Object;)D
}

public final class org/jetbrains/kotlinx/dataframe/math/StdMeanKt {
public static final fun bigDecimalVarianceAndMean (Ljava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
public static final fun bigIntegerVarianceAndMean (Ljava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
public static final fun doubleVarianceAndMean (Ljava/lang/Iterable;Z)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
public static synthetic fun doubleVarianceAndMean$default (Ljava/lang/Iterable;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
public static final fun floatVarianceAndMean (Ljava/lang/Iterable;Z)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
public static synthetic fun floatVarianceAndMean$default (Ljava/lang/Iterable;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
public static final fun intVarianceAndMean (Ljava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
public static final fun longVarianceAndMean (Ljava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;
}

public final class org/jetbrains/kotlinx/dataframe/math/SumKt {
public static final fun sum (Ljava/lang/Iterable;)Ljava/math/BigDecimal;
public static final fun sum (Ljava/lang/Iterable;)Ljava/math/BigInteger;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.of
import org.jetbrains.kotlinx.dataframe.impl.columns.toComparableColumns
import org.jetbrains.kotlinx.dataframe.impl.suggestIfNull
import org.jetbrains.kotlinx.dataframe.math.medianOrNull
import org.jetbrains.kotlinx.dataframe.math.median
import kotlin.reflect.KProperty

// region DataColumn
Expand All @@ -45,7 +45,7 @@ public fun AnyRow.rowMedianOrNull(): Any? =

public fun AnyRow.rowMedian(): Any = rowMedianOrNull().suggestIfNull("rowMedian")

public inline fun <reified T : Comparable<T>> AnyRow.rowMedianOfOrNull(): T? = valuesOf<T>().medianOrNull()
public inline fun <reified T : Comparable<T>> AnyRow.rowMedianOfOrNull(): T? = valuesOf<T>().median()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why'd you change these? seems unsafe

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because old medianOrNull() was removed. It called basically this median() - internal implementation, not public median (which was also removed).

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah then maybe you could rename median() to medianOrNull(), since that's what it does, right?


public inline fun <reified T : Comparable<T>> AnyRow.rowMedianOf(): T =
rowMedianOfOrNull<T>().suggestIfNull("rowMedianOf")
Expand Down Expand Up @@ -82,6 +82,7 @@ public fun <T, C : Comparable<C>> DataFrame<T>.median(vararg columns: ColumnRefe
public fun <T, C : Comparable<C>> DataFrame<T>.median(vararg columns: KProperty<C?>): C =
median { columns.toColumnSet() }

@Suppress("UNCHECKED_CAST")
public fun <T, C : Comparable<C>> DataFrame<T>.medianOrNull(columns: ColumnsSelector<T, C?>): C? =
Aggregators.median.aggregateAll(this, columns) as C?

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.of
import org.jetbrains.kotlinx.dataframe.impl.columns.toComparableColumns
import org.jetbrains.kotlinx.dataframe.impl.suggestIfNull
import org.jetbrains.kotlinx.dataframe.math.percentileOrNull
import org.jetbrains.kotlinx.dataframe.math.percentile
import kotlin.reflect.KProperty

// region DataColumn
Expand Down Expand Up @@ -53,7 +53,7 @@ public fun AnyRow.rowPercentile(percentile: Double): Any =
rowPercentileOrNull(percentile).suggestIfNull("rowPercentile")

public inline fun <reified T : Comparable<T>> AnyRow.rowPercentileOfOrNull(percentile: Double): T? =
valuesOf<T>().percentileOrNull(percentile)
valuesOf<T>().percentile(percentile)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here


public inline fun <reified T : Comparable<T>> AnyRow.rowPercentileOf(percentile: Double): T =
rowPercentileOfOrNull<T>(percentile).suggestIfNull("rowPercentileOf")
Expand Down
20 changes: 10 additions & 10 deletions core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/mean.kt
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ internal fun <T : Number> Sequence<T>.mean(type: KType, skipNA: Boolean = skipNA
}
}

public fun Sequence<Double>.mean(skipNA: Boolean = skipNA_default): Double {
internal fun Sequence<Double>.mean(skipNA: Boolean = skipNA_default): Double {
var count = 0
var sum: Double = 0.toDouble()
for (element in this) {
Expand All @@ -61,7 +61,7 @@ public fun Sequence<Double>.mean(skipNA: Boolean = skipNA_default): Double {
}

@JvmName("meanFloat")
public fun Sequence<Float>.mean(skipNA: Boolean = skipNA_default): Double {
internal fun Sequence<Float>.mean(skipNA: Boolean = skipNA_default): Double {
var count = 0
var sum: Double = 0.toDouble()
for (element in this) {
Expand All @@ -79,13 +79,13 @@ public fun Sequence<Float>.mean(skipNA: Boolean = skipNA_default): Double {
}

@JvmName("doubleMean")
public fun Iterable<Double>.mean(skipNA: Boolean = skipNA_default): Double = asSequence().mean(skipNA)
internal fun Iterable<Double>.mean(skipNA: Boolean = skipNA_default): Double = asSequence().mean(skipNA)

@JvmName("floatMean")
public fun Iterable<Float>.mean(skipNA: Boolean = skipNA_default): Double = asSequence().mean(skipNA)
internal fun Iterable<Float>.mean(skipNA: Boolean = skipNA_default): Double = asSequence().mean(skipNA)

@JvmName("intMean")
public fun Iterable<Int>.mean(): Double =
internal fun Iterable<Int>.mean(): Double =
if (this is Collection) {
if (size > 0) sumOf { it.toDouble() } / size else Double.NaN
} else {
Expand All @@ -98,7 +98,7 @@ public fun Iterable<Int>.mean(): Double =
}

@JvmName("shortMean")
public fun Iterable<Short>.mean(): Double =
internal fun Iterable<Short>.mean(): Double =
if (this is Collection) {
if (size > 0) sumOf { it.toDouble() } / size else Double.NaN
} else {
Expand All @@ -111,7 +111,7 @@ public fun Iterable<Short>.mean(): Double =
}

@JvmName("byteMean")
public fun Iterable<Byte>.mean(): Double =
internal fun Iterable<Byte>.mean(): Double =
if (this is Collection) {
if (size > 0) sumOf { it.toDouble() } / size else Double.NaN
} else {
Expand All @@ -124,7 +124,7 @@ public fun Iterable<Byte>.mean(): Double =
}

@JvmName("longMean")
public fun Iterable<Long>.mean(): Double =
internal fun Iterable<Long>.mean(): Double =
if (this is Collection) {
if (size > 0) sumOf { it.toDouble() } / size else Double.NaN
} else {
Expand All @@ -138,7 +138,7 @@ public fun Iterable<Long>.mean(): Double =

// TODO result is Double, but should be BigDecimal, Issue #558
@JvmName("bigIntegerMean")
public fun Iterable<BigInteger>.mean(): Double =
internal fun Iterable<BigInteger>.mean(): Double =
if (this is Collection) {
if (size > 0) sumOf { it.toDouble() } / size else Double.NaN
} else {
Expand All @@ -152,7 +152,7 @@ public fun Iterable<BigInteger>.mean(): Double =

// TODO result is Double, but should be BigDecimal, Issue #558
@JvmName("bigDecimalMean")
public fun Iterable<BigDecimal>.mean(): Double =
internal fun Iterable<BigDecimal>.mean(): Double =
if (this is Collection) {
if (size > 0) sum().toDouble() / size else Double.NaN
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,8 @@ package org.jetbrains.kotlinx.dataframe.math
import kotlin.reflect.KType
import kotlin.reflect.typeOf

public inline fun <reified T : Comparable<T>> Iterable<T>.medianOrNull(): T? = median(typeOf<T>())

public inline fun <reified T : Comparable<T>> Iterable<T>.median(): T = medianOrNull()!!

// TODO median always returns the same type, but this can be confusing for iterables of even length
// TODO (e.g. median of [1, 2] should be 1.5, but the type is Int, so it returns 1), Issue #558
@PublishedApi
internal inline fun <reified T : Comparable<T>> Iterable<T?>.median(type: KType): T? = percentile(50.0, type)
internal inline fun <reified T : Comparable<T>> Iterable<T?>.median(type: KType = typeOf<T>()): T? =
percentile(50.0, type)
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,11 @@ import java.math.BigInteger
import kotlin.reflect.KType
import kotlin.reflect.typeOf

public inline fun <reified T : Comparable<T>> Iterable<T>.percentileOrNull(percentile: Double): T? =
percentile(percentile, typeOf<T>())

public inline fun <reified T : Comparable<T>> Iterable<T>.percentile(percentile: Double): T =
percentileOrNull(percentile)!!

public inline fun <reified T : Comparable<T>> Iterable<T>.q1OrNull(): T? = q1(typeOf<T>())

public inline fun <reified T : Comparable<T>> Iterable<T>.q1(): T = q1OrNull()!!

public inline fun <reified T : Comparable<T>> Iterable<T>.q3OrNull(): T? = q3(typeOf<T>())

public inline fun <reified T : Comparable<T>> Iterable<T>.q3(): T = q3OrNull()!!

@PublishedApi
internal inline fun <reified T : Comparable<T>> Iterable<T?>.q1(type: KType): T? = percentile(25.0, type)

@PublishedApi
internal inline fun <reified T : Comparable<T>> Iterable<T?>.q3(type: KType): T? = percentile(75.0, type)

@PublishedApi
internal inline fun <reified T : Comparable<T>> Iterable<T?>.percentile(percentile: Double, type: KType): T? {
internal inline fun <reified T : Comparable<T>> Iterable<T?>.percentile(
percentile: Double,
type: KType = typeOf<T>(),
): T? {
require(percentile in 0.0..100.0) { "Percentile must be in range [0, 100]" }

@Suppress("UNCHECKED_CAST")
Expand Down
13 changes: 7 additions & 6 deletions core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/std.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import java.math.BigInteger
import kotlin.reflect.KType
import kotlin.reflect.full.withNullability

@Suppress("UNCHECKED_CAST")
@PublishedApi
internal fun <T : Number> Iterable<T?>.std(
type: KType,
Expand Down Expand Up @@ -35,21 +36,21 @@ internal fun <T : Number> Iterable<T?>.std(
}

@JvmName("doubleStd")
public fun Iterable<Double>.std(skipNA: Boolean = skipNA_default, ddof: Int = ddof_default): Double =
internal fun Iterable<Double>.std(skipNA: Boolean = skipNA_default, ddof: Int = ddof_default): Double =
varianceAndMean(skipNA)?.std(ddof) ?: Double.NaN

@JvmName("floatStd")
public fun Iterable<Float>.std(skipNA: Boolean = skipNA_default, ddof: Int = ddof_default): Double =
internal fun Iterable<Float>.std(skipNA: Boolean = skipNA_default, ddof: Int = ddof_default): Double =
varianceAndMean(skipNA)?.std(ddof) ?: Double.NaN

@JvmName("intStd")
public fun Iterable<Int>.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof)
internal fun Iterable<Int>.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof)

@JvmName("longStd")
public fun Iterable<Long>.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof)
internal fun Iterable<Long>.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof)

@JvmName("bigDecimalStd")
public fun Iterable<BigDecimal>.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof)
internal fun Iterable<BigDecimal>.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof)

@JvmName("bigIntegerStd")
public fun Iterable<BigInteger>.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof)
internal fun Iterable<BigInteger>.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof)
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@ import java.math.BigDecimal
import java.math.BigInteger
import kotlin.math.sqrt

public data class BasicStats(val count: Int, val mean: Double, val variance: Double) {
internal data class BasicStats(val count: Int, val mean: Double, val variance: Double) {

public fun std(ddof: Int): Double {
fun std(ddof: Int): Double {
if (count <= ddof) return Double.NaN
return sqrt(variance / (count - ddof))
}
}

@JvmName("doubleVarianceAndMean")
public fun Iterable<Double>.varianceAndMean(skipNA: Boolean = skipNA_default): BasicStats? {
internal fun Iterable<Double>.varianceAndMean(skipNA: Boolean = skipNA_default): BasicStats? {
var count = 0
var sum = .0
for (element in this) {
Expand All @@ -41,7 +41,7 @@ public fun Iterable<Double>.varianceAndMean(skipNA: Boolean = skipNA_default): B
}

@JvmName("floatVarianceAndMean")
public fun Iterable<Float>.varianceAndMean(skipNA: Boolean = skipNA_default): BasicStats? {
internal fun Iterable<Float>.varianceAndMean(skipNA: Boolean = skipNA_default): BasicStats? {
var count = 0
var sum = .0
for (element in this) {
Expand All @@ -66,7 +66,7 @@ public fun Iterable<Float>.varianceAndMean(skipNA: Boolean = skipNA_default): Ba
}

@JvmName("intVarianceAndMean")
public fun Iterable<Int>.varianceAndMean(): BasicStats {
internal fun Iterable<Int>.varianceAndMean(): BasicStats {
var count = 0
var sum = .0
for (element in this) {
Expand All @@ -83,7 +83,7 @@ public fun Iterable<Int>.varianceAndMean(): BasicStats {
}

@JvmName("longVarianceAndMean")
public fun Iterable<Long>.varianceAndMean(): BasicStats {
internal fun Iterable<Long>.varianceAndMean(): BasicStats {
var count = 0
var sum = .0
for (element in this) {
Expand All @@ -100,7 +100,7 @@ public fun Iterable<Long>.varianceAndMean(): BasicStats {
}

@JvmName("bigDecimalVarianceAndMean")
public fun Iterable<BigDecimal>.varianceAndMean(): BasicStats {
internal fun Iterable<BigDecimal>.varianceAndMean(): BasicStats {
var count = 0
var sum = BigDecimal.ZERO
for (element in this) {
Expand All @@ -117,7 +117,7 @@ public fun Iterable<BigDecimal>.varianceAndMean(): BasicStats {
}

@JvmName("bigIntegerVarianceAndMean")
public fun Iterable<BigInteger>.varianceAndMean(): BasicStats {
internal fun Iterable<BigInteger>.varianceAndMean(): BasicStats {
var count = 0
var sum = BigInteger.ZERO
for (element in this) {
Expand Down