Перейти к содержимому

Класс DataFrame

DataFrame — это таблица данных. В ней строки описывают объекты или записи, а столбцы хранят отдельные свойства этих объектов.

В ML PascalABC.NET DataFrame используется как основной тип для работы с табличными данными: их можно загружать из файла или текста в CSV-формате, просматривать, фильтровать, сортировать, группировать, объединять и готовить для моделей машинного обучения.

Структура DataFrame

Строка — это одна запись в таблице. Например, один человек, один товар, одна продажа или одно измерение. В машинном обучении такую запись часто называют объектом.

Столбец — это одно поле данных: имя, возраст, город, цена, дата, результат измерения. У каждого столбца есть имя и тип данных. В машинном обучении столбцы, которые используются для анализа и построения модели, называют признаками (features).

Ячейка находится на пересечении строки и столбца и содержит значение одного признака для конкретного объекта.

В DataFrame каждый столбец имеет определённый тип. Тип столбца показывает, какие значения могут в нём храниться. Например, столбец с возрастом хранит числа, столбец с датой — даты, а столбец с названием товара — строки.

Основные типы:

  • Int — целые числа;
  • Float — вещественные числа;
  • Str — строки;
  • Bool — логические значения;
  • DateTime — дата и время.

Это типы столбцов библиотеки, а не типы данных PascalABC.NET. Например, типу столбца Int соответствует тип PascalABC.NET integer, типу Floatreal, типу Strstring, а типу Boolboolean. Тип DateTime в библиотеке ML называется так же, как соответствующий тип в PascalABC.NET.

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

Категориальный столбец показывает, к какой группе относится каждый объект. Его значения выбираются из определённого набора категорий и обычно повторяются.

Например:

  • город: Москва, Казань, Самара;
  • отдел: Продажи, Бухгалтерия, Разработка;
  • уровень: младший, средний, старший.

Не каждый строковый столбец является категориальным. Например, название отдела — категория, а комментарий покупателя — обычный текст. Имена, адреса и уникальные номера также обычно не считают категориями, даже если они записаны строками.

Категории бывают:

  • номинальные — между ними нет заданного порядка: Москва, Казань;
  • порядковые — категории можно расположить по порядку: младший, средний, старший.

Перед обучением модели категории обычно преобразуют в числа. Подробнее — в разделе Кодирование категорий.

Большинство операций с DataFrame возвращают новую таблицу. Исходная таблица после совершения операции не изменяется.

var adults := df.Filter(row -> row['Возраст'] >= 18);

Здесь adults — новая таблица только со взрослыми людьми, а исходный df не изменился.

Такой подход делает цепочки операций понятнее: результат каждого шага можно сохранить в отдельную переменную или сразу передать дальше.

Обычная работа с таблицей выглядит так:

  1. Загрузить и посмотреть данные.
  2. Выбрать, добавить или изменить столбцы.
  3. Отфильтровать и отсортировать строки.
  4. Посчитать статистику.
  5. Сгруппировать данные.
  6. Объединить несколько таблиц.
  7. Обработать дату и время.
  8. Разобраться с пропущенными данными.
uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Товар,Категория,Количество,Цена
Хлеб,Продукты,2,45.50
Молоко,Продукты,1,72.90
Блокнот,Канцтовары,3,120
''');
var res := df
.WithColumnFloat('Сумма', row -> row['Количество'] * row['Цена'])
.Filter(row -> row['Сумма'] > 100)
.SortByDescending('Сумма');
res.Print;
end.

В этом примере таблица создаётся из CSV-текста, затем добавляется новый столбец Сумма, строки фильтруются по сумме покупки и сортируются по убыванию.