Невелика серія проектів NumPy, де я справді намагаюся зробити деякі З NumPy замість того, щоб просто переглядати випадкові функції та документацію. Я завжди вважав, що найкращий спосіб навчитися – це щось робити, тому в цьому проекті я хотів створити щось практичне та особисте.
Ідея була простою: проаналізуйте мої щоденні звички – сон, години навчання, час перед екраном, фізичні вправи та настрій – і подивіться, як вони впливають на мою продуктивність і загальне самопочуття. Дані не є справжніми; Це гіпотетично, змодельовано протягом 30 днів. Але метою є не точність даних, а навчитися осмислено використовувати NumPy.
Отже, давайте крок за кроком розглянемо цей процес.
Крок 1 – Завантаження та розуміння даних
Я почав зі створення простого масиву NumPy, який мав 30 рядків (по одному на кожен день) і шість стовпців – кожен стовпець представляв окрему метрику звички. Тоді я зберіг його як a .npy файл, щоб я міг легко завантажити його пізніше.
# TODO: Import NumPy and load the .npy data file
import numpy as np
data = np.load(‘activity_data.npy’)
Після завантаження я хотів підтвердити, що все виглядає так, як очікувалося. тому я перевірив розмір (щоб дізнатися, скільки було рядків і стовпців) і кількість розмірів (Щоб підтвердити, що це двовимірна таблиця, а не одновимірний список).
# TODO: Print array shape, first few rows, etc.
data.shape
data.ndim
Вихід: 30 рядків, 6 стовпців і ndim=2
Я також надрукував кілька перших рядків, щоб візуально підтвердити, що кожне значення виглядає добре – наприклад, години сну не були від’ємними або значення настрою були в розумних межах.
# TODO: Top 5 rows
data[:5]
Вихід:
array([[ 1. , 6.5, 5. , 4.2, 20. , 6. ],
[ 2. , 7.2, 6. , 3.1, 35. , 7. ],
[ 3. , 5.8, 4. , 5.5, 0. , 5. ],
[ 4. , 8. , 7. , 2.5, 30. , 8. ],
[ 5. , 6. , 5. , 4.8, 10. , 6. ]])
Крок 2 – Перевірка даних
Перш ніж робити будь-який аналіз, я хотів переконатися, що дані мають сенс. Ми часто пропускаємо це під час роботи з гіпотетичними даними, але це все одно хороша практика.
Тому я перевірив:
- немає негативного часу сну
- Жодна оцінка настрою не менше 1 або більше 10.
Для сну це означає вибір стовпця сну (індекс 1 у моєму масиві) і перевірку, чи значення є нижчими за нуль.
# Make sure values are reasonable (no negative sleep)
data[:, 1] < 0
Вихід:
array([False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False])
Це не означає ніякого негативу. Потім я зробив те саме для настрою. Я порахував і виявив, що індекс стовпця настрою був 5, і перевірив, чи є він нижче 1 або вище 10.
# Is mood out of range?
data[:, 5] < 1
data[:, 5] > 10
Ми отримали той самий результат.
Все виглядало добре, тому ми могли продовжити.
Крок 3 – Розбиття даних на тижні
У мене були дані за 30 днів, і я хотів аналізувати їх тиждень за тижнем. Першою тенденцією було використання NumPy split() але це не вдалось, оскільки 30 не ділиться на 4. Тож замість цього я використав np.array_split()Що допускає нерівний поділ.
Це дало мені:
- 1 тиждень → 8 днів
- 2 тиждень → 8 днів
- тиждень 3 → 7 днів
- 4 тиждень → 7 днів
# TODO: Slice data into week 1, week 2, week 3, week 4
weekly_data = np.array_split(data, 4)
weekly_data
Вихід:
[array([[ 1. , 6.5, 5. , 4.2, 20. , 6. ],
[ 2. , 7.2, 6. , 3.1, 35. , 7. ],
[ 3. , 5.8, 4. , 5.5, 0. , 5. ],
[ 4. , 8. , 7. , 2.5, 30. , 8. ],
[ 5. , 6. , 5. , 4.8, 10. , 6. ],
[ 6. , 7.5, 6. , 3.3, 25. , 7. ],
[ 7. , 8.2, 3. , 6.1, 40. , 7. ],
[ 8. , 6.3, 4. , 5. , 15. , 6. ]]),
array([[ 9. , 7. , 6. , 3.2, 30. , 7. ],
[10. , 5.5, 3. , 6.8, 0. , 5. ],
[11. , 7.8, 7. , 2.9, 25. , 8. ],
[12. , 6.1, 5. , 4.5, 15. , 6. ],
[13. , 7.4, 6. , 3.7, 30. , 7. ],
[14. , 8.1, 2. , 6.5, 50. , 7. ],
[15. , 6.6, 5. , 4.1, 20. , 6. ],
[16. , 7.3, 6. , 3.4, 35. , 7. ]]),
array([[17. , 5.9, 4. , 5.6, 5. , 5. ],
[18. , 8.3, 7. , 2.6, 30. , 8. ],
[19. , 6.2, 5. , 4.3, 10. , 6. ],
[20. , 7.6, 6. , 3.1, 25. , 7. ],
[21. , 8.4, 3. , 6.3, 40. , 7. ],
[22. , 6.4, 4. , 5.1, 15. , 6. ],
[23. , 7.1, 6. , 3.3, 30. , 7. ]]),
array([[24. , 5.7, 3. , 6.7, 0. , 5. ],
[25. , 7.9, 7. , 2.8, 25. , 8. ],
[26. , 6.2, 5. , 4.4, 15. , 6. ],
[27. , 7.5, 6. , 3.5, 30. , 7. ],
[28. , 8. , 2. , 6.4, 50. , 7. ],
[29. , 6.5, 5. , 4.2, 20. , 6. ],
[30. , 7.4, 6. , 3.6, 35. , 7. ]])]
Тепер дані складалися з чотирьох частин, і я міг легко аналізувати кожну окремо.
Крок 4 – Розрахунок тижневих показників
Я хотів знати, як змінювалася кожна звичка з тижня в тиждень. Тому я зосередився на чотирьох основних речах:
- середній сон
- середні навчальні години
- середній час використання екрана
- середній бал настрою
Я зберігав таблиці кожного тижня в окремій змінній, а потім використовував np.mean() Щоб обчислити середнє значення кожного показника.
середні години сну
# store into variables
week_1 = weekly_data[0]
week_2 = weekly_data[1]
week_3 = weekly_data[2]
week_4 = weekly_data[3]
# TODO: Compute average sleep
week1_avg_sleep = np.mean(week_1[:, 1])
week2_avg_sleep = np.mean(week_2[:, 1])
week3_avg_sleep = np.mean(week_3[:, 1])
week4_avg_sleep = np.mean(week_4[:, 1])
середні навчальні години
# TODO: Compute average study hours
week1_avg_study = np.mean(week_1[:, 2])
week2_avg_study = np.mean(week_2[:, 2])
week3_avg_study = np.mean(week_3[:, 2])
week4_avg_study = np.mean(week_4[:, 2])
середній час використання екрана
# TODO: Compute average screen time
week1_avg_screen = np.mean(week_1[:, 3])
week2_avg_screen = np.mean(week_2[:, 3])
week3_avg_screen = np.mean(week_3[:, 3])
week4_avg_screen = np.mean(week_4[:, 3])
середній бал настрою
# TODO: Compute average mood score
week1_avg_mood = np.mean(week_1[:, 5])
week2_avg_mood = np.mean(week_2[:, 5])
week3_avg_mood = np.mean(week_3[:, 5])
week4_avg_mood = np.mean(week_4[:, 5])
Потім, щоб усе було легше читати, я гарно відформатував результати.
# TODO: Display weekly results clearly
print(f”Week 1 — Average sleep: {week1_avg_sleep:.2f} hrs, Study: {week1_avg_study:.2f} hrs, “
f”Screen time: {week1_avg_screen:.2f} hrs, Mood score: {week1_avg_mood:.2f}”)
print(f”Week 2 — Average sleep: {week2_avg_sleep:.2f} hrs, Study: {week2_avg_study:.2f} hrs, “
f”Screen time: {week2_avg_screen:.2f} hrs, Mood score: {week2_avg_mood:.2f}”)
print(f”Week 3 — Average sleep: {week3_avg_sleep:.2f} hrs, Study: {week3_avg_study:.2f} hrs, “
f”Screen time: {week3_avg_screen:.2f} hrs, Mood score: {week3_avg_mood:.2f}”)
print(f”Week 4 — Average sleep: {week4_avg_sleep:.2f} hrs, Study: {week4_avg_study:.2f} hrs, “
f”Screen time: {week4_avg_screen:.2f} hrs, Mood score: {week4_avg_mood:.2f}”)
Вихід:
Week 1 – Average sleep: 6.94 hrs, Study: 5.00 hrs, Screen time: 4.31 hrs, Mood score: 6.50
Week 2 – Average sleep: 6.97 hrs, Study: 5.00 hrs, Screen time: 4.39 hrs, Mood score: 6.62
Week 3 – Average sleep: 7.13 hrs, Study: 5.00 hrs, Screen time: 4.33 hrs, Mood score: 6.57
Week 4 – Average sleep: 7.03 hrs, Study: 4.86 hrs, Screen time: 4.51 hrs, Mood score: 6.57
Крок 5 – Розуміння результатів
Коли я роздрукував цифри, почали з’являтися деякі шаблони.
мій годин сну були досить стабільними протягом перших двох тижнів (приблизно 6,9 години), але на третьому тижні вони досягли піку приблизно в 7,1 години. Це означає, що я «краще спав» протягом місяця. До четвертого тижня він залишався на рівні близько 7,0 годин.
для навчальні годиниБуло навпаки. Перший і другий тижні становили в середньому близько 5 годин на день, але до четвертого тижня це впало приблизно до 4 годин. По суті, я почав сильно, але повільно втратив імпульс – що, чесно кажучи, здається правильним.
потім прийшов екранний часЦе викликало певний біль. У перший тиждень це було приблизно 4,3 години на день, і з кожним тижнем воно продовжувало збільшуватися. Класичний цикл продуктивності на початку, а потім поступово змінюється на більш «прокручувану перерву» наприкінці місяця.
Зрештою, було настрійОцінка мого настрою спочатку становила приблизно 6,5 на першому тижні, трохи підвищилася до 6,6 на другому тижні, а потім залишалася на цьому рівні до кінця періоду. Це не змінилося кардинально, але було цікаво спостерігати за невеликим збільшенням на другому тижні – безпосередньо перед тим, як мої навчальні години зменшилися, а мій час перед екраном збільшився.
Щоб зробити речі інтерактивними, я подумав, що було б чудово візуалізувати за допомогою matplotlib.

Крок 6 – Пошук шаблону
Тепер, коли я отримав цифри, я хотів знати чому Мій настрій покращився на другому тижні.
Тому я порівняв тижні пліч-о-пліч. Другий тиждень мав кращий сон, більше годин навчання та відносно менше часу перед екраном порівняно з наступними тижнями.
Це може пояснити, чому мій бал настрою там досяг піку. На третій тиждень, хоча я спав більше, мої навчальні години почали скорочуватися — можливо, я більше відпочивав, але менше працював, що не покращило мій настрій так сильно, як я сподівався.
Ось що мені подобається в проекті: справа не в тому, які дані, а в тому, як це зробити використовувати numpy Для виявлення закономірностей, взаємозв’язків і дрібних уявлень. Навіть гіпотетичні дані можуть розповісти історію, якщо поглянути на них правильно.
Крок 7 – Завершення та наступні кроки
У цьому невеликому проекті я дізнався деякі ключові речі – про NumPy і про структурний аналіз як такий.
Ми почали з необробленої серії гіпотетичних щоденних звичок, навчилися досліджувати її структуру та валідність, розділили її на значущі сегменти (тижні), а потім використали прості операції NumPy для аналізу кожного сегмента.
Це такий маленький проект, який нагадує вам, що аналіз даних не завжди має бути складним. Іноді мова йде лише про прості запитання «Як мій час роботи з екраном змінюється з часом?» Або «Коли я почуваюся найкраще?»
Якби я хотів піти далі (а я б, ймовірно, зробив), є багато напрямків:
- пошук найкращі та найгірші дні в цілому
- порівняти будній день проти вихідних
- Або навіть створити просту «оцінку здоров’я» на основі кількох комбінованих звичок
Але це, ймовірно, буде для наступної частини серії.
Наразі я радий, що отримав можливість застосувати NumPy до чогось, що здається реальним і пов’язаним — не лише до абстрактних масивів і чисел, а й до звичок та емоцій. Це той тип навчання, який прилипає.
Дякую, що прочитали.
Якщо ви стежите за серією, спробуйте відтворити її на своїх уявних даних. Навіть якщо ваші числа випадкові, цей процес навчить вас нарізати, розділяти й аналізувати масиви як професіонал.