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

Решение с помощью комбинации методов All и Any

begin
var a := MatrRandom(5,3);
a.Println;
a.Rows.All(row -> row.Any(x -> x.IsEven)).Print;
end.
9👍1
Прямо сейчас студенты 1 курса ФИИТ сдают экзамен по Основам программирования.

И подошли к делу очень творчески :)

Оценка - отлично!
👍319😁9❤‍🔥3🥰1
Лаконичные вычисления для матриц

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

Например, одной строкой можно найти максимум сумм строк матрицы.

Точно так же просто вычисляется среднее значение минимумов её столбцов.

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. Смотрите, как легко делать аналитику данных:

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. Загрузка и просмотр данных

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