Java, Программирование

Ищем аналоги для pandas в Java.

Время прочтения: 2 мин.

Ранее мы разобрали, как организовать удобную и масштабируемую работу БД на Java (<Java и JDBC часть 1>, <Java и JDBC часть 2>). Теперь же пришло время познакомиться с удобным способом обработки больших данных на манер pandas, а именно – с joinery.

Для начала работы нужно создать новый maven проект и добавить в pom.xml всё необходимое для работы с joinery:

  1. Прописываем дополнительный maven репозиторий. Именно в нём находится артефакт joinery
<repositories>
        <repository>
            <id>JCenter</id>
            <name>JCenter repo</name>
            <url>https://jcenter.bintray.com/</url>
        </repository>
    </repositories>

2. Прописываем joinery и все другие зависимости проекта

<dependencies>
        <dependency>
            <groupId>joinery</groupId>
            <artifactId>joinery-dataframe</artifactId>
            <version>1.9</version>
        </dependency>

<dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>
             <version>3.9</version>
      </dependency>
      <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
             <version>3.9</version>
      </dependency>
      <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml-schemas</artifactId>
             <version>3.9</version>
      </dependency>
      <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-scratchpad</artifactId>
             <version>3.9</version>
      </dependency>
      <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>ooxml-schemas</artifactId>
             <version>1.1</version>
      </dependency>
      <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>openxml4j</artifactId>
             <version>1.0-beta</version>
      </dependency>
</dependencies>

Перезагружаем maven проект для того, чтобы он сделал всю работу по загрузке необходимых артефактов. Скачиваем какой-нибудь датасет для работы с ним (в моём случае — это перечень возможных поселенцев на острове игрока из Animal Crossing) и переходим к написанию непосредственно кода.

Прежде чем начать как-то работать с данными, нужно их загрузить. С помощью joinery это делается следующим способом:

DataFrame df = DataFrame.readCsv(MainClass.class.getResourceAsStream("villagers.csv"));
System.out.println(df); // 

И сразу выведем загруженные данные в консоль

Уже можно запустить этот код и увидеть в консоли примерно следующее:

Теперь, когда данные загружены, попробуем произвести несколько операций с ними:

// Получаем только имена поселенцев
        var tempDf = df.retain(0);
        System.out.println(tempDf);

        // Получаем уникальные типы поселенцев
        tempDf = df.retain("Species").unique("Species");
        System.out.println(tempDf);

        // Получаем только те строки, в которых Species=="Pig"
        tempDf = df.select(new DataFrame.Predicate<Object>() {
            @Override
            public Boolean apply(List<Object> values) {
                return values.get(1).toString().equals("Pig");
            }
        });
        System.out.println(tempDf);

Т.к. это скорее обзорная статья, а не исчерпывающее руководство, с другими операциями над данными предлагается ознакомиться самостоятельно на страницах документации.

В заключении хочется напомнить, что для каждой задачи желательно использовать подходящий инструмент.  Так, например, при работе с умеренно большими данными вполне хватит связки python и pandas, но, если данных становится слишком много, а вопрос произвольности встаёт всё острее – использовать Java будет не такой уж и плохой идеей. Тем более, что в ней имеются все те же инструменты с одним из которых мы сейчас и познакомились.

Советуем почитать