使用Java中的DataFrame

你是否熟悉DataFrame?

DataFrame是一个非常方便的库和对象,常用于在Python和R语言中处理数据、进行机器学习。它提供了处理表格数据和二维数组数据的各种功能。

就像Excel或CSV一样,可以一次读取数据,提取二维数组的任意行列,还可以像进行SQL操作一样,将表连接起来。无论如何,这在使用二维数据时是必不可少的。

但是在Java中,没有与这个DataFrame相当的实现,无法享受DataFrame带来的好处,数据处理需要花费更多时间,因此会遭遇一些悲伤的经历,比如被谩骂为为什么不用Python等。

梦神数据科学框架

不过,那里有一线光明。
Morpheus数据科学框架提供了与该DataFrame(可能)相等的功能。链接:https://github.com/zavtech/morpheus-core

让我们按照一个简单的例子来尝试。

考虑一个汽车特征数据集,可以在这里访问。下面的代码将此CSV数据加载到Morpheus DataFrame中,筛选行以仅包括那些具有功率重量比> 0.1的车辆(其中重量转换为千克),然后添加一列以记录高速公路和城市里程(MPG)之间的相对效率,按照这个新添加的列按降序对行进行排序,最后将这个转换后的结果记录到CSV文件中。

这个例子中,我们将使用车辆特性数据。将CSV文件读入Morpheus DataFrame,过滤出馬力重量比超过0.1的行,并添加高速公路/城市区的MPG燃料比率列。按照添加的列进行排序,并将结果输出到CSV文件中。

样本代码和执行结果

import com.zavtech.morpheus.frame.*;

public class MorpheusTester {

    public static void main(String[] args) {

        DataFrame.read().csv(options -> {
            options.setResource("http://zavtech.com/data/samples/cars93.csv");
            options.setExcludeColumnIndexes(0);
        }).rows().select(row -> {
            double weightKG = row.getDouble("Weight") * 0.453592d;
            double horsepower = row.getDouble("Horsepower");
            return horsepower / weightKG > 0.1d;
        }).cols().add("MPG(Highway/City)", Double.class, v -> {
            double cityMpg = v.row().getDouble("MPG.city");
            double highwayMpg = v.row().getDouble("MPG.highway");
            return highwayMpg / cityMpg;
        }).rows().sort(false, "MPG(Highway/City)").write().csv(options -> {
            options.setFile("./cars93m.csv");
            options.setTitle("DataFrame");
        });

    }
}

由于返回类型是DataFrame类型,因此可以使用方法链依次执行csv()、select()、add()和sort()。csv()部分非常充满DataFrame的味道。

image.png

DataFrame具有丰富的功能,测试其是否具有相同功能并不容易,但可以确认进行行抽取、列添加和排序等操作。

我认为在处理数据时,可以考虑使用Java。

bannerAds