import numpy as np
# Одновимірний масив (вектор)
arr = np.array([10, 20, 30])
# Двовимірний масив (матриця: рядки та стовпці)
matrix = np.array([[1, 2, 3], [4, 5, 6]])Practice Session 16
🔢 Базова робота з NumPy
NumPy, або Numerical Python, є фундаментальною бібліотекою для наукових обчислень у Python. Вона забезпечує потужні інструменти для роботи з багатовимірними масивами та матрицями, а також містить велику кількість функцій для виконання різноманітних операцій над цими структурами даних. Сьогодні ми розглянемо основи роботи з NumPy та застосуємо її можливості для аналізу даних.
Для успішного виконання цієї практичної, вам знадобиться зробити Fork репозиторію, а потім клонувати його на свій пристрій. Для того, аби здати практичну, вам потрібно буде надіслати pull request
📌 План заняття:
- Базовий NumPy та векторні операції
- Numpy як інструмент для роботи з даними
- 📊 Суперкомбо: Numpy + Pandas
📝 Cheat Sheet:
NumPy — це бібліотека для швидких математичних обчислень та роботи з масивами/матрицями. Вона дозволяє робити операції з великими обсягами даних без використання повільних циклів for.
🧮 Базова робота
1. Імпорт та створення масивів
2. Векторна математика Усі базові математичні операції (+, -, *, /) застосовуються одразу до всього масиву або між двома масивами однакового розміру:
prices = np.array([100, 200, 300])
# Додасть 20% податку до КОЖНОГО елемента
prices_with_tax = prices * 1.2
income = np.array([1000, 1500])
expenses = np.array([800, 900])
# Поелементне віднімання
profit = income - expenses 3. Базова статистика та агрегація
arr.sum() # або np.sum(arr) - Сума всіх елементів
arr.mean() # або np.mean(arr) - Середнє арифметичне
arr.max() # або np.max(arr) - Максимальне значення
arr.min() # або np.min(arr) - Мінімальне значення
arr.size # Кількість елементів (не функція, тому без дужок!)🧭 Просунуті фічі
4. Робота з осями (Axis) у матрицях Якщо застосувати агрегацію до матриці без axis, вона порахує значення по всіх елементах. axis дозволяє задати напрямок:
# axis=0 — дія виконується ПО ВЕРТИКАЛІ (рахує для кожного стовпця)
np.max(matrix, axis=0)
# axis=1 — дія виконується ПО ГОРИЗОНТАЛІ (рахує для кожного рядка)
np.mean(matrix, axis=1)5. Фільтрація масивів (Булеві маски) Дозволяє відібрати дані, які відповідають певній умові.
scores = np.array([45, 80, 95, 30, 60])
# 1. Створюємо маску (отримаємо масив з True/False)
mask = scores >= 60
# 2. Відфільтровуємо масив (залишаться тільки ті, де True)
passed_scores = scores[mask] # Результат: [80, 95, 60]
# Складна маска: & (ТА), | (АБО). Обов'язково брати умови в дужки!
complex_mask = (scores >= 60) & (scores < 90)6. Корисні функції
# np.where(умова, значення_якщо_True, значення_якщо_False)
# Дозволяє швидко замінити або класифікувати дані
statuses = np.where(scores >= 60, "Здав", "Не здав")
# np.maximum(масив, ліміт)
# Замінить усі числа в масиві, які МЕНШІ за ліміт, на цей ліміт.
# (Наприклад, щоб уникнути від'ємних значень)
np.maximum(arr, 0)Базовий NumPy та векторні операції
👨💻 Live coding 1: Стримінг відео
Контекст: Ми розробляємо платформу для стримінгу відео. Нам потрібно розробити інструменти, який буде ефективно розраховувати кількість взаємодій для кожного відео та рівень залученості користувачів. З даних маємо три масиви: кількість переглядів, кількість лайків та кількість коментарів для кожного відео.
Вхідні дані:
views = np.array([15000, 32000, 8500, 45000])likes = np.array([1200, 3000, 800, 4100])comments = np.array([150, 400, 50, 600])
Очікуваний результат: engagement_rate, який розраховується за формулою:
\(\frac{\text{Interactions}}{\text{Views}} \times 100\)
🛠 Guided Practice:
Контекст: Перед вами постала задача автоматизувати розрахунок оплати стрімерів на тій самі платформі. Наша стримінгова платформа платить авторам певну суму за кожні 1000 переглядів - revenue per mille (RPM). Окрім цього, ви маєте врахувати витрати на продакшн для кожного відео. Ваше завдання - розрахувати чистий прибуток для кожного відео та визначити найприбутковіше відео.
Вхідні дані:
views = np.array([15000, 32000, 8500, 45000])rpm = np.array([1.5, 2.0, 0.8, 2.5])production_cost = np.array([10, 30, 5, 50])
Маисви rpm та production_cost містять дані в доларах. Чистий прибуток для кожного відео можна розрахувати за формулою:
\(( \frac{\text{Views}}{1000} \times \text{RPM}) - \text{Production Cost}\)
Очікуваний результат: Масив чистого прибутку в доларах та індекс найприбутковішого відео.
Numpy як інструмент для роботи з даними
👨💻 Live Coding 2: Навантаження на сервери
Контекст: Ми продовжуємо розробляти нашу платформу і цього разу перед нами було поставлено задачу проаналізувати не зовнішні дані про користувачів, а внутрішні дані про сервери платформи. Нам надали двовимірну матрицю, де кожен рядок — це окремий сервер, а стовпці — пікове навантаження на процесор (у відсотках) за 5 робочих днів.
Нам потрібно: 1. Знайти середнє навантаження для кожного сервера. 2. Визначити абсолютний максимум навантаження серед усіх серверів за весь тиждень. 3. Знайти всі випадки, коли навантаження перевищувало 90%. 4. Порахувати кількість таких критичних інцидентів.
Вхідні дані: cpu_load = np.array([[45, 50, 55, 40, 48], [88, 92, 95, 89, 94], [20, 25, 22, 18, 30]])
Очікуваний результат: Знайдено та виведено середнє навантаження для кожного сервера, абсолютний максимум навантаження, всі випадки перевищення 90% та кількість таких випадків.
🛠 Guided Practice:
Контекст: Після аналізу навантаження на сервери, ви отримали дані про час відгуку (response time) для кожного сервера за той самий тиждень. Вам потрібно проаналізувати ці дані та визначити:
- Мінімальний час затримки до кожного серверу, щоб визначити їхню найкращу пропускну здатність.
- Загальну середню затримку усієї мережі (там, де вона перевищує 200 мс)
- Відфільтрувати всі випадки, коли час відгуку перевищував 200 мс, та порахувати їх кількість.
- Порахуйте, який відсоток від усіх замірів складають ці затримки за формулою:
\(\frac{\text{Problematic Requests}}{Total} \times \text{100}\)
Вхідні дані:
pings = np.array([[45, 50, 55, 40, 48],
[120, 115, 210, 130, 180],
[300, 250, 310, 280, 290],
[15, 20, 18, 22, 25]])Очікуваний результат: Знайдено відповідні показники
📊 Суперкомбо: Numpy + Pandas
Як ми вже побачили, NumPy є потужним інструментом для роботи з числовими даними та матрицями, проте одна з його численних переваг - сумісність з іншими бібліотеками, зокрема з Pandas. Це довзоляє проводити ефективний аналіз даних, використовуючи можливості обох бібліотек.
👨💻 Live Coding 3: Ментальне здоров’я світу
Контекст: Ми працюємо з датасетом Global Mental Health Crisis Index 2026, який містить дані про індекс психічного здоров’я для різних країн світу. Перед нами постало завдання оцінити рівень ментального здоров’я середі різних країн, а саме:
Знайти країни, де відсоток
treatment_gap_pctперевищує 50% (це означає, що більше половини людей, які потребують допомоги, не отримують її).Створити новий стовпець
unmet_need, який буде містити текстову позначку “High” для країн зtreatment_gap_pct> 50% та “Low” для інших.Створити новий стовпець
total_burden, який буде містити сумуdepression_pctтаanxiety_pctдля кожної країни, щоб оцінити загальний тягар психічних розладів.
Вхідні дані: Файл Global_Mental_Health_Crisis_Index_2026.csv
Очікуваний результат: Відредагований dataframe, який міститиме нові заповнені стовпчики
🛠 Guided Practice:
Контекст: Ви також зрозуміли, що на рівень ментального здоров’я може впливати час, проведений у соцмережах. Для того щоб перевірити це припущення вам потрібно знайти середній показник social_media_hours_daily по всьому світу, а потім розділити країни на дві групи: ті, де люди проводять у соцмережах більше часу,ніж середнє значення, та ті, де менше.
Вхідні дані: Файл Global_Mental_Health_Crisis_Index_2026.csv
Очікуваний результат: Знайдене середнє значення social_media_hours_daily та створена нова колонка.
Підказка
Скористайтеся методом np.mean() для того, щоб знайти середнє, та методом np.where() для створення нової колонки.