Skip to content

Commit 90317f0

Browse files
committed
Merge branch 'master' into issue-1138
# Conflicts: # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/aggregation/aggregators/Aggregators.kt
2 parents fc42da3 + c817531 commit 90317f0

File tree

61 files changed

+9372
-8286
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+9372
-8286
lines changed

core/api/core.api

+120-52
Large diffs are not rendered by default.

core/build.gradle.kts

+4
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ dependencies {
6464
kotlinCompilerPluginClasspathSamples(projects.plugins.expressionsConverter)
6565

6666
api(libs.commonsCsv)
67+
6768
implementation(libs.commonsIo)
6869
implementation(libs.serialization.core)
6970
implementation(libs.serialization.json)
@@ -82,6 +83,9 @@ dependencies {
8283
testImplementation(libs.jsoup)
8384
testImplementation(libs.sl4jsimple)
8485

86+
// for checking results
87+
testImplementation(libs.commonsStatisticsDescriptive)
88+
8589
// for samples.api
8690
testImplementation(projects.dataframeCsv)
8791
}

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/constructors.kt

+16
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
1313
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
1414
import org.jetbrains.kotlinx.dataframe.annotations.Refine
1515
import org.jetbrains.kotlinx.dataframe.columns.ColumnAccessor
16+
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
1617
import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
1718
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1819
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
@@ -269,6 +270,15 @@ public inline fun <reified T> column(values: Iterable<T>): DataColumn<T> =
269270
allColsMakesColGroup = true,
270271
).forceResolve()
271272

273+
@Refine
274+
@Interpretable("ColumnOfPairs")
275+
public fun columnOf(vararg columns: Pair<String, AnyBaseCol>): ColumnGroup<*> =
276+
dataFrameOf(
277+
columns.map { (name, col) ->
278+
col.rename(name)
279+
},
280+
).asColumnGroup()
281+
272282
// endregion
273283

274284
// region create DataFrame
@@ -290,6 +300,12 @@ public fun dataFrameOf(columns: Iterable<AnyBaseCol>): DataFrame<*> {
290300
return DataFrameImpl<Unit>(cols, nrow)
291301
}
292302

303+
@Refine
304+
@JvmName("dataFrameOfColumns")
305+
@Interpretable("DataFrameOfPairs")
306+
public fun dataFrameOf(vararg columns: Pair<String, AnyBaseCol>): DataFrame<*> =
307+
dataFrameOf(columns.map { (name, col) -> col.rename(name) })
308+
293309
public fun dataFrameOf(vararg header: ColumnReference<*>): DataFrameBuilder = DataFrameBuilder(header.map { it.name() })
294310

295311
public fun dataFrameOf(vararg columns: AnyBaseCol): DataFrame<*> = dataFrameOf(columns.asIterable())

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/convert.kt

+20-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.jetbrains.kotlinx.dataframe.annotations.Converter
2121
import org.jetbrains.kotlinx.dataframe.annotations.HasSchema
2222
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
2323
import org.jetbrains.kotlinx.dataframe.annotations.Refine
24+
import org.jetbrains.kotlinx.dataframe.columns.BaseColumn
2425
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
2526
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
2627
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
@@ -96,7 +97,10 @@ public inline fun <T, C, reified R> Convert<T, C?>.notNull(
9697
}
9798

9899
@HasSchema(schemaArg = 0)
99-
public class Convert<T, out C>(internal val df: DataFrame<T>, internal val columns: ColumnsSelector<T, C>) {
100+
public class Convert<T, out C>(
101+
@PublishedApi internal val df: DataFrame<T>,
102+
@PublishedApi internal val columns: ColumnsSelector<T, C>,
103+
) {
100104
public fun <R> cast(): Convert<T, R> = Convert(df, columns as ColumnsSelector<T, R>)
101105

102106
@Refine
@@ -128,6 +132,21 @@ public fun <T, C, R> Convert<T, DataRow<C>>.asFrame(
128132
body: ColumnsContainer<T>.(ColumnGroup<C>) -> DataFrame<R>,
129133
): DataFrame<T> = to { body(this, it.asColumnGroup()).asColumnGroup(it.name()) }
130134

135+
/**
136+
* Compiler plugin-friendly variant of [ReplaceClause.with]
137+
* [ReplaceClause.with] allows to change both column types and names.
138+
* Tracking of column name changes in arbitrary lambda expression is unreliable and generally impossible
139+
* to do statically.
140+
* This function ensures that all column names remain as is and only their type changes to [R]
141+
* Example:
142+
* `df.convert { colsOf<String>() }.asColumn { it.asList().parallelStream().map { heavyIO(it) }.toList().toColumn() }`
143+
*/
144+
@Refine
145+
@Interpretable("ConvertAsColumn")
146+
public inline fun <T, C, R> Convert<T, C>.asColumn(
147+
crossinline columnConverter: DataFrame<T>.(DataColumn<C>) -> BaseColumn<R>,
148+
): DataFrame<T> = df.replace(columns).with { columnConverter(df, it).rename(it.name()) }
149+
131150
@Refine
132151
@Interpretable("PerRowCol")
133152
public inline fun <T, C, reified R> Convert<T, C>.perRowCol(

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

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import kotlin.reflect.KProperty
3838
* This needs to be explained by KDocs
3939
*
4040
* medianBy is new for all overloads :)
41+
* Uses [QuantileEstimationMethod.R8] for primitive numbers, else [QuantileEstimationMethod.R3].
42+
* MedianBy also uses [QuantileEstimationMethod.R3].
4143
*/
4244

4345
// region DataColumn

0 commit comments

Comments
 (0)