This commit is contained in:
Dima Gerasimov 2017-07-29 17:33:14 +01:00
parent 9efae51d37
commit 7899a67d08
3 changed files with 306 additions and 0 deletions

81
Jawbone/features.csv Normal file
View file

@ -0,0 +1,81 @@
Field,Definition
DATE,Date of column data (in year/month/day format).
age,Your age on the indicated date.
avg_bg,Average passive heart rate (in beats per minute).
bmr,Basal Metabolic Rate (in calories).
body_fat,Body fat percentage.
e_caffeine,Caffeine content consumed (in milligrams).
e_calcium,Calcium content consumed (in milligrams).
e_calories,Calories consumed.
e_carbs,Carbohydrates consumed (in grams).
e_cholesterol,Cholesterol consumed (in milligrams).
e_count,Number of meals logged.
e_fat,Fat consumed (in grams).
e_fiber,Fiber consumed (in grams).
e_iron,Percentage of recommended iron consumed (based on a 2000 calorie per day diet).
e_monounsaturated_fat,Monounsaturated fat consumed (in grams).
e_num_drinks,Number of drinks logged.
e_num_foods,Number of meal items logged.
e_num_mealitems_green,Number of meal items logged with a green UP Food Score.
e_num_mealitems_red,Number of meal items logged with a red UP Food Score.
e_num_mealitems_with_score,Number of meal items logged with an UP Food Score.
e_num_mealitems_yellow,Number of meal items logged with a yellow UP Food Score.
e_num_water,Glasses of water logged.
e_polyunsaturated_fat,Polyunsaturated fat consumed (in grams).
e_potassium,Potassium consumed (in milligrams).
e_protein,Protein consumed (in grams).
e_sat_fat,Saturated fat consumed (in grams).
e_sodium,Sodium consumed (in milligrams).
e_sugar,Sugar consumed (in grams).
e_trans_fat,Trans fat consumed (in grams).
e_unsat_fat,Unsaturated fat consumed (in grams).
e_vitamin_a,Percentage of recommended Vitamin A consumed (based on a 2000 calorie per day diet).
e_vitamin_c,Percentage of recommended Vitamin C consumed (based on a 2000 calorie per day diet).
gender,Your specified gender (0=male 1=female).
goal_body_weight,Weight goal (in kilograms).
goal_body_weight_intent,Weight goal preference (0=lose 1=maintain 2=gain).
height,Your specified height (in meters).
m_active_time,Amount of total active time (in seconds).
m_calories,Total number of calories burned during active time (in seconds).
m_distance,Total distance traveled (in meters).
m_inactive_time,Total inactive time (in seconds).
m_lcat,Longest consecutive active time (in seconds).
m_lcit,Longest consecutive inactive time (in seconds).
m_steps,Total number of steps taken.
m_steps_3am,Total number of steps taken (before 3am).
m_total_calories,Total number of calories burned in the day
m_workout_count,Number of workouts logged.
m_workout_time,Length of logged workouts (in seconds).
max_bg,Highest passive heart rate (in beats per minute).
min_bg,Lowest passive heart rate (in beats per minute).
n_asleep_time,Duration of naps/secondary sleep (in seconds).
n_awake,Total time awake during naps/secondary sleep (in seconds).
n_awake_time,Total time awake after waking from naps/secondary sleep (in seconds).
n_awakenings,Number of times awoken during naps/secondary sleep.
n_bedtime,Length of time band in sleep mode during naps/secondary sleep (in seconds).
n_clinical_deep,Length of Deep sleep during naps/secondary sleep (in seconds UP3 and UP4 only).
n_count,Number of naps/secondary sleep entries logged.
n_deep,Length of Sound sleep during naps/secondary sleep (in seconds).
n_duration,Duration of naps/secondary sleep (in seconds).
n_light,Length of Light sleep during naps/secondary sleep (in seconds).
n_quality,Not applicable.
n_rem,Length of REM sleep during naps/secondary sleep (in seconds).
n_to_bed_phr,Average passive heart rate 1 hour before naps/secondary sleep (in beats per minute).
num_readings,Number of background heart rate readings.
o_count,Number of moods logged.
o_mood,Average score for moods logged (10 = lowest 80 = highest).
rhr,Resting heart rate (in beats per minute).
s_asleep_time,Duration of primary sleep (in seconds).
s_awake,Total time awake during primary sleep (in seconds).
s_awake_time,Total time awake after waking from primary sleep (in seconds).
s_awakenings,Number of times awoken during primary sleep.
s_bedtime,Length of time band was in primary sleep mode (in seconds).
s_clinical_deep,Length of primary Deep sleep (in seconds UP3 and UP4 only).
s_count,Number of primary sleep entries logged.
s_deep,Length of primary Sound sleep (in seconds).
s_duration,Duration of primary sleep (in seconds).
s_light,Length of primary Light sleep (in seconds).
s_quality,Not applicable.
s_rem,Length of primary REM sleep (in seconds).
s_to_bed_phr,Average passive heart rate 1 hour before primary sleep (in beats per minute).
weight,Weight (in kilograms).
1 Field Definition
2 DATE Date of column data (in year/month/day format).
3 age Your age on the indicated date.
4 avg_bg Average passive heart rate (in beats per minute).
5 bmr Basal Metabolic Rate (in calories).
6 body_fat Body fat percentage.
7 e_caffeine Caffeine content consumed (in milligrams).
8 e_calcium Calcium content consumed (in milligrams).
9 e_calories Calories consumed.
10 e_carbs Carbohydrates consumed (in grams).
11 e_cholesterol Cholesterol consumed (in milligrams).
12 e_count Number of meals logged.
13 e_fat Fat consumed (in grams).
14 e_fiber Fiber consumed (in grams).
15 e_iron Percentage of recommended iron consumed (based on a 2000 calorie per day diet).
16 e_monounsaturated_fat Monounsaturated fat consumed (in grams).
17 e_num_drinks Number of drinks logged.
18 e_num_foods Number of meal items logged.
19 e_num_mealitems_green Number of meal items logged with a green UP Food Score.
20 e_num_mealitems_red Number of meal items logged with a red UP Food Score.
21 e_num_mealitems_with_score Number of meal items logged with an UP Food Score.
22 e_num_mealitems_yellow Number of meal items logged with a yellow UP Food Score.
23 e_num_water Glasses of water logged.
24 e_polyunsaturated_fat Polyunsaturated fat consumed (in grams).
25 e_potassium Potassium consumed (in milligrams).
26 e_protein Protein consumed (in grams).
27 e_sat_fat Saturated fat consumed (in grams).
28 e_sodium Sodium consumed (in milligrams).
29 e_sugar Sugar consumed (in grams).
30 e_trans_fat Trans fat consumed (in grams).
31 e_unsat_fat Unsaturated fat consumed (in grams).
32 e_vitamin_a Percentage of recommended Vitamin A consumed (based on a 2000 calorie per day diet).
33 e_vitamin_c Percentage of recommended Vitamin C consumed (based on a 2000 calorie per day diet).
34 gender Your specified gender (0=male 1=female).
35 goal_body_weight Weight goal (in kilograms).
36 goal_body_weight_intent Weight goal preference (0=lose 1=maintain 2=gain).
37 height Your specified height (in meters).
38 m_active_time Amount of total active time (in seconds).
39 m_calories Total number of calories burned during active time (in seconds).
40 m_distance Total distance traveled (in meters).
41 m_inactive_time Total inactive time (in seconds).
42 m_lcat Longest consecutive active time (in seconds).
43 m_lcit Longest consecutive inactive time (in seconds).
44 m_steps Total number of steps taken.
45 m_steps_3am Total number of steps taken (before 3am).
46 m_total_calories Total number of calories burned in the day
47 m_workout_count Number of workouts logged.
48 m_workout_time Length of logged workouts (in seconds).
49 max_bg Highest passive heart rate (in beats per minute).
50 min_bg Lowest passive heart rate (in beats per minute).
51 n_asleep_time Duration of naps/secondary sleep (in seconds).
52 n_awake Total time awake during naps/secondary sleep (in seconds).
53 n_awake_time Total time awake after waking from naps/secondary sleep (in seconds).
54 n_awakenings Number of times awoken during naps/secondary sleep.
55 n_bedtime Length of time band in sleep mode during naps/secondary sleep (in seconds).
56 n_clinical_deep Length of Deep sleep during naps/secondary sleep (in seconds UP3 and UP4 only).
57 n_count Number of naps/secondary sleep entries logged.
58 n_deep Length of Sound sleep during naps/secondary sleep (in seconds).
59 n_duration Duration of naps/secondary sleep (in seconds).
60 n_light Length of Light sleep during naps/secondary sleep (in seconds).
61 n_quality Not applicable.
62 n_rem Length of REM sleep during naps/secondary sleep (in seconds).
63 n_to_bed_phr Average passive heart rate 1 hour before naps/secondary sleep (in beats per minute).
64 num_readings Number of background heart rate readings.
65 o_count Number of moods logged.
66 o_mood Average score for moods logged (10 = lowest 80 = highest).
67 rhr Resting heart rate (in beats per minute).
68 s_asleep_time Duration of primary sleep (in seconds).
69 s_awake Total time awake during primary sleep (in seconds).
70 s_awake_time Total time awake after waking from primary sleep (in seconds).
71 s_awakenings Number of times awoken during primary sleep.
72 s_bedtime Length of time band was in primary sleep mode (in seconds).
73 s_clinical_deep Length of primary Deep sleep (in seconds UP3 and UP4 only).
74 s_count Number of primary sleep entries logged.
75 s_deep Length of primary Sound sleep (in seconds).
76 s_duration Duration of primary sleep (in seconds).
77 s_light Length of primary Light sleep (in seconds).
78 s_quality Not applicable.
79 s_rem Length of primary REM sleep (in seconds).
80 s_to_bed_phr Average passive heart rate 1 hour before primary sleep (in beats per minute).
81 weight Weight (in kilograms).

6
TODO.org Normal file
View file

@ -0,0 +1,6 @@
https://github.com/crowoy/Health-Analysis
https://github.com/joytafty-work/SleepModel
https://github.com/carleshf/jawboneup2tex
https://github.com/search?l=Jupyter+Notebook&q=s_awakenings&type=Code&utf8=%E2%9C%93
https://github.com/oshev/colifer/blob/592cc6b4d1ac9005c52fccdfb4e207513812baaa/colifer.py
https://github.com/oshev/colifer/blob/592cc6b4d1ac9005c52fccdfb4e207513812baaa/reportextenders/jawbone/jawbone_sleep.py

219
main.py Executable file
View file

@ -0,0 +1,219 @@
#!/usr/bin/env python3.6
# TODO
from csv import DictReader
from itertools import islice
from typing import Dict
# sleep = []
# with open('2017.csv', 'r') as fo:
# reader = DictReader(fo)
# for line in islice(reader, 0, 10):
# sleep
# print(line)
import numpy as np
import matplotlib.pyplot as plt
from numpy import genfromtxt
import matplotlib.pylab as pylab
pylab.rcParams['figure.figsize'] = (32.0, 24.0)
pylab.rcParams['font.size'] = 10
dimensions = 3 # Number of dimensions to reduce to
jawboneDataFile = "/L/Dropbox/backups/jawbone/2017.csv" # Data File Path
jawboneDataFeatures = "Jawbone/features.csv" # Data File Path
featureDesc: Dict[str, str] = {}
for x in genfromtxt(jawboneDataFeatures, dtype='unicode', delimiter=','):
featureDesc[x[0]] = x[1]
def filterData_Jawbone (data):
#Removes null data (and corresponding features)
data = data[0:,:]
# for i in range(16):
# data = np.delete(data, 0, 1)
# print(data)
h, w = data.shape
data = np.where((data == ''), 0, data)
allZero = [np.all(np.delete([0 if col[i] == '' else col[i] for col in data], [0]).astype(float)
== 0) for i in range(w)]
allSame = [np.all(np.delete([0 if col[i] == '' else col[i] for col in data], [0]).astype(float)
== np.delete([0 if col[i] == '' else col[i] for col in data], [0]).astype(float)[0]) for i in range(w)]
empty = np.logical_or(allZero, allSame)
n = [i for i in range(np.array(empty).size) if empty[i] == True]
return np.delete(data, n, axis=1)
dataAll = filterData_Jawbone(genfromtxt(jawboneDataFile, dtype='unicode', delimiter=','))
features = dataAll[0]
features = [
's_light', # 'light sleep' from app
's_awake', # 'woke up' from app (how many times you were awake)
's_deep' # 'sound sleep' from app
]
# TODO filter more carefully...
def getIndex (data, features):
index = []
for f in features:
index.append(np.where((data[0] == f) == True)[0][0])
return index
def getFeatures (data, features):
h, w = data.shape
index = getIndex(data, features)
extracted = np.zeros(h-1)
for i in index:
temp = np.delete([0 if col[i] == '' else col[i] for col in data], [0]).astype(float)
temp /= np.amax(temp)
extracted = np.vstack((extracted, temp))
extracted = np.delete(extracted, 0, 0)
return extracted
# print(dataAll)
data = getFeatures(dataAll, features)
def remNull(x, y):
nx = np.where(x == 0)
ny = np.where(y == 0)
nulli = np.concatenate((nx[0], ny[0]))
x = np.delete(x, nulli, 0)
y = np.delete(y, nulli, 0)
return x, y
def calculateVar(x, y) -> float:
x, y = remNull(x,y)
if len(x) == 0:
# TODO needs date?
print("Warning")
return 0.0 # TODO ???
meanX = np.mean(x)
meanY = np.mean(y)
n = float(x.shape[0])
print(n)
return ((1/n)*(np.sum((x-meanX)*(y-meanY))))
# return ((1/(n + 1))*(np.sum((x-meanX)*(y-meanY)))) # TODO fixme..
def calculateCov(data):
h, w = data.shape
cov = np.zeros([h, h])
for i in range(h):
for j in range(h):
cov[i][j] = calculateVar(data[i], data[j])
return cov
# In[119]:
# a = np.array([[1, 2, 3], [1, 2, 3]])
# print(a)
# print(calculateCov(a))
# print(np.cov(a))
# print("VAR")
# print(np.var(a[0]))
# print("DATA")
# print(data)
# print("NPCOV")
# print(np.cov(data))
# cov = calculateCov (data)
# print("COV")
# print(cov)
cov = np.cov(data) # TODO ???
# In[120]:
def plotFeatures (title, label1, label2, feature1, feature2):
plt.scatter(feature1, feature2)
plt.title(title)
plt.xlabel(label1)
plt.ylabel(label2)
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.show()
def plotMatrix(data):
r, c = data.shape
c=2
fig = plt.figure()
plotID = 1
for i in range(c):
for j in range(c):
f1 = getFeature(data, data[0][i])
f2 = getFeature(data, data[0][j])
ax = fig.add_subplot( c, c, plotID )
ax.scatter(f1, f2)
ax.set_title(data[0][i] + ' vs ' + data[0][j])
ax.axis('off')
plotID += 1
plt.show()
def plotMatrix1(features, data):
for f in features:
print(f"{f}: {featureDesc[f]}")
r, c = data.shape
fig = plt.figure()
plotID = 1
for i in range(r):
for j in range(r):
ax = fig.add_subplot( r, r, plotID )
x,y = remNull(data[i], data[j])
ax.scatter(x, y, s=2)
ax.set_title(features[i] + ' vs ' + features[j], fontsize=15)
ax.tick_params(axis='x', which='major', labelsize=8)
ax.tick_params(axis='y', which='major', labelsize=8)
# ax.set_xlim(0,1)
# ax.set_ylim(0,1)
plotID += 1
plt.show()
# In[121]:
# plotMatrix1(features, data)
# In[ ]:
def rankF(features, cov):
n = len(features)
eigenV = np.linalg.eig(cov)
eigVal = np.matrix(eigenV[0])
eigVec = np.matrix(eigenV[1])
order = (n-1) - np.argsort(eigVal)
rankFeatures = np.empty(n, dtype='<U30') # TODO
# print(rankFeatures.shape)
for i in range(n):
rankFeatures[i] = features[(np.where(order == i)[1][0])]
return rankFeatures, eigVal, eigVec
# print(features)
# rankFeatures, eigVal, eigVec = rankF(features, cov)
rankFeatures = features
# print(rankFeatures)
# print(len(rankFeatures))
r1, r2 = 0, dimensions
selectedFeatures = features
# selectedFeatures = np.take(rankFeatures, np.arange(r1, r2))
selectedData = getFeatures(dataAll, selectedFeatures)
# plotFeatures('111', 'f1', 'f2', selectedData[0], selectedData[1])
plotMatrix1(rankFeatures, selectedData)