a small NumPy project series where I try to truly with NumPy as an alternative of just going through random functions and documentation. I’ve all the time felt that the most effective technique to learn is by doing, so on this project, I desired to create something each practical and private.
The concept was easy: analyze my day by day habits — sleep, study hours, screen time, exercise, and mood — and see how they affect my productivity and general well-being. The info isn’t real; it’s fictional, simulated over 30 days. However the goal isn’t the accuracy of the info — it’s learning the right way to use NumPy meaningfully.
So let’s walk through the method step-by-step.
Step 1 — Loading and Understanding the Data
I began by creating a straightforward NumPy array that contained 30 rows (one for every day) and 6 columns — each column representing a special habit metric. Then I saved it as a .npy file so I could easily load it later.
# TODO: Import NumPy and cargo the .npy data file
import numpy as np
data = np.load(‘activity_data.npy’)
Once loaded, I wanted to substantiate that every little thing looked as expected. So I checked the shape (to understand how many rows and columns there have been) and the variety of dimensions (to substantiate it’s a 2D table, not a 1D list).
# TODO: Print array shape, first few rows, etc.
data.shape
data.ndim
OUTPUT: 30 rows, 6 columns, and ndim=2
I also printed out the primary few rows simply to visually confirm that every value looked wonderful — as an illustration, that sleep hours weren’t negative or that the mood values were inside an inexpensive range.
# TODO: Top 5 rows
data[:5]
Output:
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. ]])
Step 2 — Validating the Data
Before doing any evaluation, I desired to be certain that the info made sense. It’s something we frequently skip when working with fictional data, but it surely’s still good practice.
So I checked:
- No negative sleep hours
- No mood scores lower than 1 or greater than 10
For sleep, that meant choosing the sleep column (index 1 in my array) and checking if any values were below zero.
# Ensure values are reasonable (no negative sleep)
data[:, 1] < 0
Output:
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])
This implies no negatives. Then I did the identical for mood. I counted to seek out that the mood column was at index 5, and checked if any were below 1 or above 10.
# Is mood out of range?
data[:, 5] < 1
data[:, 5] > 10
We got the identical output.
Every thing looked good, so we could move on.
Step 3 — Splitting the Data into Weeks
I had 30 days of information, and I wanted to investigate it week by week. The primary instinct was to make use of NumPy’s split() function, but that failed because 30 isn’t evenly divisible by 4. So as an alternative, I used np.array_split(), which allows uneven splits.
That gave me:
- Week 1 → 8 days
- Week 2 → 8 days
- Week 3 → 7 days
- Week 4 → 7 days
# TODO: Slice data into week 1, week 2, week 3, week 4
weekly_data = np.array_split(data, 4)
weekly_data
Output:
[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. ]])]
Now the info was in 4 chunks, and I could easily analyze each individually.
Step 4 — Calculating Weekly Metrics
I desired to get a way of how each habit modified from week to week. So I focused on 4 fundamental things:
- Average sleep
- Average study hours
- Average screen time
- Average mood rating
I stored each week’s array in a separate variable, then used np.mean() to calculate the averages for every metric.
Average sleep hours
# 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])
Average study hours
# 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])
Average screen time
# 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])
Average mood rating
# TODO: Compute average mood rating
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])
Then, to make every little thing easier to read, I formatted the outcomes nicely.
# 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 rating: {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 rating: {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 rating: {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 rating: {week4_avg_mood:.2f}”)
Output:
Week 1 – Average sleep: 6.94 hrs, Study: 5.00 hrs, Screen time: 4.31 hrs, Mood rating: 6.50
Week 2 – Average sleep: 6.97 hrs, Study: 5.00 hrs, Screen time: 4.39 hrs, Mood rating: 6.62
Week 3 – Average sleep: 7.13 hrs, Study: 5.00 hrs, Screen time: 4.33 hrs, Mood rating: 6.57
Week 4 – Average sleep: 7.03 hrs, Study: 4.86 hrs, Screen time: 4.51 hrs, Mood rating: 6.57
Step 5 — Making Sense of the Results
Once I printed out the numbers, some patterns began to indicate up.
My sleep hours were pretty regular for the primary two weeks (around 6.9 hours), but in week three, they jumped to around 7.1 hours. Which means I used to be “sleeping higher” because the month went on. By week 4, it stayed roughly around 7.0 hours.
For study hours, it was the alternative. Week one and two had a median of around 5 hours per day, but by week 4, it had dropped to about 4 hours. Principally, I began off strong but slowly lost momentum — which, truthfully, sounds about right.
Then got here screen time. This one hurt a bit. In week one, it was roughly 4.3 hours per day, and it just kept creeping up every week. The classic cycle of being productive early on, then slowly drifting into more “scrolling breaks” later within the month.
Finally, there was mood. My mood rating began at around 6.5 in week one, went barely as much as 6.6 in week two, after which type of hovered there for the remainder of the period. It didn’t move dramatically, but it surely was interesting to see a small spike in week two — right before my study hours dropped and my screen time increased.
To make things interactive, I believed it’d be great to visualise using matplotlib.
Step 6 — In search of Patterns
Now that I had the numbers, I desired to know my mood went up in week two.
So I compared the weeks side by side. Week two had decent sleep, high study hours, and comparatively low screen time in comparison with the later weeks.
That may explain why my mood rating peaked there. By week three, though I slept more, my study hours had began to dip — possibly I used to be resting more but getting less done, which didn’t boost my mood as much as I expected.
That is what I liked in regards to the project: it’s not in regards to the data being real, but about how you'll be able to to explore patterns, relationships, and small insights. Even fictional data can tell a story whenever you take a look at it the correct way.
Step 7 — Wrapping Up and Next Steps
On this little project, I learned a number of key things — each about NumPy and about structuring evaluation like this.
We began with a raw array of fictional day by day habits, learned the right way to check its structure and validity, split it into meaningful chunks (weeks), after which used easy NumPy operations to investigate each segment.
It’s the type of small project that reminds you that data evaluation doesn’t all the time should be complex. Sometimes it’s nearly asking easy questions like or
If I desired to take this further (which I probably will), there are such a lot of directions to go:
- Find the best and worst days overall
- Compare weekdays vs weekends
- And even create a straightforward “wellbeing rating” based on multiple habits combined
But that’ll probably be for the subsequent a part of the series.
For now, I’m blissful that I got to use NumPy to something that feels real and relatable — not only abstract arrays and numbers, but habits and emotions. That’s the type of learning that sticks.
Thanks for reading.
For those who’re following together with the series, try recreating this on your personal fictional data. Even in case your numbers are random, the method will teach you the right way to slice, split, and analyze arrays like a professional.
