fitbit_ActivitiesAnalysis.ipynb
Activities analysis based on Fitbit data
import pandas as pd
import json
import numpy as np
import matplotlib.pyplot as plt
import seaborn
import urllib
import requests
import os
import tempfile
from datetime import datetime
import seaborn as sns
user_details = api.exchange_oauth2_member(os.environ.get('OH_ACCESS_TOKEN'))
for i in user_details['data']:
if i['basename'] == 'fitbit-data.json' and i['source'] == 'direct-sharing-102':
fitbit = requests.get(i['download_url']).json()
'''
data = requests.get('https://www.openhumans.org/api/public/project/102/datafiles/').json()
for i in data['results']:
if i['id'] == 9135000:
fitbit = requests.get(i['download_url']).json()
'''
DateTime = []
year = '2018'
def GetData(obj,year,key):
name = key.split('-')[-1]
name = []
for day in fitbit[obj][year][key]:
name.append(day['value'])
return name
for day in fitbit['minutes-to-sleep'][year]['sleep-minutesToFallAsleep']:
DateTime.append(datetime.strptime(day['dateTime'],'%Y-%m-%d'))
DateTime = pd.DataFrame(DateTime)
activitiesData = pd.DataFrame(
data = {
'minutesLightlyActive': GetData('tracker-minutes-lightly-active',year,'activities-tracker-minutesLightlyActive'),
'minutesSedentary': GetData('tracker-minutes-sedentary',year,'activities-tracker-minutesSedentary'),
'steps': GetData('tracker-steps',year,'activities-tracker-steps'),
'calories': GetData('tracker-calories',year,'activities-tracker-calories'),
'weight': GetData('weight',year,'body-weight'),
'elevation': GetData('tracker-elevation',year,'activities-tracker-elevation') ,
'distance': GetData('tracker-distance',year,'activities-tracker-distance'),
'minutesFairlyActive': GetData('tracker-minutes-fairly-active',year,'activities-tracker-minutesFairlyActive') ,
'minutesVeryActive': GetData('tracker-minutes-very-active',year,'activities-tracker-minutesVeryActive') ,
'floors': GetData('tracker-floors',year,'activities-tracker-floors')
}
)
activitiesData = pd.concat([DateTime, activitiesData], axis=1)
activitiesData.rename(columns={activitiesData.columns[0]: 'DateTime'}, inplace=True)
activitiesData = activitiesData.set_index('DateTime', drop= False)
col = ['floors','minutesLightlyActive','minutesSedentary','steps','calories','weight','elevation','distance','minutesFairlyActive','minutesVeryActive']
activitiesData[col] = activitiesData[col].mask(activitiesData[col].applymap(str).eq('0'))
activitiesData[['weight','minutesLightlyActive', 'steps', 'minutesSedentary', 'calories', 'elevation','distance','minutesFairlyActive','minutesVeryActive','floors']] = activitiesData[['weight','minutesLightlyActive', 'steps', 'minutesSedentary', 'calories', 'elevation','distance','minutesFairlyActive','minutesVeryActive','floors']].astype(float)
activitiesData['Day of week'] = activitiesData.index.weekday_name
weekday = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekend = ['Saturday','Sunday']
activitiesData.loc[activitiesData['Day of week'].isin(weekday), 'IsWeekday'] = 'Weekday'
activitiesData.loc[activitiesData['Day of week'].isin(weekend), 'IsWeekday'] = 'Weekend'
dayGroupedData = activitiesData.groupby(['Day of week']).mean()
dayTypeGroupedData = activitiesData.groupby(['IsWeekday']).mean()
activitiesData[['weight','minutesLightlyActive', 'steps', 'minutesSedentary', 'calories', 'elevation','distance','minutesFairlyActive','minutesVeryActive','floors']] = activitiesData[['weight','minutesLightlyActive', 'steps', 'minutesSedentary', 'calories', 'elevation','distance','minutesFairlyActive','minutesVeryActive','floors']].astype(float)
cols = ['steps', 'minutesSedentary', 'calories', 'elevation','distance','floors']
activitiesData[cols].describe()
fig,axes = plt.subplots(nrows=2, ncols=3,figsize=(15, 15))
dayofweek = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']
data_plot = list()
for i in range(len(axes)):
for j in range(len(axes[i])):
data_plot.append(axes[i][j])
for i,(x,ax) in enumerate(zip(cols,data_plot)):
ax = activitiesData.groupby('Day of week')[x].mean().plot(kind='bar', ax = data_plot[i])
ax.set_title('Average {} over a week in {}'.format(x, year))
ax.set_xticklabels(dayofweek, rotation = 0, ha="right")
ax.xaxis.label.set_visible(False)
plt.suptitle('Figure 1. Weekly Pattern of Activities in {}'.format(year))
plt.show()
cols_level = ['minutesLightlyActive', 'minutesFairlyActive','minutesVeryActive']
activitiesData[cols_level].describe()
fig = plt.figure(figsize = (6,6))
labels=['LightActive', 'FairlyActive','VeryActive']
plt.pie(activitiesData[cols_level].mean(), colors = ['lightskyblue', 'yellowgreen','salmon'], autopct='%1.1f%%', labels=labels, textprops=dict(color="w"))
plt.title('Figure 2. Levels of activity', fontsize=14)
plt.legend()
plt.show()
fig = plt.figure(figsize = (15,8))
plt.bar((dayGroupedData.index), dayGroupedData['minutesFairlyActive'], width = 0.4, alpha =0.5, color='dodgerblue', label='Minutes Fairly Active')
plt.bar((dayGroupedData.index), dayGroupedData['minutesVeryActive'], width = 0.4, alpha =0.5, color='slateblue', label='Minutes Very Active', )
plt.bar((dayGroupedData.index), dayGroupedData['minutesLightlyActive'],width = 0.4, alpha =0.5, color='lightskyblue', label='Minutes Lightly Active')
plt.xticks(np.arange(len(dayofweek)),dayofweek)
plt.title('Figure 3. Active Levels Based on Day of the Week')
plt.legend()
plt.show()
fig,axes = plt.subplots(nrows=2, ncols=3,figsize=(15, 15))
data_plot = list()
for i in range(len(axes)):
for j in range(len(axes[i])):
data_plot.append(axes[i][j])
for i,(x,ax) in enumerate(zip(cols,data_plot)):
ax = activitiesData.boxplot(column = x, by = 'IsWeekday', vert = True, ax = data_plot[i])
ax.set_title('Average {} over a week in {}'.format(x, year))
ax.set_title(x)
ax.xaxis.label.set_visible(False)
plt.suptitle('Figure 4. Boxplot grouped by Weekday VS Weekend')
plt.show()
activitiesData['Month'] = activitiesData.index.month
fig, axes = plt.subplots(3, 1, figsize=(12,10), sharex=True)
for name, ax in zip(cols, axes):
sns.boxplot(data=activitiesData, x='Month', y=name, ax=ax)
ax.set_ylabel('Minutes')
ax.set_title(name)
if ax != axes[-1]:
ax.set_xlabel('')
plt.suptitle('Figure 5. Monthly Activities over {}'.format(year))
plt.show()
correlations = activitiesData[['minutesLightlyActive', 'minutesFairlyActive','minutesVeryActive','steps', 'minutesSedentary', 'calories', 'elevation','distance','floors']].corr()
mask = np.zeros_like(correlations, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
fig = plt.figure(figsize=(15,15))
sns.heatmap(correlations,cmap=plt.cm.Greys, mask=mask, linewidths=0.05,vmax=1, vmin=0 ,annot=True,annot_kws={'size':10,'weight':'bold'})
plt.xticks(rotation=45)
plt.suptitle('Figure 6. Activities correlations')
plt.show()