Java对象类似于R data.frame [关闭]
Posted
技术标签:
【中文标题】Java对象类似于R data.frame [关闭]【英文标题】:Java object analogue to R data.frame [closed] 【发布时间】:2013-12-30 16:57:26 【问题描述】:我真的很喜欢 R 中的 data.frames,因为您可以在一个数据结构中存储不同类型的数据,并且您有很多不同的方法来修改数据(添加列、合并 data.frames,...),它从数据中提取子集真的很容易,...
是否有任何可用的具有相同功能的 Java 库?我最感兴趣的是以类似矩阵的方式存储不同类型的数据并能够提取数据的子集。
在Java中使用二维数组可以提供类似的结构,但是添加一列然后提取前k条记录要困难得多。
【问题讨论】:
在之前的工作中,我写了一个类似的库,使用Object[][]
(以行优先模式)来存储数据。您可以轻松地为您需要的所有操作编写方法(一次编写一个,根据需要):添加列、提取列、添加行、提取行、cbind
、rbind
、@ 987654325@,ddply
等。由于它们受到 R 的启发,大多数这些方法都有一个函数作为参数:例如,要添加一个新列,我将提供一个函数来计算该行其余部分的值;要提取行,我会提供一个谓词来指示要保留哪些行。
这也是我的想法。但我想也许已经有一个支持所有功能的库,所以我不必重新实现它:)
我也希望有一个实现 data.frame 的 Java 类。
我正在寻找同样的东西,但到目前为止找不到任何东西。我能找到的最好的方法是 this Stack Overflow thread 从 Java 调用 R。
如果 Scala 是一个选项,Saddle 看起来很有吸引力。
【参考方案1】:
Tablesaw (https://github.com/jtablesaw/tablesaw) 是 2015 年开始的 Java 数据框,正在积极开发中 (2018)。它被设计成在不牺牲易用性的情况下尽可能可扩展。功能包括按行和列过滤、描述性统计、映射/减少函数、交叉表、绘图、机器学习。阿帕奇许可证。
在一次查询测试中,它在 2 毫秒内从 1/2 亿记录表中返回了 500 多条记录。
欢迎提供贡献、功能请求和反馈。
【讨论】:
我给了它一个很大的机会,但是由于同时使用了 R 和 Pandas,它是一个非常令人沮丧的数据框架框架。文档很少,在 Pandas 中显而易见的内容在 Tablesaw 中甚至可能无法实现。我仍在寻找难以捉摸的 JVM Dataframe 框架,它让我像 Pandas 一样快乐。 @horcle_buzz 很抱歉让您感到沮丧。确实没有很好的文档记录,并且API中存在不一致之处。 (我正在删除它们)。但是我还没有看到任何 Pandas 示例无法在 java 中用 tableaw 进行类似的努力来完成。有例子可以学习会很有帮助。如果你知道的话,在 github 上用 pandas 代码和数据集打开一个问题。 它绝对是 Java 中可用的更成熟的数据框架之一,我会给它。不过话虽这么说,Java 中此类工具的状态有点令人遗憾。实际上我昨晚开始玩 ND4j,因为它似乎最接近任何 python 科学计算/数据科学工具。帮助提升 Tablesaw 的一个建议是将其与 ND4j 集成,类似于 Pandas 在 Numpy 上的工作方式。当我有更多时间时,我确实有一些问题可以提交。感谢您以正确的方式接受批评。 @horcle_buzz 我也出于同样的原因最终研究了 ND4j。就像 tableaw 看起来一样酷,已发布的文档适用于 v0.20,它与最新发布的 maven 版本不兼容。另外,我意识到我可能想在 GPU 上部署代码,而且 nd4j 似乎会使这个过程更容易一些。我也同意 Numpy 上的 Pandas 类比在这里与 ND4j 上的 Tablesaw 是有意义的。 @TKH Tablesaw v.0.20 现在在 maven Central 上(或者将在 MC 更新时出现。可能需要一段时间)。我查看了 ND4J,但我不确定它会对 Tablesaw 做什么。 AFAICT 它不支持非数字类型,并且作为单个连续的堆外内存块的实现使得(似乎)难以有效更新。 (行追加需要将表中的所有数据移动到第一列之后。)Tablesaw 被限制为 2 维和每个表 20 亿行,但否则 ND4J 将如何使它变得更好?对于 ML,tablesaw 可以轻松与 Smile 集成。【参考方案2】:我刚刚开源了Paleo 的初稿版本,这是一个 Java 8 库,它提供基于类型列的数据帧(包括对原始值的支持)。可以通过编程方式(通过简单的构建器 API)创建列,也可以从文本文件中导入列。
详情请咨询README。
该项目从一开始就处于未完成状态——我对反馈/PR 非常感兴趣,tia!
【讨论】:
很好,这正是我想要的。您是否有计划将 Paleo 库的功能扩展到例如对数据记录进行排序还是只保留具有特定属性的记录等? 很高兴你喜欢它!排序和切片绝对在我的清单上。哪一个对你来说更紧急? 我有兴趣根据 Date 列重新采样数据框。看看 Paleo 是否提供这种可能性......如果没有,如果对我可行,我会添加它! @netzwerg,我如何使用古 df 根据列标准对数据框应用过滤器【参考方案3】:我最近在使用 Java 时还发现自己需要一个数据帧结构。幸运的是,在编写了一个非常基本的实现之后,我能够获得批准将其作为开源发布。你可以在这里找到我的实现:Joinery -- Data frames for Java。欢迎投稿和功能请求。
【讨论】:
请务必注意,Joinery 已获得 GPL3 许可,因此可能不适用于许多用例【参考方案4】:不是很精通 R,但你应该看看Guava,特别是Tables。它们确实不提供您想要的确切功能,但您可以扩展它们,或者它们的规范可以帮助您编写自己的集合。
【讨论】:
我之前没有玩过 Guava 的表格,但它们看起来与 R 的数据帧非常相似。特别是,可以提取特定的行或特定的列。另一方面,似乎没有一种简单的方法可以将给定的行或列添加到表中【参考方案5】:Morpheus (http://www.zavtech.com/morpheus/docs/) 提供了与 R 类似的 DataFrame。它是一种高性能的列存储数据结构,可以在行或列维度上对数据进行排序、切片、分组和聚合。它还支持在内部使用 Fork & Join 框架对许多此类操作进行并行处理。
您可以轻松地在 CSV 文件、数据库以及专有的 JSON 格式中读取和写入数据。还提供从 Quandl、Google Finance 等加载数据的适配器。
它内置了对各种风格的线性回归、主成分分析、线性代数和其他类型的分析支持的支持。功能集仍在增长,但它已经是一个非常强大的框架。
【讨论】:
【参考方案6】:在 R 中我们有数据框,在 Python 中我们有 pandas,在 Java 中: 有来自 deeplearning4j 的Schema
还有一个版本,用于对无处不在的虹膜数据进行数据分析,如果你想刚刚开始,here
还有其他自定义对象(来自 Weka,来自 Tensorflow,它们或多或少相同)。
【讨论】:
以上是关于Java对象类似于R data.frame [关闭]的主要内容,如果未能解决你的问题,请参考以下文章