PascalABC.NET официальный канал
رفتن به کانال در Telegram
Официальный канал языка и системы программирования PascalABC.NET
نمایش بیشتر1 864
مشترکین
-624 ساعت
-57 روز
-2330 روز
آرشیو پست ها
Модуль DataFrameABC - удаление столбцов
Для удаления столбцов используется метод Drop. Возвращается новый датафрейм.
Данные не копируются, т.е. Drop работает как View.
#DataFrameABC
Модуль DataFrameABC - выбор столбцов
Для выбора столбцов используется метод Select. Возвращается новый датафрейм.
Данные не копируются - метод Select работает как View
#DataFrameABC
Вышла версия 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.
Версия PascalABC.NET 3.11.1
Вышла версия PascalABC.NET 3.11.1. Список изменений - здесь
https://pascalabcnet.github.io/mydoc_release_notes_3_11_1.html
Основное - новый промышленный модуль для работы с данными - DataFrameABC. Возможности, скорость работы - сравнимы с pandas.
Модуль DataFrameABC - переименование столбцов
Для переименования столбцов используется метод датафрейма Rename. Возвращается новый датафрейм.
Можно переименовывать несколько столбцов одномоментно
#DataFrameABC
Модуль 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Новый стандартный модуль 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Связка методов 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 - для реальной аналитики данных!Лаконичные вычисления для матриц
Насколько выразительной и компактной может быть запись алгоритмов, в которых сначала вычисляется некоторая характеристика строк или столбцов матрицы, а затем — агрегированная характеристика по всем полученным значениям!
Например, одной строкой можно найти максимум сумм строк матрицы.
Точно так же просто вычисляется среднее значение минимумов её столбцов.
begin
var a := MatrRandom;
a.Println;
// Максимум сумм строк
a.Rows.Max(row -> row.Sum).Println;
// Среднее минимумов столбцов
a.Cols.Average(col -> col.Min).Println;
end.Прямо сейчас студенты 1 курса ФИИТ сдают экзамен по Основам программирования.
И подошли к делу очень творчески :)
Оценка - отлично!
Во всех ли строках матрицы есть четные элементы?
Решение с помощью комбинации методов All и Any
begin
var a := MatrRandom(5,3);
a.Println;
a.Rows.All(row -> row.Any(x -> x.IsEven)).Print;
end.Метод последовательности FirstOrDefault
Метод последовательности FirstOrDefault позволяет заменять цикл с break. Он работает лениво и выходит из вычислений в тот момент как найден элемент, удовлетворяющий условию - всё как в цикле break.
Единственный недостаток - в случае неудачи возвращает значение по умолчанию - данном случае 0.
begin
var a := ArrRandomInteger(20,1,20);
a.Println;
var res := a.FirstOrDefault(x -> x > 17);
Print(res);
res := 0;
foreach var x in a do
if x > 17 then
begin
res := x;
break;
end;
Print(res);
end.🎄 С Новым 2026 годом!
Друзья, с наступающим Новым годом!
Спасибо, что этот год вы провели вместе с PascalABC.NET — в обсуждении задач, примеров, поиске красивых решений.
Пусть в 2026 году:
🔷 код будет читаемым и лаконичным,
🔶 типы станут надёжной путеводной звездой,
🔷 алгоритмы — интересными и быстрыми,
🔶 а изучение программирования будет приносить удовольствие и уверенность в результате.
В новом году мы планируем важный шаг — перевод PascalABC.NET на .NET 9.0 и дальнейшее развитие инструментов для обучения современному программированию.
Спасибо, что остаетесь с нами, делитесь идеями и проблемами, задаёте вопросы и используете PascalABC.NET в обучении и работе.
До встречи в 2026 году — он уже почти скомпилировался :)
Сколько слов в строке каждой длины
Если строка состоит из слов, легко посчитать, сколько слов каждой длины, используя комбинацию методов GropupBy и Each. Метод Each возвращает словарь, который можно отсортировать по ключу и вывести
begin
var s := 'как однажды жак звонарь головой сломал фонарь';
s.ToWords
.GroupBy(word -> word.Length)
.Each(word -> word.Count)
.OrderBy(kv -> kv.Key)
.PrintLines(kv -> $'{kv.Key}-буквенных - {kv.Value} шт')
end.match — это case по типам
В современном PascalABC.NET можно элегантно обрабатывать значение в зависимости от его типа, а не только от значения.
begin
var obj: object := 'Hello PascalABC.NET!';
match obj with
integer(i): Println(i * i);
string(s): Println(s.Length);
else Println(TypeName(obj));
end;
end.
Что важно:
🔹выбор ветки происходит по типу объекта
🔹при совпадении тип сразу доступен в переменной (i, s)
🔹код получается короче и понятнее, чем цепочки if obj is ...
По сути, это case, который работает с типами.2000 подписчиков в нашем телеграм-канале!
Прямо сейчас: нас - 2000!
👉 https://tgstat.ru/channel/@pascalabc_official/stat
И это особенно приятно, потому что канал растёт естественно:
🔹без накруток
🔹без покупной рекламы
🔹без «случайных» подписчиков
Здесь собираются те, кому действительно интересен современный PascalABC.NET:
🔹живые примеры кода
🔹новые возможности языка
🔹приёмы, о которых не пишут в учебниках
🔹актуальные подходы и современные парадигмы программирования
Спасибо каждому, кто читает, думает, пробует и пишет код на PascalABC.NET вместе с нами 🚀
Фабрика предикатов
Напишем функцию, которая возвращает лямбду-предикат с параметром. Функция принимает параметр, лямбда его захватывает.
В результате вместо лямбды можно писать вызов функции с параметром
function less(a: integer): integer -> boolean
:= x -> x < a;
begin
Arr(1..9).Where(less(5)).Print
end.Решето Эратосфена - максимально компактно и понятно
Решето Эратосфена — это один из наиболее эффективных алгоритмов для нахождения всех простых чисел до заданного предела n. Он отличается высокой производительностью и простотой реализации.
Алгоритм обладает асимптотической сложностью O(n * log log n), что делает его значительно быстрее простейших методов определения простоты через деление.
##
function SieveOfEratosthenes(n: integer): array of integer;
begin
var isPrime := [False] * 2 + [True] * (n - 1);
for var i := 2 to ISqrt(n) do
if isPrime[i] then
for var j := i * i to n step i do
isPrime[j] := False;
Result := (2..n).Where(i -> isPrime[i]).ToArray;
end;
SieveOfEratosthenes(1000).Println;
А что такое ISqrt(n) - читайте в справке!Находим элементы, встречающиеся в последовательности ровно один раз
Используем два множества: одно для потенциально уникальных значений, второе — для повторяющихся.
begin
var data := [1, 2, 3, 2, 4, 5, 3, 6, 7, 1, 8, 9, 4, 10];
data.Println;
var unique, multi: set of integer;
foreach var num in data do
begin
if num in multi then
continue;
if num in unique then
begin
unique -= num;
multi += num;
end
else unique += num;
end;
unique.Order.Println;
end.
Ровно один раз встретившиеся элементы выводятся в отсортированном виде.