diff --git a/blogContent/headerImages/restingHeartRate.svg b/blogContent/headerImages/restingHeartRate.svg new file mode 100644 index 0000000..f7f6d61 --- /dev/null +++ b/blogContent/headerImages/restingHeartRate.svg @@ -0,0 +1,1124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blogContent/posts/data-science/graphing-my-life-with-matplotlib.md b/blogContent/posts/data-science/graphing-my-life-with-matplotlib.md new file mode 100644 index 0000000..73b8526 --- /dev/null +++ b/blogContent/posts/data-science/graphing-my-life-with-matplotlib.md @@ -0,0 +1,741 @@ +Let's do a deep dive and start visualizing my life using Fitbit and +Matplotlib. + +# What is Fitbit + +[Fitbit](https://www.fitbit.com) is a fitness watch that tracks your sleep, heart rate, and activity. +Fitbit is able to track your steps, however, it is also able to detect multiple types of activity +like running, walking, "sport" and biking. + +# What is Matplotlib + +[Matplotlib](https://matplotlib.org/) is a python visualization library that enables you to create bar graphs, line graphs, distributions and many more things. +Being able to visualize your results is essential to any person working with data at any scale. +Although I like [GGplot](https://ggplot2.tidyverse.org/) in R more than Matplotlib, Matplotlib is still my go to graphing library for Python. + +# Getting Your Fitbit Data + +There are two main ways that you can get your Fitbit data: + +- Fitbit API +- Data Archival Export + + +Since connecting to the API and setting up all the web hooks can be a +pain, I'm just going to use the data export option because this is +only for one person. You can export your data here: +[https://www.fitbit.com/settings/data/export](https://www.fitbit.com/settings/data/export). + +![Data export on fitbit's website](media/vis_my_life/dataExport.png) + +The Fitbit data archive was very organized and kept meticulous records +of everything. All of the data was organized in separate JSON files +labeled by date. Fitbit keeps around 1MB of data on you per day; most +of this data is from the heart rate sensors. Although 1MB of data may +sound like a ton of data, it is probably a lot less if you store it in +formats other than JSON. When I downloaded the compressed file it was +20MB, but when I extracted it, it was 380MB! I've only been using +Fitbit for 11 months at this point. + +![compressed data](media/vis_my_life/compression.png) + +## Sleep + +Sleep is something fun to visualize. No matter how much of it you get +you still feel tired as a college student. In the "sleep_score" folder +of the exported data you will find a single CSV file with your resting +heart rate and Fitbit's computed sleep scores. Interesting enough, +this is the only file that comes in the CSV format, everything else is +JSON file. + +We can read in all the data using a single liner with the +[Pandas](https://pandas.pydata.org/) python library. + + + +```python +import matplotlib.pyplot as plt +import pandas as pd + +sleep_score_df = pd.read_csv('data/sleep/sleep_score.csv') +``` + + +```python +print(sleep_score_df) +``` + + sleep_log_entry_id timestamp overall_score \ + 0 26093459526 2020-02-27T06:04:30Z 80 + 1 26081303207 2020-02-26T06:13:30Z 83 + 2 26062481322 2020-02-25T06:00:30Z 82 + 3 26045941555 2020-02-24T05:49:30Z 79 + 4 26034268762 2020-02-23T08:35:30Z 75 + .. ... ... ... + 176 23696231032 2019-09-02T07:38:30Z 79 + 177 23684345925 2019-09-01T07:15:30Z 84 + 178 23673204871 2019-08-31T07:11:00Z 74 + 179 23661278483 2019-08-30T06:34:00Z 73 + 180 23646265400 2019-08-29T05:55:00Z 80 + + composition_score revitalization_score duration_score \ + 0 20 19 41 + 1 22 21 40 + 2 22 21 39 + 3 17 20 42 + 4 20 16 39 + .. ... ... ... + 176 20 20 39 + 177 22 21 41 + 178 18 21 35 + 179 17 19 37 + 180 21 21 38 + + deep_sleep_in_minutes resting_heart_rate restlessness + 0 65 60 0.117330 + 1 85 60 0.113188 + 2 95 60 0.120635 + 3 52 61 0.111224 + 4 43 59 0.154774 + .. ... ... ... + 176 88 56 0.170923 + 177 95 56 0.133268 + 178 73 56 0.102703 + 179 50 55 0.121086 + 180 61 57 0.112961 + + [181 rows x 9 columns] + + +With the Pandas library you can generate Matplotlib graphs. Although +you can directly use Matplotlib, the wrapper functions using Pandas +makes it easier to use. + +## Sleep Score Histogram + + +```python +sleep_score_df.hist(column='overall_score') +``` + + + + + array([[]], + dtype=object) + + + + +![png](media/vis_my_life/output_7_1.png) + + +## Heart Rate + +Fitbit keeps their calculated heart rates in the sleep scores file +rather than heart. Knowing your resting heart rate is useful because +it is a good indicator of your overall health. + +![](media/vis_my_life/restingHeartRate.jpg) + + +```python +sleep_score_df.hist(column='resting_heart_rate') +``` + + + + + array([[]], + dtype=object) + + + + +![png](media/vis_my_life/output_9_1.png) + + +## Resting Heart Rate Time Graph + +Using the pandas wrapper we can quickly create a heart rate graph over +time. + + +```python +sleep_score_df.plot(kind='line', y='resting_heart_rate', x ='timestamp', legend=False, title="Resting Heart Rate(BPM)") +``` + + + + + + + + + +![png](media/vis_my_life/output_11_1.png) + + +However, as we notice with the graph above, the time axis is wack. In +the pandas data frame everything was stored as a string timestamp. We +can convert this into a datetime object by telling pandas to parse the +date as it reads it. + + +```python +sleep_score_df = pd.read_csv('data/sleep/sleep_score.csv', parse_dates=[1]) +sleep_score_df.plot(kind='line', y='resting_heart_rate', x ='timestamp', legend=False, title="Resting Heart Rate(BPM)") +``` + + + + + + + + + +![png](media/vis_my_life/output_13_1.png) + + +To fully manipulate the graphs, we need to use some matplotlib code to +do things like setting the axis labels or make multiple plots right +next to each other. We can create grab the current axis being used by +matplotlib by using plt.gca(). + + +```python +ax = plt.gca() +sleep_score_df.plot(kind='line', y='resting_heart_rate', x ='timestamp', legend=False, title="Resting Heart Rate Graph", ax=ax, figsize=(10, 5)) +plt.xlabel("Date") +plt.ylabel("Resting Heart Rate (BPM)") +plt.show() + +#plt.savefig('restingHeartRate.svg') +``` + + +![png](media/vis_my_life/output_15_0.png) + + +The same thing can be done with sleep scores. It is interesting to +note that the sleep scores rarely vary anything between 75 and 85. + + +```python +ax = plt.gca() +sleep_score_df.plot(kind='line', y='overall_score', x ='timestamp', legend=False, title="Sleep Score Time Series Graph", ax=ax) +plt.xlabel("Date") +plt.ylabel("Fitbit's Sleep Score") +plt.show() +``` + + +![png](media/vis_my_life/output_17_0.png) + + +Using Pandas we can generate a new column with a specific date +attribute like year, day, month, or weekday. If we add a new column +for weekday, we can then group by weekday and collapse them all into a +single column by summing or averaging the value. + + +```python +temp = pd.DatetimeIndex(sleep_score_df['timestamp']) +sleep_score_df['weekday'] = temp.weekday + +print(sleep_score_df) +``` + + sleep_log_entry_id timestamp overall_score \ + 0 26093459526 2020-02-27 06:04:30+00:00 80 + 1 26081303207 2020-02-26 06:13:30+00:00 83 + 2 26062481322 2020-02-25 06:00:30+00:00 82 + 3 26045941555 2020-02-24 05:49:30+00:00 79 + 4 26034268762 2020-02-23 08:35:30+00:00 75 + .. ... ... ... + 176 23696231032 2019-09-02 07:38:30+00:00 79 + 177 23684345925 2019-09-01 07:15:30+00:00 84 + 178 23673204871 2019-08-31 07:11:00+00:00 74 + 179 23661278483 2019-08-30 06:34:00+00:00 73 + 180 23646265400 2019-08-29 05:55:00+00:00 80 + + composition_score revitalization_score duration_score \ + 0 20 19 41 + 1 22 21 40 + 2 22 21 39 + 3 17 20 42 + 4 20 16 39 + .. ... ... ... + 176 20 20 39 + 177 22 21 41 + 178 18 21 35 + 179 17 19 37 + 180 21 21 38 + + deep_sleep_in_minutes resting_heart_rate restlessness weekday + 0 65 60 0.117330 3 + 1 85 60 0.113188 2 + 2 95 60 0.120635 1 + 3 52 61 0.111224 0 + 4 43 59 0.154774 6 + .. ... ... ... ... + 176 88 56 0.170923 0 + 177 95 56 0.133268 6 + 178 73 56 0.102703 5 + 179 50 55 0.121086 4 + 180 61 57 0.112961 3 + + [181 rows x 10 columns] + + + +```python +print(sleep_score_df.groupby('weekday').mean()) +``` + + sleep_log_entry_id overall_score composition_score \ + weekday + 0 2.483733e+10 79.576923 20.269231 + 1 2.485200e+10 77.423077 20.423077 + 2 2.490383e+10 80.880000 21.120000 + 3 2.483418e+10 76.814815 20.370370 + 4 2.480085e+10 79.769231 20.961538 + 5 2.477002e+10 78.840000 20.520000 + 6 2.482581e+10 77.230769 20.269231 + + revitalization_score duration_score deep_sleep_in_minutes \ + weekday + 0 19.153846 40.153846 88.000000 + 1 19.000000 38.000000 83.846154 + 2 19.400000 40.360000 93.760000 + 3 19.037037 37.407407 82.592593 + 4 19.346154 39.461538 94.461538 + 5 19.080000 39.240000 93.720000 + 6 18.269231 38.692308 89.423077 + + resting_heart_rate restlessness + weekday + 0 58.576923 0.139440 + 1 58.538462 0.142984 + 2 58.560000 0.138661 + 3 58.333333 0.135819 + 4 58.269231 0.129791 + 5 58.080000 0.138315 + 6 58.153846 0.147171 + + +## Sleep Score Based on Day + + +```python +ax = plt.gca() +sleep_score_df.groupby('weekday').mean().plot(kind='line', y='overall_score', ax = ax) +plt.ylabel("Sleep Score") +plt.title("Sleep Scores on Varying Days of Week") +plt.show() +``` + + +![png](media/vis_my_life/output_22_0.png) + + +## Sleep Score Based on Days of Week + + +```python +ax = plt.gca() +sleep_score_df.groupby('weekday').mean().plot(kind='line', y='resting_heart_rate', ax = ax) +plt.ylabel("Resting heart rate (BPM)") +plt.title("Resting Heart Rate Varying Days of Week") +plt.show() +``` + + +![png](media/vis_my_life/output_24_0.png) + + +# Calories + +Fitbit keeps all of their calorie data in JSON files representing +sequence data at 1 minute increments. To extrapolate calorie data we +need to group by day and then sum the days to get the total calories +burned per day. + + +```python +calories_df = pd.read_json("data/calories/calories-2019-07-01.json", convert_dates=True) +``` + + +```python +print(calories_df) +``` + + dateTime value + 0 2019-07-01 00:00:00 1.07 + 1 2019-07-01 00:01:00 1.07 + 2 2019-07-01 00:02:00 1.07 + 3 2019-07-01 00:03:00 1.07 + 4 2019-07-01 00:04:00 1.07 + ... ... ... + 43195 2019-07-30 23:55:00 1.07 + 43196 2019-07-30 23:56:00 1.07 + 43197 2019-07-30 23:57:00 1.07 + 43198 2019-07-30 23:58:00 1.07 + 43199 2019-07-30 23:59:00 1.07 + + [43200 rows x 2 columns] + + + +```python +import datetime +calories_df['date_minus_time'] = calories_df["dateTime"].apply( lambda calories_df : + datetime.datetime(year=calories_df.year, month=calories_df.month, day=calories_df.day)) + +calories_df.set_index(calories_df["date_minus_time"],inplace=True) + +print(calories_df) +``` + + dateTime value date_minus_time + date_minus_time + 2019-07-01 2019-07-01 00:00:00 1.07 2019-07-01 + 2019-07-01 2019-07-01 00:01:00 1.07 2019-07-01 + 2019-07-01 2019-07-01 00:02:00 1.07 2019-07-01 + 2019-07-01 2019-07-01 00:03:00 1.07 2019-07-01 + 2019-07-01 2019-07-01 00:04:00 1.07 2019-07-01 + ... ... ... ... + 2019-07-30 2019-07-30 23:55:00 1.07 2019-07-30 + 2019-07-30 2019-07-30 23:56:00 1.07 2019-07-30 + 2019-07-30 2019-07-30 23:57:00 1.07 2019-07-30 + 2019-07-30 2019-07-30 23:58:00 1.07 2019-07-30 + 2019-07-30 2019-07-30 23:59:00 1.07 2019-07-30 + + [43200 rows x 3 columns] + + + +```python +calories_per_day = calories_df.resample('D').sum() +print(calories_per_day) +``` + + value + date_minus_time + 2019-07-01 3422.68 + 2019-07-02 2705.85 + 2019-07-03 2871.73 + 2019-07-04 4089.93 + 2019-07-05 3917.91 + 2019-07-06 2762.55 + 2019-07-07 2929.58 + 2019-07-08 2698.99 + 2019-07-09 2833.27 + 2019-07-10 2529.21 + 2019-07-11 2634.25 + 2019-07-12 2953.91 + 2019-07-13 4247.45 + 2019-07-14 2998.35 + 2019-07-15 2846.18 + 2019-07-16 3084.39 + 2019-07-17 2331.06 + 2019-07-18 2849.20 + 2019-07-19 2071.63 + 2019-07-20 2746.25 + 2019-07-21 2562.11 + 2019-07-22 1892.99 + 2019-07-23 2372.89 + 2019-07-24 2320.42 + 2019-07-25 2140.87 + 2019-07-26 2430.38 + 2019-07-27 3769.04 + 2019-07-28 2036.24 + 2019-07-29 2814.87 + 2019-07-30 2077.82 + + + +```python +ax = plt.gca() +calories_per_day.plot(kind='hist', title="Calorie Distribution", legend=False, ax=ax) +plt.show() +``` + + +![png](media/vis_my_life/output_30_0.png) + + + +```python +ax = plt.gca() +calories_per_day.plot(kind='line', y='value', legend=False, title="Calories Per Day", ax=ax) +plt.xlabel("Date") +plt.ylabel("Calories") +plt.show() +``` + + +![png](media/vis_my_life/output_31_0.png) + + +## Calories Per Day Box Plot + +Using this data we can turn this into a boxplot to make it easier to +visualize the distribution of calories burned during the month of +July. + + +```python +ax = plt.gca() +ax.set_title('Calorie Distribution for July') +ax.boxplot(calories_per_day['value'], vert=False,manage_ticks=False, notch=True) +plt.xlabel("Calories Burned") +ax.set_yticks([]) +plt.show() +``` + + +![png](media/vis_my_life/output_33_0.png) + + +# Steps + +Fitbit is known for taking the amount of steps someone takes per day. +Similar to calories burned, steps taken is stored in time series data +at 1 minute increments. Since we are interested at the day level data, +we need to first remove the time component of the dataframe so that we +can group all the data by date. Once we have everything grouped by +date, we can sum and produce steps per day. + + +```python +steps_df = pd.read_json("data/steps-2019-07-01.json", convert_dates=True) + +steps_df['date_minus_time'] = steps_df["dateTime"].apply( lambda steps_df : + datetime.datetime(year=steps_df.year, month=steps_df.month, day=steps_df.day)) + +steps_df.set_index(steps_df["date_minus_time"],inplace=True) +print(steps_df) +``` + + dateTime value date_minus_time + date_minus_time + 2019-07-01 2019-07-01 04:00:00 0 2019-07-01 + 2019-07-01 2019-07-01 04:01:00 0 2019-07-01 + 2019-07-01 2019-07-01 04:02:00 0 2019-07-01 + 2019-07-01 2019-07-01 04:03:00 0 2019-07-01 + 2019-07-01 2019-07-01 04:04:00 0 2019-07-01 + ... ... ... ... + 2019-07-31 2019-07-31 03:55:00 0 2019-07-31 + 2019-07-31 2019-07-31 03:56:00 0 2019-07-31 + 2019-07-31 2019-07-31 03:57:00 0 2019-07-31 + 2019-07-31 2019-07-31 03:58:00 0 2019-07-31 + 2019-07-31 2019-07-31 03:59:00 0 2019-07-31 + + [41116 rows x 3 columns] + + + +```python +steps_per_day = steps_df.resample('D').sum() +print(steps_per_day) +``` + + value + date_minus_time + 2019-07-01 11285 + 2019-07-02 4957 + 2019-07-03 13119 + 2019-07-04 16034 + 2019-07-05 11634 + 2019-07-06 6860 + 2019-07-07 3758 + 2019-07-08 9130 + 2019-07-09 10960 + 2019-07-10 7012 + 2019-07-11 5420 + 2019-07-12 4051 + 2019-07-13 15980 + 2019-07-14 23109 + 2019-07-15 11247 + 2019-07-16 10170 + 2019-07-17 4905 + 2019-07-18 10769 + 2019-07-19 4504 + 2019-07-20 5032 + 2019-07-21 8953 + 2019-07-22 2200 + 2019-07-23 9392 + 2019-07-24 5666 + 2019-07-25 5016 + 2019-07-26 5879 + 2019-07-27 19492 + 2019-07-28 4987 + 2019-07-29 9943 + 2019-07-30 3897 + 2019-07-31 166 + + +## Steps Per Day Histogram + +After the data is in the form that we want, graphing the data is +straight forward. Two added things I like to do for normal box plots +is to set the displays to horizontal add the notches. + + +```python +ax = plt.gca() +ax.set_title('Steps Distribution for July') +ax.boxplot(steps_per_day['value'], vert=False,manage_ticks=False, notch=True) +plt.xlabel("Steps Per Day") +ax.set_yticks([]) +plt.show() +``` + + +![png](media/vis_my_life/output_38_0.png) + + +Wrapping that all into a single function we get something like this: + + +```python +def readFileIntoDataFrame(fName): + steps_df = pd.read_json(fName, convert_dates=True) + + steps_df['date_minus_time'] = steps_df["dateTime"].apply( lambda steps_df : + datetime.datetime(year=steps_df.year, month=steps_df.month, day=steps_df.day)) + + steps_df.set_index(steps_df["date_minus_time"],inplace=True) + return steps_df.resample('D').sum() + +def graphBoxAndWhiskers(data, title, xlab): + ax = plt.gca() + ax.set_title(title) + ax.boxplot(data['value'], vert=False, manage_ticks=False, notch=True) + plt.xlabel(xlab) + ax.set_yticks([]) + plt.show() +``` + + +```python +graphBoxAndWhiskers(readFileIntoDataFrame("data/steps-2020-01-27.json"), "Steps In January", "Steps Per Day") +``` + + +![png](media/vis_my_life/output_41_0.png) + + +That is cool, but, what if we could view the distribution for each +month in the same graph? Based on the two previous graphs, my step +distribution during July looked distinctly different from my step +distribution in January. The first difficultly would be to read in +all the files since Fitbit creates a new file for every month. The +next thing would be to group them by month and then graph it. + + +```python +import os +files = os.listdir("data") +print(files) +``` + + ['steps-2019-04-02.json', 'steps-2019-08-30.json', 'steps-2020-02-26.json', 'steps-2019-10-29.json', 'steps-2019-07-01.json', 'steps-2020-01-27.json', 'steps-2019-07-31.json', 'steps-2019-06-01.json', 'steps-2019-09-29.json', '.ipynb_checkpoints', 'steps-2019-12-28.json', 'steps-2019-05-02.json', 'calories', 'steps-2019-11-28.json', 'sleep'] + + + +```python +dfs = [] +for file in files: # this can take 15 seconds + if "steps" in file: # finds the steps files + dfs.append(readFileIntoDataFrame("data/" + file)) +``` + + +```python +stepsPerDay = pd.concat(dfs) +graphBoxAndWhiskers(stepsPerDay, "Steps Per Day Last 11 Months", "Steps per Day") +``` + + +![png](media/vis_my_life/output_45_0.png) + + + +```python +print(type(stepsPerDay['value'].to_numpy())) +print(stepsPerDay['value'].keys()) + +stepsPerDay['month'] = pd.DatetimeIndex(stepsPerDay['value'].keys()).month +stepsPerDay['week_day'] = pd.DatetimeIndex(stepsPerDay['value'].keys()).weekday + +print(stepsPerDay) +``` + + + DatetimeIndex(['2019-04-03', '2019-04-04', '2019-04-05', '2019-04-06', + '2019-04-07', '2019-04-08', '2019-04-09', '2019-04-10', + '2019-04-11', '2019-04-12', + ... + '2019-12-19', '2019-12-20', '2019-12-21', '2019-12-22', + '2019-12-23', '2019-12-24', '2019-12-25', '2019-12-26', + '2019-12-27', '2019-12-28'], + dtype='datetime64[ns]', name='date_minus_time', length=342, freq=None) + value month week_day + date_minus_time + 2019-04-03 510 4 2 + 2019-04-04 11453 4 3 + 2019-04-05 12684 4 4 + 2019-04-06 12910 4 5 + 2019-04-07 3368 4 6 + ... ... ... ... + 2019-12-24 5779 12 1 + 2019-12-25 4264 12 2 + 2019-12-26 4843 12 3 + 2019-12-27 9609 12 4 + 2019-12-28 2218 12 5 + + [342 rows x 3 columns] + + +## Graphing Steps by Month + +Now that we have columns for the total amount of steps per day and the +months, we can plot all the data on a single plot using the group by +operator in the plotting library. + + +```python +ax = plt.gca() +ax.set_title('Steps Distribution for July\n') +stepsPerDay.boxplot(column=['value'], by='month',ax=ax, notch=True) +plt.xlabel("Month") +plt.ylabel("Steps Per Day") +plt.show() +``` + + +![png](media/vis_my_life/output_48_0.png) + + + +```python +ax = plt.gca() +ax.set_title('Steps Distribution By Week Day\n') +stepsPerDay.boxplot(column=['value'], by='week_day',ax=ax, notch=True) +plt.xlabel("Week Day") +plt.ylabel("Steps Per Day") +plt.show() +``` + + +![png](media/vis_my_life/output_49_0.png) + + +## Future Work + +Moving forward with this I would like to do more visualizations with +sleep data and heart rate. diff --git a/blogContent/posts/data-science/media/vis_my_life/compression.png b/blogContent/posts/data-science/media/vis_my_life/compression.png new file mode 100644 index 0000000..c9061c3 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/compression.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/dataExport.png b/blogContent/posts/data-science/media/vis_my_life/dataExport.png new file mode 100644 index 0000000..56871e4 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/dataExport.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_11_1.png b/blogContent/posts/data-science/media/vis_my_life/output_11_1.png new file mode 100644 index 0000000..9955d1b Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_11_1.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_13_1.png b/blogContent/posts/data-science/media/vis_my_life/output_13_1.png new file mode 100644 index 0000000..ec00be1 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_13_1.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_15_0.png b/blogContent/posts/data-science/media/vis_my_life/output_15_0.png new file mode 100644 index 0000000..618fde6 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_15_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_17_0.png b/blogContent/posts/data-science/media/vis_my_life/output_17_0.png new file mode 100644 index 0000000..e892b5f Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_17_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_22_0.png b/blogContent/posts/data-science/media/vis_my_life/output_22_0.png new file mode 100644 index 0000000..2c62367 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_22_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_24_0.png b/blogContent/posts/data-science/media/vis_my_life/output_24_0.png new file mode 100644 index 0000000..11bc90a Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_24_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_30_0.png b/blogContent/posts/data-science/media/vis_my_life/output_30_0.png new file mode 100644 index 0000000..a411e83 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_30_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_31_0.png b/blogContent/posts/data-science/media/vis_my_life/output_31_0.png new file mode 100644 index 0000000..8b81b8b Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_31_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_33_0.png b/blogContent/posts/data-science/media/vis_my_life/output_33_0.png new file mode 100644 index 0000000..4195063 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_33_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_38_0.png b/blogContent/posts/data-science/media/vis_my_life/output_38_0.png new file mode 100644 index 0000000..2b239af Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_38_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_41_0.png b/blogContent/posts/data-science/media/vis_my_life/output_41_0.png new file mode 100644 index 0000000..fe7c10a Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_41_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_45_0.png b/blogContent/posts/data-science/media/vis_my_life/output_45_0.png new file mode 100644 index 0000000..ecf5205 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_45_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_48_0.png b/blogContent/posts/data-science/media/vis_my_life/output_48_0.png new file mode 100644 index 0000000..b1ca0b5 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_48_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_49_0.png b/blogContent/posts/data-science/media/vis_my_life/output_49_0.png new file mode 100644 index 0000000..44bcbbf Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_49_0.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_7_1.png b/blogContent/posts/data-science/media/vis_my_life/output_7_1.png new file mode 100644 index 0000000..621186b Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_7_1.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/output_9_1.png b/blogContent/posts/data-science/media/vis_my_life/output_9_1.png new file mode 100644 index 0000000..106d86a Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/output_9_1.png differ diff --git a/blogContent/posts/data-science/media/vis_my_life/restingHeartRate.jpg b/blogContent/posts/data-science/media/vis_my_life/restingHeartRate.jpg new file mode 100644 index 0000000..f26d8b3 Binary files /dev/null and b/blogContent/posts/data-science/media/vis_my_life/restingHeartRate.jpg differ