Kotlinv2.4.0

从文件获取数据

Kotlin Notebook 结合 Kotlin DataFrame 库,使您能够处理非结构化和结构化数据。这种组合提供了将非结构化数据(例如 TXT 文件中的数据)转换为结构化数据集的灵活性。

对于数据转换,您可以使用 .add().split().convert().parse() 等方法。此外,该工具集还支持从各种结构化文件格式中获取和操作数据,包括 CSV、JSON、XLS、Parquet 和 Apache Arrow。请参阅 DataFrame 文档查看所有支持的格式。

在本指南中,您可以通过多个示例学习如何获取、精炼和处理数据。

开始之前

Kotlin Notebook 依赖于 Kotlin Notebook 插件,该插件在 IntelliJ IDEA 中默认内置并启用。

如果 Kotlin Notebook 功能不可用,请确保已启用该插件。有关更多信息,请参阅设置环境

要按照本教程操作:

  1. 创建一个新的 Kotlin Notebook

  2. 导入 Kotlin DataFrame:

    kotlin
    %use dataframe

在运行任何其他代码单元之前,请确保先运行包含 %use dataframe 行的代码单元,以确保 DataFrame 库及其 API 在笔记本中可用。

获取数据

要在 Kotlin Notebook 中从文件获取数据,请使用 DataFrame.read() 函数:

kotlin
val movies = DataFrame.read("movies.csv")

DataFrame.read() 函数会根据文件扩展名和内容自动检测输入格式。

您还可以传递其他实参来控制 DataFrame 库读取输入数据的方式。例如,以下代码为 CSV 文件指定了自定义分隔符 (;):

kotlin
val movies = DataFrame.read("movies.csv", delimiter = ';')

有关其他文件格式的全面概览以及各种读取函数的详细信息,请参阅 Kotlin DataFrame 库文档

显示数据

一旦在笔记本中拥有数据,您就可以将其显示出来。最简单的方法是将数据存储在变量中,然后将其返回:

kotlin
val jsonDf = DataFrame.read("jsonFile.json")
jsonDf

此代码将文件中的数据显示为交互式表格:

显示数据

您可以使用此视图来检查值、查看列名,并轻松了解数据集的状态。

检查数据结构

要深入了解数据的结构或架构,请对 DataFrame 变量调用 .schema() 函数。

例如,运行 jsonDf.schema() 会列出 JSON 数据集中每一列的类型:

架构示例

通过 Kotlin Notebook,您还可以使用自动补全功能。它可以让您快速访问和操作 DataFrame 的属性。加载数据后,只需输入 DataFrame 变量名后跟一个点 (.),即可查看可用列及其类型的列表。

可用属性

精炼数据

Kotlin DataFrame 提供了用于精炼数据集的各种操作。例如,分组筛选更新添加新列。这些函数对于数据分析至关重要,让您可以有效地组织、清洗和转换数据。

例如,让我们看看 movies.csv 数据集。它在同一个单元格中存储了电影标题和发行年份。目标是精炼此数据集以便于分析:

  1. 加载数据

    使用 .read() 函数将文件加载到 DataFrame 中:

    kotlin
    val movies = DataFrame.read("movies.csv")
  2. 添加列

    要从 title 列中提取发行年份,请添加一个新的 year 列:

    kotlin
    val moviesWithYear = movies
        .add("year") { 
            "\\d{4}".toRegex()
                .findAll(title)
                .lastOrNull()
                ?.value
                ?.toInt()
                ?: -1
        }
    
    moviesWithYear
  3. 更新值

    要从电影标题中移除发行年份,请更新 title 列:

    kotlin
    val moviesTitle = moviesWithYear
        .update("title") {
            "\\s*\\(\\d{4}\\)\\s*$".toRegex().replace(title, "") 
    }
    
    moviesTitle

    这段代码将电影标题保留在一列中,并将发行年份移动到另一列。

  4. 筛选行

    要专注于特定数据,请使用 .filter() 函数。例如,要仅保留 1986 年以后发行的电影,请运行:

    kotlin
    val newMovies = moviesTitle.filter { 
        year >= 1996 
    }
    
    newMovies
  5. 移除列

    要移除不需要的列,请使用 .remove() 函数:

    kotlin
    val refinedMovies = newMovies.remove { 
        movieID 
    }
    
    refinedMovies

作为对比,以下是精炼前的数据集:

原始数据集

精炼后的数据集:

数据精炼结果

有关更多用例和详细示例,请参阅 Kotlin Dataframe 示例

导出数据

在 Kotlin Notebook 中精炼数据后,您可以轻松导出处理后的数据。

您可以为此使用各种 .write() 函数。它支持保存为多种格式,包括 CSV、JSON、XLS、XLSX、Apache Arrow,甚至是 HTML 表格。请参阅 DataFrame 文档查看所有支持的格式。这对于分享您的发现、创建报告或使数据可用于进一步分析特别有用。

例如,我们将结果保存为:

  • 使用 .writeJson() 函数保存为 JSON 文件:

    kotlin
    refinedMovies.writeJson("movies.json")
  • 使用 .writeCsv() 函数保存为 CSV 文件:

    kotlin
    refinedMovies.writeCsv("movies.csv")
  • 使用 .writeArrowIPC().writeArrowFeather() 函数保存为 Apache Arrow 文件

    kotlin
    refinedMovies.writeArrowIPC("movies.arrow")
    refinedMovies.writeArrowFeather("movies.feather")

您还可以使用 .toStandaloneHTML() 函数在浏览器中打开独立的 HTML 表格:

kotlin
refinedMoviesDf
    .toStandaloneHTML(DisplayConfiguration(rowsLimit = null))
    .openInBrowser()

下一步