Лаконичные вычисления для матриц
Насколько выразительной и компактной может быть запись алгоритмов, в которых сначала вычисляется некоторая характеристика строк или столбцов матрицы, а затем — агрегированная характеристика по всем полученным значениям!
Например, одной строкой можно найти максимум сумм строк матрицы.
Точно так же просто вычисляется среднее значение минимумов её столбцов.
Насколько выразительной и компактной может быть запись алгоритмов, в которых сначала вычисляется некоторая характеристика строк или столбцов матрицы, а затем — агрегированная характеристика по всем полученным значениям!
Например, одной строкой можно найти максимум сумм строк матрицы.
Точно так же просто вычисляется среднее значение минимумов её столбцов.
begin
var a := MatrRandom;
a.Println;
// Максимум сумм строк
a.Rows.Max(row -> row.Sum).Println;
// Среднее минимумов столбцов
a.Cols.Average(col -> col.Min).Println;
end.
👍6
Связка методов GroupBy и Each - словарь характеристик групп
Открываем красоту LINQ в сочетании с элегантностью PascalABC.NET. Смотрите, как легко делать аналитику данных:
Почему этот подход — находка:
🎯 .GroupBy() + .Each() — идеальная пара для групповых операций
🎯 Автоматический словарь — .Each() сам возвращает Dictionary<K,V>
🎯 Читаемость — код говорит сам за себя: "сгруппируй и для каждой группы посчитай"
🎯 Расширяемость — подходит для любых агрегаций: Average, Sum, Min, Max, DistinctBy
Современный PascalABC.NET - для реальной аналитики данных!
Открываем красоту LINQ в сочетании с элегантностью PascalABC.NET. Смотрите, как легко делать аналитику данных:
type
Product = auto class
Category: string;
Model: string;
Price: real;
Rating: real;
end;
begin
var products :=
[
new Product('Phones', 'iPhone 13', 499.99, 4.5),
new Product('Phones', 'Galaxy S21', 699.99, 4.7),
new Product('Phones', 'iPhone 13', 299.99, 4.2),
new Product('Laptops', 'MacBook', 999.99, 4.8),
new Product('Laptops', 'MacBook', 1299.99, 4.9),
new Product('Tablets', 'iPad Air', 399.99, 4.3),
new Product('Tablets', 'iPad Air', 399.99, 4.3)
];
// 1. Количество уникальных моделей по категориям
var uniqueModels := products
.GroupBy(p -> p.Category)
.Each(g -> g.DistinctBy(p -> p.Model).Count);
// 2. Средняя цена по категориям
var avgPrices := products
.GroupBy(p -> p.Category)
.Each(g -> g.Average(p -> p.Price));
// 3. Количество товаров по категориям
var totalCounts := products
.GroupBy(p -> p.Category)
.Each(g -> g.Count);
Println('Уникальные модели по категориям:');
uniqueModels.PrintLines(kv -> $' {kv.Key}: {kv.Value}');
Println('Средняя цена по категориям:');
avgPrices.PrintLines(kv -> $' {kv.Key}: ${kv.Value:F2}');
Println('Всего товаров по категориям:');
totalCounts.PrintLines(kv -> $' {kv.Key}: {kv.Value}');
end.
Почему этот подход — находка:
🎯 .GroupBy() + .Each() — идеальная пара для групповых операций
🎯 Автоматический словарь — .Each() сам возвращает Dictionary<K,V>
🎯 Читаемость — код говорит сам за себя: "сгруппируй и для каждой группы посчитай"
🎯 Расширяемость — подходит для любых агрегаций: Average, Sum, Min, Max, DistinctBy
Современный PascalABC.NET - для реальной аналитики данных!
❤12👍3
Новый стандартный модуль DataFrameABC
В PascalABC.NET 3.11.1 beta появился модуль DataFrameABC для работы с датафреймами.
Он совмещает идеи pandas и преимущества компилируемых языков.
Возможности:
4 типа столбцов: Int, Str, Bool, Float
Считывание из CSV и текстовой строки
И многое другое...
Пример 1. Загрузка и просмотр данных
#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
🔥13❤8
Модуль DataFrameABC - выбор столбцов
Выбор столбцов в новом эффективном модуле DataFrameABC делается с помощью метода Select с указанием массива выбираемых столбцов.
Возвращается View в виде нового датафрейма
#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
Для переименования столбцов используется метод датафрейма Rename. Возвращается новый датафрейм.
Можно переименовывать несколько столбцов одномоментно
#DataFrameABC
🤗12✍3❤2🔥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.
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
Для удаления столбцов используется метод Drop. Возвращается новый датафрейм.
Данные не копируются, т.е. Drop работает как View.
#DataFrameABC
👍12
Модуль DataFrame - скорость считывания данных из CSV
Считывание данных из CSV оптимизировано. В примере - файл с 1 миллионом строк и 20 столбцами разных типов считывается за 1.2 секунды. Этот же файл в pandas считывается за 0.65 сек - здесь код написан на C++, поэтому быстрее, но не намного.
В примере вы также видите другие параметры Load - разделители между данными, режим наличия заголовка и режим строгой проверки на ошибки
#DataFrameABC
Считывание данных из CSV оптимизировано. В примере - файл с 1 миллионом строк и 20 столбцами разных типов считывается за 1.2 секунды. Этот же файл в pandas считывается за 0.65 сек - здесь код написан на C++, поэтому быстрее, но не намного.
В примере вы также видите другие параметры Load - разделители между данными, режим наличия заголовка и режим строгой проверки на ошибки
#DataFrameABC
👍14
Модуль DataFrameABC - фильтрация
Для фильтрации строк используется метод Filter.
Возвращается новый датафрейм.
Вызов - в стиле LINQ, однако row здесь имеет тип DataFrameCursor - курсор, перемещающийся по данным.
#DataFrameABC
Для фильтрации строк используется метод Filter.
Возвращается новый датафрейм.
Вызов - в стиле LINQ, однако row здесь имеет тип DataFrameCursor - курсор, перемещающийся по данным.
#DataFrameABC
👍3
Модуль DataFrameABC - фильтрация с пропущенными данными
Пропущенные данные в SCV-файле обозначаются как NA либо просто пустым элементом.
У курсора row есть метод, позволяющий проверять, пропущены ли данные в этом столбце.
В примере - фильтрация по строкам, в которых не пропущены данные в столбце score
#DataFrameABC
Пропущенные данные в SCV-файле обозначаются как NA либо просто пустым элементом.
У курсора row есть метод, позволяющий проверять, пропущены ли данные в этом столбце.
В примере - фильтрация по строкам, в которых не пропущены данные в столбце score
#DataFrameABC
🔥3👍1
Модуль DataFrameABC - добавление нового вычисляемого столбца
Можно добавлять новые вычисляемые столбцы с помощью WithColumn...
В примере показано, как добавить вычисляемый столбец passed, который принимает значение True для тех, у кого score >= 80.
Создается новый датафрейм, но данные создаются только для нового столбца.
#DataFrameABC
Можно добавлять новые вычисляемые столбцы с помощью WithColumn...
В примере показано, как добавить вычисляемый столбец passed, который принимает значение True для тех, у кого score >= 80.
Создается новый датафрейм, но данные создаются только для нового столбца.
#DataFrameABC
👍3
Фрактальная L-кривая Sierpinski Arrowhead
Отвлечемся от ML - и посмотрим на красоту фрактальных кривых.
Перед нами - Sierpinski Arrowhead
Модуль Turtle позволяет масштабировать мышью изображение.
Отвлечемся от 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.
🔥7❤1👍1
Inner Join в DataFrameABC
Иногда данные находятся в разных таблицах, и их нужно объединить по общему ключу. Для этого используется Inner Join — соединение, которое оставляет только те строки, где ключ присутствует в обеих таблицах.
Результат:
Что произошло:
* соединение выполняется по столбцу id
* строка
* строка
Таким образом, Inner Join оставляет только пересечение ключей.
Такой тип соединения — один из самых используемых в анализе данных: объединение пользователей и заказов, студентов и оценок, товаров и продаж и т.д.
#MachineLearning
Иногда данные находятся в разных таблицах, и их нужно объединить по общему ключу. Для этого используется 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 сохраняет все строки из левой таблицы, даже если для них нет совпадения в правой.
Результат:
Здесь:
*
*
* строка
Это главное отличие от Inner Join, где строка
Ранее мы показывали 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 сохранился, но значение score — NA* строка
id = 4 из таблицы scores не попала в результатЭто главное отличие от Inner Join, где строка
Charlie исчезла бы из результата.👍10👌1
PrintPreview для DataFrame
Обратите внимание, как выводит данные PrintPreview: выводится 3 строки - примерно половина из начала датасета и оставшаяся часть - из конца.
Обратите внимание, как выводит данные 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 визуализация
💡 Что здесь важно:
— Загрузка готового датасета (Datasets.Iris)
— Работа через DataFrame (ds.Data)
— Выделение матрицы признаков (ToMatrix)
— Кодирование целевой переменной (EncodeLabels)
— Визуализация через PairPlot
📌 PairPlot — базовый инструмент разведочного анализа данных (EDA):
он показывает распределения признаков и их попарные зависимости, что позволяет быстро увидеть структуру данных и разделимость классов.
Дальше будут:
— обучение моделей
— метрики
— пайплайны
— практические кейсы
Начинаем двигаться к полноценному 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