PascalABC.NET официальный канал
1.91K subscribers
599 photos
1 video
9 files
404 links
Официальный канал языка и системы программирования PascalABC.NET
Download Telegram
Новый стандартный модуль DataFrameABC

В PascalABC.NET 3.11.1 beta появился модуль DataFrameABC для работы с датафреймами.

Он совмещает идеи pandas и преимущества компилируемых языков.

Возможности:
4 типа столбцов: Int, Str, Bool, Float
Считывание из CSV и текстовой строки
И многое другое...

Пример 1. Загрузка и просмотр данных

uses DataFrameABC;

begin
var df := DataFrame.FromCsvText('''
name,age,score
Alice,20,85
Bob,22,90
Charlie,21,78
''');

df.Print;
end.


#DataFrameABC
🔥138
Модуль DataFrameABC - выбор столбцов

Выбор столбцов в новом эффективном модуле DataFrameABC делается с помощью метода Select с указанием массива выбираемых столбцов.

Возвращается View в виде нового датафрейма

uses DataFrameABC;

begin
var df := DataFrame.FromCsvText('''
name,age,score
Alice,20,85
Bob,22,90
Charlie,21,78
''');

df.Select(['name', 'score']).Print;
end.


#DataFrameABC
👍9
Модуль DataFrameABC - переименование столбцов

Для переименования столбцов используется метод датафрейма Rename. Возвращается новый датафрейм.

Можно переименовывать несколько столбцов одномоментно

#DataFrameABC
🤗1232🔥1😱1
Вышла версия PascalABC.NET 3.11.1. Список изменений - здесь
https://pascalabcnet.github.io/mydoc_release_notes_3_11_1.html

Основное - новый промышленный модуль для работы с данными - DataFrameABC. Возможности, скорость работы - сравнимы с pandas, ML.NET, Polars, Apache Spark DataFrame API.
👍19
Модуль DataFrameABC - удаление столбцов

Для удаления столбцов используется метод Drop. Возвращается новый датафрейм.
Данные не копируются, т.е. Drop работает как View.

#DataFrameABC
👍12
Модуль DataFrame - скорость считывания данных из CSV

Считывание данных из CSV оптимизировано. В примере - файл с 1 миллионом строк и 20 столбцами разных типов считывается за 1.2 секунды. Этот же файл в pandas считывается за 0.65 сек - здесь код написан на C++, поэтому быстрее, но не намного.

В примере вы также видите другие параметры Load - разделители между данными, режим наличия заголовка и режим строгой проверки на ошибки

#DataFrameABC
👍14
Модуль DataFrameABC - фильтрация

Для фильтрации строк используется метод Filter.
Возвращается новый датафрейм.

Вызов - в стиле LINQ, однако row здесь имеет тип DataFrameCursor - курсор, перемещающийся по данным.

#DataFrameABC
👍3
Модуль DataFrameABC - фильтрация с пропущенными данными

Пропущенные данные в SCV-файле обозначаются как NA либо просто пустым элементом.

У курсора row есть метод, позволяющий проверять, пропущены ли данные в этом столбце.

В примере - фильтрация по строкам, в которых не пропущены данные в столбце score

#DataFrameABC
🔥3👍1
Модуль DataFrameABC - добавление нового вычисляемого столбца

Можно добавлять новые вычисляемые столбцы с помощью WithColumn...
В примере показано, как добавить вычисляемый столбец passed, который принимает значение True для тех, у кого score >= 80.

Создается новый датафрейм, но данные создаются только для нового столбца.

#DataFrameABC
👍3
Фрактальная L-кривая Sierpinski Arrowhead

Отвлечемся от ML - и посмотрим на красоту фрактальных кривых.

Перед нами - Sierpinski Arrowhead

Модуль Turtle позволяет масштабировать мышью изображение.

uses Turtle,GraphWPF;

var
Atom,FStr,XStr,YStr: string;
angle,len,x0,y0: real;
n: integer;

procedure Init5; // Sierpinski Arrowhead
begin
(Atom,FStr,XStr,YStr) := ('X', 'F', 'YF+XF+Y', 'XF-YF-X');
(angle,len,n,x0,y0) := (60,0.1,9,1,1);
end;

procedure RunStr(s: string; n: integer);
begin
foreach var c in s do
case c of
'+': Turn(angle);
'-': Turn(-angle);
'f','F': if n>0 then RunStr(FStr,n-1) else Forw(len);
'x','X': if n>0 then RunStr(XStr,n-1);
'y','Y': if n>0 then RunStr(YStr,n-1);
else Print('error')
end;
end;

begin
Init5;
x0 := -10;
y0 := -10;
ToPoint(x0,y0);
SetWidth(0.5);
Down;
RunStr(Atom,n);
Up;
end.
🔥71👍1
DataFrameABC - простые статистики по столбцу

В DataFrame можно просто вычислить простейшие статистики по числовым столбцам - в стиле pandas
8👍2🔥1
DataFrameABC - Describe по столбцу

В DataFrame все числовые статистики по столбцу можно вычислить с помощью метода Describe. Возвращается запись, содержащая поля Count, Min, Max, Mean, Std.

NA - поля игнорируются.
6👍1
DataFrameABC - группировка с последующим вычислением групповой операции

В DataFrame можно сгруппировать данные по какому то столбцу, после чего вычислить какую-нибудь групповую характеристику для элементов группы.

На скрине - вычисление среднего score в каждой группе людей с одним возрастом.
👍5
Inner Join в DataFrameABC

Иногда данные находятся в разных таблицах, и их нужно объединить по общему ключу. Для этого используется Inner Join — соединение, которое оставляет только те строки, где ключ присутствует в обеих таблицах.

// Inner Join
uses DataFrameABC;

begin
var students := DataFrame.FromCsvText('''
id,name
1,Alice
2,Bob
3,Charlie
''');

var scores := DataFrame.FromCsvText('''
id,score
1,85
2,90
4,70
''');

students.Join(scores, 'id').Print;
end.


Результат:

id  name   score
1 Alice 85
2 Bob 90


Что произошло:

* соединение выполняется по столбцу id
* строка id = 3 отсутствует в таблице scores, поэтому она исключается
* строка id = 4 отсутствует в таблице students, поэтому она тоже исключается

Таким образом, Inner Join оставляет только пересечение ключей.

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

#MachineLearning
👍8❤‍🔥1
Left Join в DataFrameABC

Ранее мы показывали Inner Join — он оставляет только те строки, для которых ключи есть в обеих таблицах.
Теперь посмотрим на Left Join, который ведёт себя иначе.

Left Join сохраняет все строки из левой таблицы, даже если для них нет совпадения в правой.

// Left Join
uses DataFrameABC;

begin
var students := DataFrame.FromCsvText('''
id,name
1,Alice
2,Bob
3,Charlie
''');

var scores := DataFrame.FromCsvText('''
id,score
1,85
2,90
4,70
''');

students.Join(scores, 'id', jkLeft).Print;
end.


Результат:

id     name  score
1 Alice 85
2 Bob 90
3 Charlie NA


Здесь:

* Alice и Bob получили свои score
* Charlie сохранился, но значение scoreNA
* строка id = 4 из таблицы scores не попала в результат

Это главное отличие от Inner Join, где строка Charlie исчезла бы из результата.
👍10👌1
PrintPreview для DataFrame

Обратите внимание, как выводит данные PrintPreview: выводится 3 строки - примерно половина из начала датасета и оставшаяся часть - из конца.

uses DataFrameABC;

begin
var df := DataFrame.FromCsvText('''
name,age,score
Alice,20,85
Bob,22,90
Charlie,21,78
Bob,22,90
Clara,,78
Kat,21,NA
''');

df.PrintPreview(3);
end.
8💯1
ML в PascalABC.NET — старт

В PascalABC.NET появилась новая библиотека машинного обучения — ML PascalABC.NET.
Она спроектирована как полноценный промышленный стек: с чёткой архитектурой, типобезопасностью и без внешних зависимостей.

Начинаем с базовых примеров.

📊 Стандартный датасет Iris + PairPlot визуализация

uses MLABC, PlotML;

begin
var ds := Datasets.Iris;
var df := ds.Data;

var X := df.ToMatrix(ds.Features);
var labels := df.EncodeLabels(ds.Target);

Plot.PairPlot(X, labels, ds.Features);

Plot.Title := 'Iris: пары признаков';
end.


💡 Что здесь важно:

— Загрузка готового датасета (Datasets.Iris)
— Работа через DataFrame (ds.Data)
— Выделение матрицы признаков (ToMatrix)
— Кодирование целевой переменной (EncodeLabels)
— Визуализация через PairPlot

📌 PairPlot — базовый инструмент разведочного анализа данных (EDA):
он показывает распределения признаков и их попарные зависимости, что позволяет быстро увидеть структуру данных и разделимость классов.

Дальше будут:
— обучение моделей
— метрики
— пайплайны
— практические кейсы

Начинаем двигаться к полноценному ML прямо в PascalABC.NET.
15🔥3
📊 Синтетические датасеты в PascalABC.NET: MakeBlobs

Иногда для демонстрации алгоритмов или отладки ML-моделей нужны простые и наглядные данные. Вместо поиска реальных датасетов удобно генерировать их самостоятельно.

В модуле MLABC есть классический генератор — MakeBlobs.

Он создаёт точки, сгруппированные в кластеры (как в задачах кластеризации и классификации).

🔹 Что делает MakeBlobs:

* генерирует заданное число точек
* разбивает их на кластеры
* добавляет контролируемый шум
* возвращает:

* X — координаты точек
* y — метки кластеров

🔹 Пример + визуализация через PlotML:

uses MLABC, PlotML;

begin
var centers := 3;
var (X,y) := Datasets.MakeBlobs(
n := 600,
centers := centers,
clusterStd := 0.8,
seed := 1
);

Plot.Title := 'MakeBlobs синтетический датасет';

var xs := X.Col(0);
var ys := X.Col(1);

Plot.Points(xs, ys, LabelsToInts(y), size := 4);
end.


🔹 Ключевые параметры:

* n — число точек
* centers — число кластеров
* clusterStd — разброс внутри кластера
* seed — фиксирует генерацию (важно для воспроизводимости)

💡 Где это полезно:

* объяснение кластеризации (k-means, DBSCAN)
* тестирование моделей классификации
* демонстрации на лекциях
* отладка пайплайнов
👍112🔥1
Машинное обучение в PascalABC.NET: логистическая регрессия

Продолжаем серию практических постов по ML-библиотеке в PascalABC.NET.
В этом посте — первый полный пример: обучение и применение модели.

Разберём пример на классическом датасете Iris 🌸

uses MLABC;

begin
var ds := Datasets.Iris;
var df := ds.Data;

var X := df.ToMatrix(ds.Features);
var y := df.EncodeLabels(ds.Target);

var (Xtrain, Xtest, ytrain, ytest) :=
Validation.TrainTestSplit(X, y, 0.2, 1);

var model := new LogisticRegression;

model.Fit(Xtrain, ytrain);

var pred := model.Predict(Xtest);

Println('Accuracy:', Metrics.Accuracy(ytest, pred):0:3);
end.


🔍 Что здесь происходит

1. Загрузка данных
▪️ Datasets.Iris — встроенный датасет
▪️ df — табличное представление (DataFrame)

2. Подготовка признаков
▪️ ToMatrix → преобразование в Matrix (числовое ядро)
▪️ EncodeLabels → кодирование классов в Vector<int>

3. Разбиение
▪️ TrainTestSplit → контроль воспроизводимости через seed

4. Модель
▪️ LogisticRegression
▫️ мультиклассовая (softmax)
▫️ работает через Matrix/Vector
▫️ типобезопасная реализация

5. Обучение и предсказание
▪️ Fit → обучение
▪️ Predict → классы

6. Метрика
▪️ Metrics.Accuracy → базовая проверка качества

💡 Важно
Это не “обёртка над Python”, а нативная ML-библиотека на PascalABC.NET:

▪️ все шаги явно прописаны в коде (нет скрытых преобразований)
▪️ данные и модели имеют строгие типы (Matrix, Vector<int>)
▪️ результат полностью воспроизводим (за счёт фиксированного seed)
🔥8🥰21
Гистограмма распределения цен

uses MLABC, PlotML;

begin
var ds := Datasets.MoscowHousing;
var df := ds.Data;

var price := df.ToVector(ds.Target);

Plot.Hist(price, bins := 40);
Plot.Title := 'Распределение цен на квартиры в Москве';
Plot.XLabel('Цена (руб)');
Plot.YLabel('Количество');
end.


Гистограмма показывает, как часто встречаются значения из набора данных.

В данном случае:

• по оси X — цена квартиры
• по оси Y — количество квартир с такой ценой

Каждый столбец (bin) — это интервал цен.

По гистограмме можно:

• понять, в каком диапазоне находится большинство значений
• увидеть редкие значения (очень дешёвые или очень дорогие квартиры)
• оценить форму распределения (например, симметричное или с «длинным хвостом» вправо)

Это базовый инструмент анализа данных перед построением моделей.

#MLABC
👍61
🌳 Рекурсия на примере идеально сбалансированного дерева

type
Node<T> = auto class
public
Value: T;
Left, Right: Node<T>;
end;

function RandomTree(n: integer): Node<integer>;
begin
if n = 0 then
Result := nil
else
Result := new Node<integer>(
Random(100),
RandomTree((n - 1) div 2),
RandomTree(n - 1 - (n - 1) div 2)
);
end;

procedure Infix<T>(r: Node<T>; act: Action<T>);
begin
if r = nil then exit;
Infix(r.Left, act);
act(r.Value);
Infix(r.Right, act);
end;

begin
var root := RandomTree(10);
Infix(root, x -> Print(x));
end.


💡 Что здесь происходит

1. Идеально сбалансированное дерево
Функция RandomTree(n) строит дерево из n узлов так, чтобы:

* левое поддерево получает (n - 1) div 2 узлов
* правое — остальные

Разница размеров поддеревьев не больше 1 ⇒ дерево максимально «ровное» по высоте.

2. Рекурсия

* База: n = 0 → nil
* Шаг: создаём узел и рекурсивно строим левое и правое поддеревья

То же самое в обходе:

* если узел пустой — выходим
* иначе обходим левое поддерево → текущий узел → правое

3. Инфиксный обход (LNR)
Порядок:
👉 Left → Node → Right

Это означает:

* сначала все элементы слева
* затем текущий
* затем справа

#pascalabc #рекурсия #деревья
👍102