From efcef69ba13546e3cc13dd6d99b67a997a60ce36 Mon Sep 17 00:00:00 2001 From: Nikita Klimenko Date: Tue, 16 Jul 2024 15:02:31 +0300 Subject: [PATCH] Add Convert.asFrame function --- .../kotlinx/dataframe/api/convert.kt | 6 + .../kotlinx/dataframe/samples/api/Modify.kt | 8 + .../testSets/person/DataFrameTreeTests.kt | 6 + ...ame.samples.api.Modify.convertAsFrame.html | 499 ++++++++++++++++++ docs/StardustDocs/topics/convert.md | 14 +- 5 files changed, 532 insertions(+), 1 deletion(-) create mode 100644 docs/StardustDocs/snippets/org.jetbrains.kotlinx.dataframe.samples.api.Modify.convertAsFrame.html diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/convert.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/convert.kt index c989cc8b2c..232b1617c3 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/convert.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/convert.kt @@ -8,12 +8,15 @@ import kotlinx.datetime.toLocalDateTime import org.jetbrains.kotlinx.dataframe.AnyBaseCol import org.jetbrains.kotlinx.dataframe.AnyCol import org.jetbrains.kotlinx.dataframe.AnyFrame +import org.jetbrains.kotlinx.dataframe.ColumnsContainer import org.jetbrains.kotlinx.dataframe.ColumnsSelector import org.jetbrains.kotlinx.dataframe.DataColumn import org.jetbrains.kotlinx.dataframe.DataFrame +import org.jetbrains.kotlinx.dataframe.DataRow import org.jetbrains.kotlinx.dataframe.RowColumnExpression import org.jetbrains.kotlinx.dataframe.RowValueExpression import org.jetbrains.kotlinx.dataframe.annotations.* +import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup import org.jetbrains.kotlinx.dataframe.columns.ColumnReference import org.jetbrains.kotlinx.dataframe.columns.toColumnSet import org.jetbrains.kotlinx.dataframe.dataTypes.IFRAME @@ -111,6 +114,9 @@ public inline fun Convert.with( noinline rowConverter: RowValueExpression ): DataFrame = with(Infer.Nulls, rowConverter) +public fun Convert>.asFrame(body: ColumnsContainer.(ColumnGroup) -> DataFrame): DataFrame = + to { body(this, it.asColumnGroup()).asColumnGroup(it.name()) } + public inline fun Convert.perRowCol( infer: Infer = Infer.Nulls, noinline expression: RowColumnExpression, diff --git a/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/api/Modify.kt b/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/api/Modify.kt index e535033422..7d89cf4b99 100644 --- a/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/api/Modify.kt +++ b/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/api/Modify.kt @@ -210,6 +210,14 @@ class Modify : TestBase() { // SampleEnd } + @Test + @TransformDataFrameExpressions + fun convertAsFrame() { + // SampleStart + df.convert { name }.asFrame { it.add("fullName") { "$firstName $lastName" } } + // SampleEnd + } + @Test @TransformDataFrameExpressions fun parseAll() { diff --git a/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTreeTests.kt b/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTreeTests.kt index e2fc35ac13..ead370a302 100644 --- a/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTreeTests.kt +++ b/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTreeTests.kt @@ -661,4 +661,10 @@ class DataFrameTreeTests : BaseTest() { val a: DataFrame = typed2["nameAndCity"].cast>().asDataFrame() val b: DataFrame = typed2[nameAndCity].cast().asDataFrame() } + + @Test + fun `convert ColumnGroup as Frame`() { + val df = typed2.convert { nameAndCity }.asFrame { it.remove { city } } + df.nameAndCity.columns() shouldBe typed2.nameAndCity.remove { city }.columns() + } } diff --git a/docs/StardustDocs/snippets/org.jetbrains.kotlinx.dataframe.samples.api.Modify.convertAsFrame.html b/docs/StardustDocs/snippets/org.jetbrains.kotlinx.dataframe.samples.api.Modify.convertAsFrame.html new file mode 100644 index 0000000000..47cbc0d8c7 --- /dev/null +++ b/docs/StardustDocs/snippets/org.jetbrains.kotlinx.dataframe.samples.api.Modify.convertAsFrame.html @@ -0,0 +1,499 @@ + + + + + +
+ Input DataFrame: rowsCount = 7, columnsCount = 5 +
+ +

+
+
+Step 1: Convert +

class org.jetbrains.kotlinx.dataframe.api.Convert

+
+
+ Output DataFrame: rowsCount = 7, columnsCount = 5 +
+ +

+
+ + + diff --git a/docs/StardustDocs/topics/convert.md b/docs/StardustDocs/topics/convert.md index f4487a5105..c5c1ae3b51 100644 --- a/docs/StardustDocs/topics/convert.md +++ b/docs/StardustDocs/topics/convert.md @@ -5,11 +5,12 @@ Returns [`DataFrame`](DataFrame.md) with changed values in some columns. Allows ```text convert { columnsSelector } - .with { rowExpression } | .perRowCol { rowColExpression } | to() | to { colExpression } + .with { rowExpression } | .asFrame { frameExpression } | .perRowCol { rowColExpression } | to() | to { colExpression } rowExpression = DataRow.(OldValue) -> NewValue rowColExpression = (DataRow, DataColumn) -> NewValue colExpression = DataFrame.(DataColumn) -> DataColumn +frameExpression: DataFrame.(DataFrame) -> DataFrame ``` See [column selectors](ColumnSelectors.md) and [row expressions](DataRow.md#row-expressions) @@ -24,6 +25,17 @@ df.convert { colsAtAnyDepth().colsOf() }.with { it.toCharArray().toList( +ColumnGroup can be converted using DataFrame API, for example: + + + +```kotlin +df.convert { name }.asFrame { it.add("fullName") { "$firstName $lastName" } } +``` + + + + `convert` supports automatic type conversions between the following types: * `Int` * `String`