Розкрийте потенціал даних часових рядів за допомогою віконних функцій. Цей посібник охоплює ключові концепції, практичні приклади та передові методи аналізу даних.
Аналітика часових рядів: майстерне володіння віконними функціями для глибокого аналізу даних
Дані часових рядів, що характеризуються своєю послідовною та залежною від часу природою, поширені в багатьох галузях. Від відстеження цін на акції та моніторингу трафіку вебсайтів до аналізу показників датчиків та прогнозування тенденцій продажів — здатність отримувати значущі висновки з даних часових рядів є вирішальною для прийняття обґрунтованих рішень. Віконні функції надають потужний і гнучкий набір інструментів для виконання обчислень над набором рядків, пов'язаних із поточним рядком у таблиці або фреймі даних, що робить їх незамінними для аналізу часових рядів.
Розуміння даних часових рядів
Дані часових рядів — це послідовність точок даних, індексованих у хронологічному порядку. Точки даних можуть представляти різні метрики, такі як:
- Фінансові дані: ціни на акції, курси валют, обсяги торгів
- Дані про продажі: щоденні, щотижневі або щомісячні показники продажів для різних продуктів
- Дані з датчиків: показники температури, вимірювання тиску, рівні вологості
- Дані вебтрафіку: відвідування вебсайтів, перегляди сторінок, показники відмов
- Дані про споживання енергії: погодинне або щоденне використання електроенергії
Аналіз даних часових рядів включає виявлення закономірностей, тенденцій та сезонності, які можна використовувати для прогнозування майбутніх значень, виявлення аномалій та оптимізації бізнес-процесів.
Вступ до віконних функцій
Віконні функції, також відомі як віконні агрегати або аналітичні функції, дозволяють виконувати обчислення над набором рядків, пов'язаних із поточним рядком, не групуючи рядки в єдиний результуючий набір, як це роблять традиційні агрегатні функції (наприклад, SUM, AVG, COUNT). Ця можливість особливо корисна для аналізу часових рядів, де часто потрібно обчислювати ковзні середні, кумулятивні суми та інші метрики на основі часу.
Віконна функція зазвичай складається з таких компонентів:
- Функція: обчислення, яке потрібно виконати (наприклад, AVG, SUM, RANK, LAG).
- Клауза OVER: визначає вікно рядків, що використовуються для обчислення.
- Клауза PARTITION BY (необов'язково): розділяє дані на партиції, і віконна функція застосовується до кожної партиції незалежно.
- Клауза ORDER BY (необов'язково): визначає порядок рядків у кожній партиції.
- Клауза ROWS/RANGE (необов'язково): визначає рамку вікна, тобто набір рядків відносно поточного рядка, що використовується для обчислення.
Ключові концепції та синтаксис
1. Клауза OVER()
Клауза OVER()
— це серце віконної функції. Вона визначає вікно рядків, над яким працюватиме функція. Проста клауза OVER()
без аргументів розглядатиме весь результуючий набір як вікно. Наприклад:
Приклад SQL:
SELECT
date,
sales,
AVG(sales) OVER()
FROM
sales_data;
Цей запит обчислює середні продажі за всі дати в таблиці sales_data
.
2. PARTITION BY
Клауза PARTITION BY
розділяє дані на партиції, і віконна функція застосовується окремо до кожної партиції. Це корисно, коли потрібно обчислювати метрики для різних груп у ваших даних.
Приклад SQL:
SELECT
date,
product_id,
sales,
AVG(sales) OVER (PARTITION BY product_id)
FROM
sales_data;
Цей запит обчислює середні продажі для кожного продукту окремо.
3. ORDER BY
Клауза ORDER BY
визначає порядок рядків у кожній партиції. Це важливо для обчислення наростаючих підсумків, ковзних середніх та інших метрик на основі часу.
Приклад SQL:
SELECT
date,
sales,
SUM(sales) OVER (ORDER BY date)
FROM
sales_data;
Цей запит обчислює кумулятивну суму продажів з часом.
4. ROWS/RANGE
Клаузи ROWS
та RANGE
визначають рамку вікна, тобто набір рядків відносно поточного рядка, що використовується для обчислення. Клауза ROWS
визначає рамку вікна на основі фізичного номера рядка, тоді як клауза RANGE
визначає рамку вікна на основі значень стовпця, вказаного в ORDER BY
.
Приклад з ROWS:
SELECT
date,
sales,
AVG(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
FROM
sales_data;
Цей запит обчислює ковзне середнє продажів за останні 3 дні (включаючи поточний день).
Приклад з RANGE:
SELECT
date,
sales,
AVG(sales) OVER (ORDER BY date RANGE BETWEEN INTERVAL '2' DAY PRECEDING AND CURRENT ROW)
FROM
sales_data;
Цей запит обчислює ковзне середнє продажів за останні 2 дні (включаючи поточний день). Зауважте, що RANGE
вимагає впорядкованого стовпця числового типу або типу дати/часу.
Поширені віконні функції для аналізу часових рядів
1. Ковзне/рухоме середнє
Ковзне середнє, також відоме як рухоме середнє, — це широко використовувана техніка для згладжування короткострокових коливань у даних часових рядів та виділення довгострокових тенденцій. Воно обчислюється шляхом усереднення значень у межах визначеного вікна часу.
Приклад SQL:
SELECT
date,
sales,
AVG(sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_7_days
FROM
sales_data;
Цей запит обчислює 7-денне ковзне середнє продажів.
Приклад на Python (з використанням Pandas):
import pandas as pd
# Assuming you have a Pandas DataFrame called 'sales_df' with 'date' and 'sales' columns
sales_df['moving_average_7_days'] = sales_df['sales'].rolling(window=7).mean()
Приклад глобального застосування: Міжнародний ритейлер може використовувати 30-денне ковзне середнє для згладжування щоденних коливань продажів та виявлення основних тенденцій продажів у різних регіонах.
2. Кумулятивна сума
Кумулятивна сума, також відома як наростаючий підсумок, обчислює суму значень до поточного рядка. Вона корисна для відстеження загального накопиченого значення з часом.
Приклад SQL:
SELECT
date,
sales,
SUM(sales) OVER (ORDER BY date) AS cumulative_sales
FROM
sales_data;
Цей запит обчислює кумулятивну суму продажів з часом.
Приклад на Python (з використанням Pandas):
import pandas as pd
# Assuming you have a Pandas DataFrame called 'sales_df' with 'date' and 'sales' columns
sales_df['cumulative_sales'] = sales_df['sales'].cumsum()
Приклад глобального застосування: Міжнародна e-commerce компанія може використовувати кумулятивні продажі для відстеження загального доходу, отриманого від запуску нового продукту на різних ринках.
3. Функції Lead та Lag
Функції LEAD
та LAG
дозволяють отримувати доступ до даних з наступних або попередніх рядків відповідно. Вони корисні для обчислення змін у порівнянні з попереднім періодом, виявлення тенденцій та порівняння значень у різні періоди часу.
Приклад SQL:
SELECT
date,
sales,
LAG(sales, 1, 0) OVER (ORDER BY date) AS previous_day_sales,
sales - LAG(sales, 1, 0) OVER (ORDER BY date) AS sales_difference
FROM
sales_data;
Цей запит обчислює різницю в продажах порівняно з попереднім днем. Функція LAG(sales, 1, 0)
отримує значення продажів з попереднього рядка (зміщення 1), і якщо попереднього рядка немає (наприклад, для першого рядка), вона повертає 0 (значення за замовчуванням).
Приклад на Python (з використанням Pandas):
import pandas as pd
# Assuming you have a Pandas DataFrame called 'sales_df' with 'date' and 'sales' columns
sales_df['previous_day_sales'] = sales_df['sales'].shift(1)
sales_df['sales_difference'] = sales_df['sales'] - sales_df['previous_day_sales'].fillna(0)
Приклад глобального застосування: Глобальна авіакомпанія може використовувати функції lead та lag для порівняння продажів квитків на той самий маршрут у різні тижні та виявлення потенційних коливань попиту.
4. Функції Rank та Dense Rank
Функції RANK()
та DENSE_RANK()
присвоюють ранг кожному рядку в межах партиції на основі вказаного порядку. RANK()
присвоює ранги з пропусками (наприклад, 1, 2, 2, 4), тоді як DENSE_RANK()
присвоює ранги без пропусків (наприклад, 1, 2, 2, 3).
Приклад SQL:
SELECT
date,
sales,
RANK() OVER (ORDER BY sales DESC) AS sales_rank,
DENSE_RANK() OVER (ORDER BY sales DESC) AS sales_dense_rank
FROM
sales_data;
Цей запит ранжує значення продажів у спадному порядку.
Приклад глобального застосування: Глобальний онлайн-маркетплейс може використовувати функції ранжування для визначення найпопулярніших товарів у кожній країні чи регіоні.
Просунуті методи та застосування
1. Комбінування віконних функцій
Віконні функції можна комбінувати для виконання складніших обчислень. Наприклад, ви можете обчислити ковзне середнє від кумулятивної суми.
Приклад SQL:
SELECT
date,
sales,
AVG(cumulative_sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_cumulative_sales
FROM
(
SELECT
date,
sales,
SUM(sales) OVER (ORDER BY date) AS cumulative_sales
FROM
sales_data
) AS subquery;
2. Використання віконних функцій з умовною агрегацією
Ви можете використовувати віконні функції в поєднанні з умовною агрегацією (наприклад, використовуючи оператори CASE
) для виконання обчислень на основі певних умов.
Приклад SQL:
SELECT
date,
sales,
AVG(CASE WHEN sales > 100 THEN sales ELSE NULL END) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_high_sales
FROM
sales_data;
Цей запит обчислює ковзне середнє продажів лише за ті дні, коли продажі перевищують 100.
3. Декомпозиція часових рядів
Віконні функції можна використовувати для декомпозиції часового ряду на його компоненти: тренд, сезонність та залишки. Це включає обчислення ковзних середніх для оцінки тренду, виявлення сезонних закономірностей, а потім віднімання тренду та сезонних компонентів для отримання залишків.
4. Виявлення аномалій
Віконні функції можна використовувати для виявлення аномалій у даних часових рядів шляхом обчислення ковзних середніх та стандартних відхилень. Точки даних, що виходять за межі певного діапазону (наприклад, +/- 3 стандартних відхилення від ковзного середнього), можуть бути позначені як аномалії.
Практичні приклади в різних галузях
1. Фінанси
- Аналіз цін на акції: Обчислення ковзних середніх цін на акції для виявлення тенденцій та потенційних сигналів для купівлі/продажу.
- Управління ризиками: Обчислення ковзних стандартних відхилень дохідності портфеля для оцінки волатильності та ризику.
- Виявлення шахрайства: Виявлення незвичних патернів транзакцій шляхом порівняння поточних сум транзакцій з історичними середніми значеннями.
2. Роздрібна торгівля
- Прогнозування продажів: Використання ковзних середніх та даних про кумулятивні продажі для прогнозування майбутніх тенденцій продажів.
- Управління запасами: Оптимізація рівнів запасів шляхом аналізу минулих даних про продажі та виявлення сезонних закономірностей.
- Сегментація клієнтів: Сегментація клієнтів на основі їхньої купівельної поведінки з часом.
3. Виробництво
- Прогнозне технічне обслуговування: Використання даних з датчиків обладнання для прогнозування потенційних збоїв та проактивного планування обслуговування.
- Контроль якості: Моніторинг виробничих процесів та виявлення відхилень від очікуваної продуктивності.
- Оптимізація процесів: Аналіз виробничих даних для виявлення вузьких місць та оптимізації виробничих процесів.
4. Охорона здоров'я
- Моніторинг пацієнтів: Відстеження життєво важливих показників пацієнтів з часом та виявлення аномалій, які можуть вказувати на проблеми зі здоров'ям.
- Виявлення спалахів захворювань: Відстеження поширення захворювань та виявлення потенційних спалахів.
- Розподіл ресурсів охорони здоров'я: Розподіл ресурсів на основі потреб пацієнтів та історичних патернів попиту.
Вибір правильного інструменту
Віконні функції доступні в різних інструментах обробки даних та мовах програмування, зокрема:
- SQL: Більшість сучасних систем управління реляційними базами даних (СУБД) підтримують віконні функції, включаючи PostgreSQL, MySQL (версія 8.0+), SQL Server, Oracle та Amazon Redshift.
- Python: Бібліотека Pandas надає чудову підтримку віконних функцій через методи
rolling()
таexpanding()
. - Spark: SQL та DataFrame API Apache Spark також підтримують віконні функції.
Вибір інструменту залежить від ваших конкретних потреб та технічного досвіду. SQL добре підходить для даних, що зберігаються в реляційних базах даних, тоді як Python та Spark є більш гнучкими для обробки великих наборів даних та виконання складного аналізу.
Найкращі практики
- Розумійте дані: Перед застосуванням віконних функцій ретельно вивчіть характеристики ваших даних часових рядів, включаючи їх частоту, сезонність та потенційні викиди.
- Вибирайте відповідний розмір вікна: Вибір розміру вікна залежить від конкретного аналізу, який ви виконуєте. Менший розмір вікна буде більш чутливим до короткострокових коливань, тоді як більший розмір вікна згладить дані та виділить довгострокові тенденції.
- Враховуйте крайні випадки: Будьте обізнані, як віконні функції обробляють крайні випадки, такі як відсутні дані або початок і кінець часового ряду. Використовуйте відповідні значення за замовчуванням або методи фільтрації для обробки цих випадків.
- Оптимізуйте продуктивність: Віконні функції можуть бути обчислювально затратними, особливо для великих наборів даних. Оптимізуйте свої запити та код для підвищення продуктивності, наприклад, використовуючи відповідні індекси та стратегії партиціонування.
- Документуйте свій код: Чітко документуйте свій код та запити, щоб пояснити мету та логіку віконних функцій. Це полегшить іншим розуміння та підтримку вашого коду.
Висновок
Віконні функції — це потужний інструмент для аналізу часових рядів, що дозволяє обчислювати ковзні середні, кумулятивні суми, значення lead/lag та інші метрики на основі часу. Опанувавши віконні функції, ви можете отримати цінні інсайти з ваших даних часових рядів та приймати більш обґрунтовані рішення. Незалежно від того, чи аналізуєте ви фінансові дані, дані про продажі, дані з датчиків або дані вебтрафіку, віконні функції допоможуть вам виявити закономірності, тенденції та аномалії, які було б важко виявити за допомогою традиційних методів агрегації. Розуміючи ключові концепції та синтаксис віконних функцій та дотримуючись найкращих практик, ви зможете ефективно використовувати їх для вирішення широкого кола реальних проблем у різних галузях.