November 26

Метод NWise в PascalABC.NET

Метод NWise в PascalABC.NET помогает разбивать последовательности на подгруппы фиксированной длины. Он возвращает последовательность массивов, где каждый массив содержит соседние элементы исходной последовательности. Это удобно для задач анализа временных данных, обработки текстов или любых последовательностей.

Пример работы:

var a := Arr(1, 2, 3, 4, 5, 6);
foreach var group in a.NWise(3) do
  Println(group); 
// Результат: [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]

📝 Примеры задач для анализа временных рядов:

1️⃣ Скользящее среднее температуры
Вычислим средние значения температуры за последние 3 дня:

var temperatures := Arr(22.1, 23.4, 21.8, 24.2, 22.9, 23.7);
foreach var window in temperatures.NWise(3) do
  Println(window.Average.Round(4)); 
// Результат: 22.4333, 23.1333, 22.9667, 23.6

2️⃣ Обнаружение резких изменений
Найдем периоды, где изменения потребления электроэнергии превышают 50 кВт⋅ч:

var consumption := Arr(120, 180, 150, 200, 260, 220);
foreach var window in consumption.NWise(2) do
  if Abs(window[1] - window[0]) > 50 then
    Println(window);
// Результат: [120, 180], [200, 260]

3️⃣ Максимальная скорость ветра
Определим максимальную скорость ветра за каждые 3 часа:

var windSpeeds := Arr(5, 8, 6, 10, 12, 9, 7);
foreach var window in windSpeeds.NWise(3) do
  Println(window.Max); 
// Результат: 8, 10, 12, 12, 12

4️⃣ Суммирование данных в окнах
Подсчитаем общее количество запросов к серверу за каждые 4 часа:

var requests := Arr(50, 60, 70, 80, 90, 100, 110);
foreach var window in requests.NWise(4) do
  Println(window.Sum);
// Результат: 260, 300, 340, 380

5️⃣ Выявление стабильных периодов
Найдем периоды, где изменения курса валют минимальны (разница между максимумом и минимумом в окне ≤ 1):

var exchangeRates := Arr(74.5, 74.6, 74.8, 74.7, 74.5, 74.4, 74.6);
foreach var window in exchangeRates.NWise(3) do
  if window.Max - window.Min <= 1 then
    Println(window);
// Результат: [74.6, 74.8, 74.7], [74.5, 74.4, 74.6]

6️⃣ Выявление трендов
Определим окна, где значения постоянно растут:

var sales := Arr(100, 120, 140, 130, 150, 160, 170);
foreach var window in sales.NWise(3) do
  if (window[0] < window[1]) and (window[1] < window[2]) then
    Println(window);
// Результат: [100, 120, 140], [130, 150, 160], [150, 160, 170]

Вывод

В настоящей статье представлены различные примеры использования метода NWise в прикладных задачах.