datalife-2019/notebook.ipynb

585 lines
29 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Common functions"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def only2019(df):\n",
" return df.filter(like='2019', axis=0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Taskwarrior"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"from tasklib import TaskWarrior\n",
"import datetime\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"Year Month Added Completed Deleted Net\n",
"---- --------- ----- --------- ------- ---\n",
"2019 January 18 19 0 -1\n",
" February 9 7 0 2\n",
" March 27 23 0 4\n",
" April 13 14 3 -4\n",
" May 10 9 0 1\n",
" June 17 13 0 4\n",
" July 17 17 0 0\n",
" August 35 37 0 -2\n",
" September 22 24 1 -3\n",
" October 19 15 2 2\n",
" November 17 16 0 1\n",
" December 37 42 1 -6\n",
" \n",
" Total 241 236 7 5 "
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"description 241\n",
"due 107\n",
"end 241\n",
"id 241\n",
"imask 0\n",
"mask 0\n",
"modified 241\n",
"priority 3\n",
"project 188\n",
"recur 0\n",
"status 241\n",
"tags 215\n",
"until 0\n",
"urgency 241\n",
"dtype: int64"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with open('data/task.json', 'r') as myfile:\n",
" task = json.load(myfile)\n",
"\n",
"# Convert the data into a data frame\n",
"# Some preliminary analysis\n",
"tasks = pd.DataFrame.from_dict(task)\n",
"tasks.set_axis(tasks['entry'], axis='index', inplace=True)\n",
"tasks = tasks.drop(['annotations', 'depends', 'parent', 'uuid', 'entry'], axis=1)\n",
"only2019(tasks).count()"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"16 unique tags\n",
"215 tagged items\n",
"The tags are: {'rocks', 'friends', 'd.tech', 'chores', 'job', 'prpj', 'fam', 'artifex', 'contact', 'd.infra', 'fun', 'piracy', 'work', 'uni', 'life', 'travel'}\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1008x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# How many of each tag did I do?\n",
"\n",
"l = only2019(tasks).tags.dropna().to_list()\n",
"flat_list = [item for sublist in l for item in sublist]\n",
"print(str(len(set(flat_list))) + \" unique tags\")\n",
"print(str(len(l)) + \" tagged items\")\n",
"print(\"The tags are: \" + str(set(flat_list)))\n",
"\n",
"fig = plt.figure(figsize=(14,8))\n",
"plt.hist(flat_list, rwidth=1/3, align='left', bins=16)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 241\n",
"unique 216\n",
"top fold clothes\n",
"freq 7\n",
"Name: description, dtype: object\n",
"\n",
"Repeated descriptions: \n",
" laundry\n",
" haircut\n",
" fold clothes\n",
" recharge my way\n",
" change sheets\n",
" cut hair\n",
" buy condoms\n",
" schedule counsellor meeting\n",
" cut nails\n",
" recharge myway\n",
" book counsellor meeting\n",
" shave\n",
" do laundry\n"
]
}
],
"source": [
"# Description mining\n",
"\n",
"l = only2019(tasks).description\n",
"print(l.describe())\n",
"print()\n",
"print(\"Repeated descriptions: \")\n",
"for e in l[l.duplicated(keep=False)].unique():\n",
" print(\" \" + e)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Habits"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import calendar\n",
"import matplotlib \n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 183,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Days done: Meditate 64\n",
"Exercise 65\n",
"Read 69\n",
"Journal 49\n",
"devlog 32\n",
"Plants 38\n",
"Draw 12\n",
"dtype: int64\n",
"Non-streak days: Meditate 176\n",
"Exercise 179\n",
"Read 161\n",
"Journal 70\n",
"devlog 154\n",
"Plants 120\n",
"Draw 252\n",
"dtype: int64\n",
"Streak days: Meditate 35\n",
"Exercise 31\n",
"Read 45\n",
"Journal 156\n",
"devlog 89\n",
"Plants 117\n",
"Draw 11\n",
"dtype: int64\n",
"Longest streak: Meditate 17\n",
"Exercise 11\n",
"Read 12\n",
"Journal 55\n",
"devlog 29\n",
"Plants 87\n",
"Draw 17\n",
"dtype: int64\n",
"Longest zeros: Meditate 23\n",
"Exercise 26\n",
"Read 43\n",
"Journal 27\n",
"devlog 121\n",
"Plants 54\n",
"Draw 229\n",
"dtype: int64\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Meditate</th>\n",
" <th>Exercise</th>\n",
" <th>Read</th>\n",
" <th>Journal</th>\n",
" <th>devlog</th>\n",
" <th>Plants</th>\n",
" <th>Draw</th>\n",
" </tr>\n",
" <tr>\n",
" <th>month</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.133333</td>\n",
" <td>0.266667</td>\n",
" <td>0.000000</td>\n",
" <td>0.900000</td>\n",
" <td>0.000000</td>\n",
" <td>1.133333</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.387097</td>\n",
" <td>0.193548</td>\n",
" <td>0.193548</td>\n",
" <td>0.645161</td>\n",
" <td>0.000000</td>\n",
" <td>0.516129</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.500000</td>\n",
" <td>0.266667</td>\n",
" <td>0.166667</td>\n",
" <td>0.666667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.516129</td>\n",
" <td>0.838710</td>\n",
" <td>0.967742</td>\n",
" <td>0.774194</td>\n",
" <td>0.064516</td>\n",
" <td>0.612903</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.806452</td>\n",
" <td>0.741935</td>\n",
" <td>0.935484</td>\n",
" <td>1.161290</td>\n",
" <td>1.225806</td>\n",
" <td>1.193548</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1.133333</td>\n",
" <td>0.600000</td>\n",
" <td>1.233333</td>\n",
" <td>1.300000</td>\n",
" <td>1.066667</td>\n",
" <td>1.333333</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>0.774194</td>\n",
" <td>1.064516</td>\n",
" <td>0.580645</td>\n",
" <td>0.935484</td>\n",
" <td>1.032258</td>\n",
" <td>1.193548</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0.700000</td>\n",
" <td>0.733333</td>\n",
" <td>0.800000</td>\n",
" <td>1.233333</td>\n",
" <td>1.000000</td>\n",
" <td>0.333333</td>\n",
" <td>0.533333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0.387097</td>\n",
" <td>0.548387</td>\n",
" <td>1.096774</td>\n",
" <td>0.709677</td>\n",
" <td>0.612903</td>\n",
" <td>0.000000</td>\n",
" <td>0.612903</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Meditate Exercise Read Journal devlog Plants Draw\n",
"month \n",
"4 0.133333 0.266667 0.000000 0.900000 0.000000 1.133333 0.000000\n",
"5 0.387097 0.193548 0.193548 0.645161 0.000000 0.516129 0.000000\n",
"6 0.500000 0.266667 0.166667 0.666667 0.000000 0.000000 0.000000\n",
"7 0.516129 0.838710 0.967742 0.774194 0.064516 0.612903 0.000000\n",
"8 0.806452 0.741935 0.935484 1.161290 1.225806 1.193548 0.000000\n",
"9 1.133333 0.600000 1.233333 1.300000 1.066667 1.333333 0.000000\n",
"10 0.774194 1.064516 0.580645 0.935484 1.032258 1.193548 0.000000\n",
"11 0.700000 0.733333 0.800000 1.233333 1.000000 0.333333 0.533333\n",
"12 0.387097 0.548387 1.096774 0.709677 0.612903 0.000000 0.612903"
]
},
"execution_count": 183,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#colNames = ['date', 'Godmode', 'Meditate', 'Exercise', 'Piano','Read', 'Journal', 'Gratitude', 'devlog','Plants', 'Job', 'Draw']\n",
"checks = pd.read_csv('LoopHabits/Checkmarks.csv', header=0)\n",
"checks.set_axis(checks['date'], axis='index', inplace=True)\n",
"checks = checks.drop(['Godmode', 'Piano', 'Gratitude', 'Job', 'date'], axis=1)\n",
"df = MarchOnwards(only2019(checks))\n",
"print(\"Days done: \" + str(countValue(2, df)))\n",
"print(\"Non-streak days: \" + str(countZeros(df)))\n",
"print(\"Streak days: \" + str(countValue(1, df)))\n",
"print(\"Longest streak: \" + str(df.apply(longestStreak, axis=0)))\n",
"print(\"Longest zeros: \" + str(df.apply(longestZero, axis=0)))\n",
"#print(\"Best month: \" + str(sumMonth(df)))\n",
"sumMonth(df)\n",
"meanMonth(df)\n",
"#print(\"Worst month: \" + calendar.month_name[int(sumMonth(df).idxmin())])\n",
"#plotScore(df)"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [],
"source": [
"def MarchOnwards(df):\n",
" # For habits only, lost my phone in late Febuary, didn't have a recent backup\n",
" return df.filter(regex='[0-9]{4}-(0?[4-9]|1?[0-2])-[0-9]{2}', axis=0)\n",
"\n",
"def longestZero(df):\n",
" # reverse the series so dates are ascending (increasing?)\n",
" # pad out the series with 0s, then diff it to track total, use that total to calculate highest streak\n",
" # streak increases when sum is 0\n",
" diffStreak = pd.concat([pd.Series([0]) , df[::-1], pd.Series([0])]).diff().tolist()\n",
" runningSum = 0\n",
" streak = 0\n",
" streakList = []\n",
" for e in diffStreak[1:-1]:\n",
" runningSum += e\n",
" if runningSum == 0:\n",
" streak += 1\n",
" else:\n",
" streakList.append(streak)\n",
" streak = 0\n",
" return max(streakList)\n",
"\n",
"def longestStreak(df):\n",
" # reverse the series so dates are ascending (increasing?)\n",
" # pad out the series with 0s, then diff it to track total, use that total to calculate highest streak\n",
" # streak increases when sum is non-zero\n",
" diffStreak = pd.concat([pd.Series([0]) , df[::-1], pd.Series([0])]).diff().tolist()\n",
" runningSum = 0\n",
" streak = 0\n",
" streakList = []\n",
" for e in diffStreak[1:-1]:\n",
" runningSum += e\n",
" if runningSum != 0:\n",
" streak += 1\n",
" else:\n",
" streakList.append(streak)\n",
" streak = 0\n",
" return max(streakList)\n",
"\n",
"def sumMonth(df):\n",
" df2 = df.reset_index()\n",
" df['month'] = pd.DatetimeIndex(df2['date']).month\n",
" return df.groupby(['month']).sum()\n",
"\n",
"def meanMonth(df):\n",
" df2 = df.reset_index()\n",
" df['month'] = pd.DatetimeIndex(df2['date']).month\n",
" return df.groupby(['month']).mean()\n",
"\n",
"def plotScore(df):\n",
" df = meanMonth(df)\n",
" plt.plot(df)\n",
" plt.show()\n",
"\n",
"def countZeros(df):\n",
" return countValue(0, df)\n",
"\n",
"def countValue(countValue, df):\n",
" return (df == countValue).astype(int).sum()\n"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"# checking for CSV of simply one habit\n",
"\n",
"colNames = ['date', 'value']\n",
"meditateChecks = pd.read_csv('LoopHabits/002 Meditate/Checkmarks.csv', names=colNames, header=None)\n",
"meditateScore = pd.read_csv('LoopHabits/002 Meditate/Scores.csv', names=colNames, header=None)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# might be broken now\n",
"# need to deal with dates in columns\n",
"meditateChecks.set_axis(checks['date'], axis='index', inplace=True)\n",
"df = MarchOnwards(only2019(meditateChecks))\n",
"print(\"Days done: \" + str(countValue(2, df)))\n",
"print(\"Non-streak days: \" + str(countZeros(df)))\n",
"print(\"Streak days: \" + str(countValue(1, df)))\n",
"print(\"Longest streak: \" + str(longestStreak(df)))\n",
"print(\"Longest zeros: \" + str(longestZero(df)))\n",
"print(\"Best month: \" + calendar.month_name[int(sumMonth(df).idxmax())])\n",
"print(\"Worst month: \" + calendar.month_name[int(sumMonth(df).idxmin())])\n",
"plotScore(df)"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"306\n"
]
},
{
"data": {
"text/plain": [
"299"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Total days for habits: 306\n",
"# How come when counting streaks I only get 299?\n",
"# missing 1 week??\n",
"print(72 + 195 + 39)\n",
"longestStreak(onlyMarch(only2019(meditateChecks))) + longestZero(onlyMarch(only2019(meditateChecks)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Why don't the above two numbers match??"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}