使用 NumPy 分析我的日常习惯(睡眠、屏幕时间和情绪)

2025年10月31日 由 alex 发表 2548 0

我一直在运行一个小型 NumPy 项目系列,我尝试使用 NumPy 实际构建一些东西,而不仅仅是通过随机函数和文档。我一直觉得最好的学习方式是边做边做,所以在这个项目中,我想创造一些既实用又个性化的东西。


这个想法很简单:分析我的日常习惯——睡眠、学习时间、屏幕时间、锻炼和情绪——看看它们如何影响我的工作效率和整体健康。数据不是真实的;它是虚构的,模拟了 30 多天。但目标不是数据的准确性,而是学习如何有意义地使用 NumPy。


第 1 步 — 加载和理解数据

我首先创建了一个简单的 NumPy 数组,其中包含 30 行(每天一行)和 6 列——每列代表不同的习惯指标。然后我把它保存为一个文件,以便以后可以轻松加载它。.npy


# TODO: Import NumPy and load the .npy data file
import numpy as np
data = np.load(‘activity_data.npy’)


加载后,我想确认一切看起来都符合预期。所以我检查了形状(以了解有多少行和列)和维度数(以确认它是 2D 表格,而不是 1D 列表)。


# 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 的函数,但失败了,因为 30 不能被 4 整除。所以,我使用了 ,它允许不均匀的分割。split()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 进行可视化会很棒。


Screenshot-2025-10-28-103945-1


第 6 步 — 寻找模式

现在我有了数字,我想知道为什么我的情绪在第二周上升了。


所以我并排比较了这几周。与后几周相比,第二周的睡眠不错,学习时间长,屏幕时间相对较少。


这或许可以解释为什么我的情绪分数在那里达到顶峰。到了第三周,尽管我睡得更多,但我的学习时间开始减少——也许我休息得更多,但完成的工作却更少,这并没有像我预期的那样改善我的情绪。


第 7 步 — 总结和后续步骤

在这个小项目中,我学到了一些关键的东西——既有关于 NumPy 的知识,也有关于这样的结构化分析。


我们从一系列虚构的日常习惯开始,学习如何检查其结构和有效性,将其拆分为有意义的块(周),然后使用简单的 NumPy作来分析每个片段。


这种小项目会提醒您,数据分析并不总是很复杂。有时只是问一些简单的问题,比如“我的屏幕时间如何随时间变化?

文章来源:https://towardsdatascience.com/using-numpy-to-analyze-my-daily-habits-sleep-screen-time-mood/
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消