@@ -13,7 +13,6 @@ import org.jetbrains.kotlinx.dataframe.api.asNumbers
13
13
import org.jetbrains.kotlinx.dataframe.api.cast
14
14
import org.jetbrains.kotlinx.dataframe.api.concat
15
15
import org.jetbrains.kotlinx.dataframe.api.isNumber
16
- import org.jetbrains.kotlinx.dataframe.api.isPrimitiveNumber
17
16
import org.jetbrains.kotlinx.dataframe.api.map
18
17
import org.jetbrains.kotlinx.dataframe.api.maxOrNull
19
18
import org.jetbrains.kotlinx.dataframe.api.mean
@@ -30,6 +29,7 @@ import org.jetbrains.kotlinx.dataframe.columns.size
30
29
import org.jetbrains.kotlinx.dataframe.columns.values
31
30
import org.jetbrains.kotlinx.dataframe.impl.columns.addPath
32
31
import org.jetbrains.kotlinx.dataframe.impl.columns.asAnyFrameColumn
32
+ import org.jetbrains.kotlinx.dataframe.impl.isPrimitiveNumber
33
33
import org.jetbrains.kotlinx.dataframe.impl.renderType
34
34
import org.jetbrains.kotlinx.dataframe.index
35
35
import org.jetbrains.kotlinx.dataframe.kind
@@ -38,7 +38,7 @@ import org.jetbrains.kotlinx.dataframe.type
38
38
internal fun describeImpl (cols : List <AnyCol >): DataFrame <ColumnDescription > {
39
39
val allCols = cols.collectAll(false )
40
40
41
- val hasNumericCols = allCols.any { it.isPrimitiveNumber () }
41
+ val hasNumericCols = allCols.any { it.isNumber () }
42
42
val hasComparableCols = allCols.any { it.valuesAreComparable() }
43
43
val hasLongPaths = allCols.any { it.path().size > 1 }
44
44
var df = allCols.toDataFrame {
@@ -56,8 +56,8 @@ internal fun describeImpl(cols: List<AnyCol>): DataFrame<ColumnDescription> {
56
56
?.key
57
57
}
58
58
if (hasNumericCols) {
59
- ColumnDescription ::mean from { if (it.isPrimitiveNumber ()) it.asNumbers().mean() else null }
60
- ColumnDescription ::std from { if (it.isPrimitiveNumber ()) it.asNumbers().std() else null }
59
+ ColumnDescription ::mean from { if (it.isNumber ()) it.asNumbers().mean() else null }
60
+ ColumnDescription ::std from { if (it.isNumber ()) it.asNumbers().std() else null }
61
61
}
62
62
if (hasComparableCols || hasNumericCols) {
63
63
ColumnDescription ::min from inferType {
@@ -111,12 +111,20 @@ private fun List<AnyCol>.collectAll(atAnyDepth: Boolean): List<AnyCol> =
111
111
}
112
112
113
113
/* * Converts a column to a comparable column if it is not already comparable. */
114
- private fun DataColumn<Any?>.convertToComparableOrNull (): DataColumn <Comparable <Any ?>>? =
115
- when {
114
+ @Suppress(" UNCHECKED_CAST" )
115
+ private fun DataColumn<Any?>.convertToComparableOrNull (): DataColumn <Comparable <Any >? >? {
116
+ return when {
116
117
valuesAreComparable() -> asComparable()
117
118
118
119
// Found incomparable number types, convert all to Double first
119
- isPrimitiveNumber() -> map { (it as Number ? )?.toDouble() }.cast()
120
+ isNumber() -> cast<Number ?>().map {
121
+ if (it?.isPrimitiveNumber() == false ) {
122
+ // Cannot calculate statistics of a non-primitive number type
123
+ return @convertToComparableOrNull null
124
+ }
125
+ it?.toDouble() as Comparable <Any >?
126
+ }
120
127
121
128
else -> null
122
129
}
130
+ }
0 commit comments