Many of you will have realised that I post every weekend. If you think that doing so shows how disciplined I am, you’re terribly mistaken. Not too long ago, I faced problems with low motivation, poor self-control, and bad time management. I was unsatisfied with how I lived my life. I noticed my bills getting larger, my waist getting bigger, and my energy dropping lower. One day, I had enough of my own nonsense. I was borrowing money, time, and health from my future self at an unsustainable rate, and I decided this had to stop. That’s when I started Project Evolve, a self-driven initiative to build willpower and improve my personal effectiveness. This post is for anyone who wants to break out of a cycle of procrastination and sloth, and evolve into a better and stronger version of himself/herself.

The Story Behind Evolve


A few months ago, I was unsatisfied with life and with myself. I didn’t feel the sense of fulfilment at work that I once had, and felt that I had lost control over my personal life. I procrastinated on almost everything. At work, I failed to manage my tasks well and only just met deadlines. In my personal life, the level of initiative wasn’t any higher. I procrastinated on ordering a desktop computer for over 6 months, even though it would have greatly enhanced my gaming and programming experience. I procrastinated on bills, even though I knew that these would result in late penalties.

My personal management was positively poor. For example, I let my expenses run wild as I spent way too much money on transport. Despite living relatively far from my workplace, I took Grab to and from work almost every day, racking up hundreds of dollars in bills per month for transport. I also failed to manage my health. I often ate unhealthy food or overate and yes, I grew fatter. I slowed down in personal development as well. I posted inconsistently on my blog, and procrastinated on picking up Python as my new primary language for data science. I was lagging further behind in my reading goal of 30 books this year. It seemed that the only positive point in all this was that I had perfect awareness on what was happening. Yet, I did not have the willpower and the resolve to correct my bad habits and chase my personal goals.

The Turnaround

As I tried to keep up on reading, I happened to read The Power of Habit by Charles Duhigg, which then inspired me to read The Now Habit by Neil Fiore, Superhuman by Habit by Tynan, and The Willpower Instinct by Kelly McGonigal. These books showed me that my problem was no different from that of alcohol and drug addicts: (1) it stemmed from habits and (2) these habits could be changed. At the same time, I grew increasingly sick of myself: my waistline, my bills, my energy level, the state of completion of tasks, and the level of control over my life. The books came at a timely moment and inspired Project Evolve.


Using my newfound strategies for building willpower and combating procrastination, I developed a system called Evolve. It is an app built on AppSheet for tracking finances, activities, and habits. You probably don’t understand what tracking myself had to do with willpower or procrastination. And so, let’s dive into the science behind Evolve first.

The Science Behind Evolve


In The Power of Habit, Charles Duhigg defines habits as “choices that we deliberately make at some point, and then stop thinking about, but continue doing, often every day”. They are made up of cycles comprising a Cue, a Routine, and a Reward. When you see the Cue, you execute the Routine in order to get the Reward. To transform habits, you need to keep the Cue, keep the Reward, change the Routine, and truly believe that change is possible.

For example, I had the habit of playing games for many hours at a stretch. I could not limit myself. I identified the cue as boredom and the need for intellectual engagement, the routine as gaming, and the reward as intellectual stimulation. Now, when I notice the cue (boredom), I adopt a different routine. If it is high-intensity intellectual engagement that I need, I dive into programming on a topic of interest (at the moment, finance). If it is low-intensity intellectual engagement that I’m looking for in that moment, I grab my Kindle and read. The end result is still the same: my brain gets some action.

Keystone Habits

Duhigg argues that it is important to develop Keystone Habits and build willpower. Keystone habits are core routines that, when established, help all other routines fall in place. When keystone habits are maintained, we tend to also maintain other good habits. For example, cultivating a habit of exercising helps us to eat healthier. He writes about two Australian researchers, Megan Oaten and Ken Cheng, who created a willpower workout to help children lose weight. After forcing the experiment’s participants to undergo a physical exercise programme, they found that the participants became more disciplined overall. They smoked less, drank less, and watched less TV. To eliminate the effect of better health on willpower, they instructed a different set of participants to log their diets instead - a programme that did not necessarily guarantee improvement in health. Yet, they found similar results! To confirm the impact of greater self-discipline in one area of participants’ lives on other areas, they instructed yet a different set of participants to log their finances. They observed similar results. The finding? When willpower improved, it improved in many areas of the participants’ lives. Coincidentally, Neil Fiore’s system - The Now Habit - recommends exactly that: logging everything you do. The log shows you how much time you spent on productive work, guilt-free leisure, and procrastination.

Small Wins

Duhigg also writes about achieving small wins to build confidence. This is supported by Kelly McGonigal’s findings in The Willpower Instinct. She writes about willpower as a muscle that can be trained. The same brain muscle that forces you to break one bad habit is the same muscle that will help you to break others. She confirms Duhigg’s idea of keystone habits that establishing new habits in just one area of our lives can spillover to both other parts of our lives and others’ lives. If the brain is a muscle, self-control is exercise, and small wins are endorphins.

The evidence on building keystone habits and achieving small wins was convincing. I figured that I had to try it for myself, and that was how Evolve was born.


Evolve is simply the application of Duhigg’s, Fiore’s and McGonigal’s ideas: to deliver small wins and kickstart willpower development for transformative change. It is an app that enables you to track your finances, activities, and habits, and helps you to cultivate self-awareness. By tracking how much money and time you spend, you gain an awareness of how you’re spending your precious resources, and can then optimise them. By tracking your keystone habits, you inevitably gain awareness on how you prioritise. In fact, the act of logging is itself a keystone habit.

Below are several screenshots of the app (built in AppSheet):

Summary of activities

Summary of activities

Logging activities

Logging activities

I understand that we might be hesitant to partake in any programme that helps us to achieve self-awareness, possibly because we’re afraid of what we might find. That’s perfectly normal. Until today, I don’t dare to tabulate the total amount I spent on Grab. But, at some point in our personal development, we need to give permission to an objective third-party to tell us how we’ve actually been doing. And this third-party need not be a person - it can be an app like Evolve. And there’s no better way to demonstrate this than to lead by example.

The rest of this post will be dedicated to exploring activity data that I logged over the past month.

# Import required packages
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import seaborn.apionly as sns
import pandas as pd
import warnings

# Settings

# Read data
evolve = pd.read_csv('Log - Activities.csv')

# Convert Career Prep
evolve.Category[evolve.Category == 'Career Prep'] = 'Personal Development'

# Convert dates and times
evolve['Time Start'] = pd.to_datetime(evolve['Time Start'], format='%d/%m/%Y %H:%M:%S')
evolve['Time End'] = pd.to_datetime(evolve['Time End'], format='%d/%m/%Y %H:%M:%S')

# Get date
evolve['Day'] = evolve['Time Start']

Overview of Time Spent

I developed 11 broad categories to classify my time:

  1. Rest: Sleep and resting
  2. Sustenance: Eating and body maintenance
  3. Work: Self-explanatory
  4. Family: All activities spent with family and maintaining the household
  5. Personal Development: Reading, meditating, programming, and blogging
  6. Relationships: Time spent with friends, which include meet-ups, chatting and texting
  7. Idle: My favourite category - includes gaming, listening to music, stoning, and watching videos or TV
  8. Health: Exercise and researching on health matters
  9. Productivity: Planning, organising, and developing tools for productivity

The donut chart below shows how I’ve spent my time over the past 30 days. Apart from sleeping, I invested most of my time in work and personal development. I actually spent more time idling (mostly gaming, really) than on household matters, and this is something I hope to change. Let’s dive deeper.

Expectations vs. Reality

Before I started this analysis, I forced myself to guess how much time I spent on sleeping, working, personal development, and idling.

  • Sleep: I sleep late on weekdays and even later on weekends. My wife and I both felt that I did not sleep enough. Hence, I estimated that I slept 7 hours a day on average.
  • Work: Based on gut feel, it felt as if I worked 8 hours a day on average.
  • Personal Development: Based on my estimate of 1 hour of reading (on the train) and about 1 hour on programming everyday, I estimated that I spent an average of 2 hours a day on personal development.
  • Idling: Once again, based on gut feel, I estimated that I spent 3 hours on unproductive activities everyday, on average.
# Daily data
evolve_daily = pd.DataFrame(evolve.groupby(['Category', 'Day'])['Duration'].sum()).reset_index(drop = False)
evolve_daily_sub = pd.DataFrame(evolve.groupby(['Category', 'Sub-Category', 'Day'])['Duration'].sum()).reset_index(drop = False)

# Targets
tgt = pd.DataFrame([
    {'Category': 'Rest', 'Duration': 7},
    {'Category': 'Work', 'Duration': 8},
    {'Category': 'Personal Development', 'Duration': 2},
    {'Category': 'Idle', 'Duration': 3}

# Actual data
actual = (evolve_daily.groupby('Category').Duration.mean().sort_values(ascending = False)/60).loc[['Rest', 'Work', 'Personal Development', 'Idle']]

The data suggests that my estimates were rather inaccurate! On average, I slept approximately 9 hours, worked 9.3 hours (after adjusting for weekends), spent 3.4 hours on personal development, and wasted only 2 hours a day. This means that:

  1. Neither my wife nor I can complain about me lacking sleep.
  2. Assuming a typical work day of 8 am to 6 pm (10 hours), I spend 93% of my work time productively!
  3. I spend more time on personal development than I think - I should keep it up and not rest on my laurels.
  4. I spend an awful lot of time idling. I need to know why!

Exploring My Idle Time

To reduce my idle time, I need to know specifically how I’ve been idling. As predicted, more than half of my idle time was spent on gaming (CSGO, to be specific). In case you’re wondering, I chose to put gaming under the “Idle” category because my long-term aim is to replace gaming with programming/blogging as my primary source of leisure. However, Neil Fiore recommends that we plan for leisure and down time so that we can enjoy these without guilt. Perhaps I’ll implement this in the next iteration of Evolve.

The bar plot below shows that Tuesdays, Thursdays, Fridays, and Saturdays are the days that I spend the most time idling, on average.

Upon closer examination of my idle time on these days, I discovered that I tended to watch more videos on Tuesdays, game more on Thursdays, use my phone more on Fridays, and watch a lot more TV (probably football) on Saturdays than usual. I will have to watch these habits closely if I want to control my time spent on unproductive uses. Alternatively, I could re-define what “unproductive” means. After all, leisure is meant to be guilt-free. What’s important is tracking the time I spend procrastinating.

# Add weekday
idle_daily_sub = pd.DataFrame(evolve.groupby(['Category', 'Sub-Category', 'Day'])['Duration'].sum()).reset_index(drop = False).copy()
idle_daily_sub = idle_daily_sub[idle_daily_sub.Category == 'Idle']
idle_daily_sub['Weekday'] = pd.to_datetime(idle_daily_sub['Day']).dt.weekday
idle_daily_sub['hours'] = idle_daily_sub.Duration / 60

# Check idle activities on Tuesdays
idle_tue = idle_daily_sub[idle_daily_sub.Weekday == 1].copy()

# Check idle activities on Fridays
idle_fri = idle_daily_sub[idle_daily_sub.Weekday == 4].copy()

# Check idle activities on Saturdays
idle_sat = idle_daily_sub[idle_daily_sub.Weekday == 5].copy()

Exploring My Personal Development Time

Overall, my three key activities for personal development have been Python programming, reading, and blogging. The graph below shows the breakdown of time spent on each:

I’ve spent approximately 6 hours on personal development on the weekends, and 1-3 hours on weekdays. There is a noticeable drop in time spent on personal development on Fridays, possibly because I use Fridays to unwind, and end up slacking off a little.

Examining my weekend personal development time further, I noticed that my weekly rhythm involves cleaning up my weekly post on Saturdays, and researching for the following week’s post on Sundays. I also spent a lot less time reading on weekends, which implies inconsistent reading. I could improve by catering more time for reading on the weekends, and push some programming work to weekday nights.

# Add weekday
pd_daily_sub = pd.DataFrame(evolve.groupby(['Category', 'Sub-Category', 'Day'])['Duration'].sum()).reset_index(drop = False).copy()
pd_daily_sub = pd_daily_sub[pd_daily_sub.Category == 'Personal Development']
pd_daily_sub['Weekday'] = pd.to_datetime(pd_daily_sub['Day']).dt.weekday
pd_daily_sub['hours'] = pd_daily_sub.Duration / 60

# Check idle activities on Tuesdays
pd_sat = pd_daily_sub[pd_daily_sub.Weekday == 5].copy()

# Check idle activities on Thursdays
pd_sun = pd_daily_sub[pd_daily_sub.Weekday == 6].copy()

Exploring Health

Next, we examine the time I’ve spent looking after my body. First, we see that my meal timings have not been very consistent. I usually have my lunch within a 3-hour block from 11 am to 2 pm, and dinner within a 2-hour block from 6 pm to 8 pm. The data also shows that I don’t eat breakfast consistently.

# Extract eating time
bf_data = evolve[(evolve['Sub-Category'] == 'Eating') & evolve.Remarks.str.contains('Breakfast')].copy()
lunch_data = evolve[(evolve['Sub-Category'] == 'Eating') & evolve.Remarks.str.contains('Lunch')].copy()
dinner_data = evolve[(evolve['Sub-Category'] == 'Eating') & evolve.Remarks.str.contains('Dinner')].copy()

# Compute time
bf_data['time'] = bf_data['Time Start'].dt.time
lunch_data['time'] = lunch_data['Time Start'].dt.time
dinner_data['time'] = dinner_data['Time Start'].dt.time

# Remove outlier
lunch_data.drop(420, axis = 0, inplace = True)

# Get mean breakfast time
bf_times = pd.to_datetime(bf_data['Time Start'])
# pd.to_timedelta(int((bf_times.dt.hour*3600+bf_times.dt.minute*60+bf_times.dt.second).mean()),unit='s')

# Get mean lunch time
lunch_times = pd.to_datetime(lunch_data['Time Start'])
# pd.to_timedelta(int((lunch_times.dt.hour*3600+lunch_times.dt.minute*60+lunch_times.dt.second).mean()),unit='s')

# Get mean dinner time
dinner_times = pd.to_datetime(dinner_data['Time Start'])
# pd.to_timedelta(int((dinner_times.dt.hour*3600+dinner_times.dt.minute*60+dinner_times.dt.second).mean()),unit='s')

Next, we look at exercise. Prior to starting the Evolve regime, I didn’t spend any time on exercising. As I tracked my time, I noticed the lack of any effort in investing in health (and also, my body decided that tight-fit clothing was in fashion). Hence, I resolved to spend some time every day exercising. It could be 10 minutes of push ups or a 20-minute run - it didn’t matter how long, as long as I was active for a while. As you can see, I’m still working on that.

A Final Note on the Data

The data contained all my activities from 9 Oct 18 to 11 Nov 18, which was about a month’s worth of data. That means that the recommendations from the simple analysis in this post may not be well-grounded because there was insufficient data. However, it shows the potential of activity and finance tracking to help you optimise your life and gain awareness of how you’re spending your time and money. Personally, I feel motivated from both achieving things I want (more exercise, personal development) and knowing where I can improve (exercise, idle time).

Moving Forward

I plan to stay on this regime for 1 year. Hopefully, I will have good things to write about in my personal review next December. I also plan to release the Evolve app for free to enable anyone who wants a go at tackling procrastination in their lives to take the first step toward evolution. Stay tuned for more updates.

Click here for the full Jupyter notebook.

Credits for images: Family Radio