From 9ca36e83d427c65a0ca0d1aa06d40b631015c03a Mon Sep 17 00:00:00 2001 From: Nikita Klimenko Date: Thu, 20 Jun 2024 18:33:52 +0300 Subject: [PATCH] Add castTo to help working with implicitly generated schemas in notebooks and plugin --- .../jetbrains/kotlinx/dataframe/api/cast.kt | 7 ++++ .../kotlinx/dataframe/samples/api/Modify.kt | 32 +++++++++++++++++ .../images/implicitlyGeneratedSchema.png | Bin 0 -> 29392 bytes docs/StardustDocs/topics/cast.md | 34 ++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 docs/StardustDocs/images/implicitlyGeneratedSchema.png diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/cast.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/cast.kt index 58f155a994..4451d8e83e 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/cast.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/cast.kt @@ -33,6 +33,13 @@ public inline fun AnyFrame.cast(verify: Boolean = true): DataFrame AnyFrame.castTo( + @Suppress("UNUSED_PARAMETER") df: DataFrame, + verify: Boolean = true +): DataFrame { + return cast(verify = verify) +} + public fun AnyRow.cast(): DataRow = this as DataRow public inline fun AnyRow.cast(verify: Boolean = true): DataRow = df().cast(verify)[0] 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 ffd880c486..e535033422 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 @@ -14,6 +14,7 @@ import org.jetbrains.kotlinx.dataframe.api.at import org.jetbrains.kotlinx.dataframe.api.by import org.jetbrains.kotlinx.dataframe.api.byName import org.jetbrains.kotlinx.dataframe.api.cast +import org.jetbrains.kotlinx.dataframe.api.castTo import org.jetbrains.kotlinx.dataframe.api.colsOf import org.jetbrains.kotlinx.dataframe.api.column import org.jetbrains.kotlinx.dataframe.api.columnGroup @@ -21,6 +22,7 @@ import org.jetbrains.kotlinx.dataframe.api.columnOf import org.jetbrains.kotlinx.dataframe.api.concat import org.jetbrains.kotlinx.dataframe.api.convert import org.jetbrains.kotlinx.dataframe.api.convertTo +import org.jetbrains.kotlinx.dataframe.api.count import org.jetbrains.kotlinx.dataframe.api.dataFrameOf import org.jetbrains.kotlinx.dataframe.api.default import org.jetbrains.kotlinx.dataframe.api.dropNulls @@ -100,6 +102,7 @@ import org.jetbrains.kotlinx.dataframe.explainer.PluginCallbackProxy import org.jetbrains.kotlinx.dataframe.explainer.TransformDataFrameExpressions import org.jetbrains.kotlinx.dataframe.impl.api.mapNotNullValues import org.jetbrains.kotlinx.dataframe.indices +import org.jetbrains.kotlinx.dataframe.io.readJson import org.jetbrains.kotlinx.dataframe.io.readJsonStr import org.jetbrains.kotlinx.dataframe.io.renderToString import org.jetbrains.kotlinx.dataframe.testResource @@ -1421,4 +1424,33 @@ class Modify : TestBase() { | 1 kotlin /kotlin 180 |""".trimMargin() } + + @DataSchema + interface ImplicitSchema { + val perf: Double + } + + @Test + @Ignore + @Suppress("UNUSED_VARIABLE") + fun castToGenerateSchema() { + // SampleStart + val sample = DataFrame.readJson("sample.json") + // SampleEnd + } + + @Test + @Suppress("KotlinConstantConditions") + fun castTo() { + val sample = dataFrameOf("perf")(10.0, 20.0, 12.0).cast() + val files = listOf() // not intended to run + // SampleStart + for (file in files) { + // df here is expected to have the same structure as sample + val df = DataFrame.readJson(file).castTo(sample) + val count = df.count { perf > 10.0 } + println("$file: $count") + } + // SampleEnd + } } diff --git a/docs/StardustDocs/images/implicitlyGeneratedSchema.png b/docs/StardustDocs/images/implicitlyGeneratedSchema.png new file mode 100644 index 0000000000000000000000000000000000000000..cf496d3dd31b9512ab9973c399763c7f51b39980 GIT binary patch literal 29392 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 literal 0 HcmV?d00001 diff --git a/docs/StardustDocs/topics/cast.md b/docs/StardustDocs/topics/cast.md index 7150dc30bb..f467d855e1 100644 --- a/docs/StardustDocs/topics/cast.md +++ b/docs/StardustDocs/topics/cast.md @@ -26,3 +26,37 @@ df.cast() ``` To convert [`DataFrame`](DataFrame.md) columns to match given schema, use [`convertTo`](convertTo.md) operation. + +**Reusing implicitly generated schema** + +```kotlin +castTo(df: DataFrame) +``` + +In notebooks, dataframe types are implicitly generated. + +![Implicitly generated schema](implicitlyGeneratedSchema.png) + +This type can be referred to, but its name will change whenever you re-execute cells. +Here how you can do it in a more robust way: + + + +```kotlin +val sample = DataFrame.readJson("sample.json") +``` + + + + + +```kotlin +for (file in files) { + // df here is expected to have the same structure as sample + val df = DataFrame.readJson(file).castTo(sample) + val count = df.count { perf > 10.0 } + println("$file: $count") +} +``` + +