Skip to content

Instantly share code, notes, and snippets.

@anixdorf
Last active June 21, 2017 21:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save anixdorf/9769238 to your computer and use it in GitHub Desktop.
Save anixdorf/9769238 to your computer and use it in GitHub Desktop.
Personal IPython Weight Notebook (http://nbviewer.ipython.org/gist/anixdorf/9769238)
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:4950569d445f0f9ebaf32942a2f920ba64ef089aad26a0fdff3ab36365376682"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Init"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline\n",
"pylab.rcParams['figure.figsize'] = 12, 8"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"WARNING: pylab import has clobbered these variables: ['diff']\n",
"`%matplotlib` prevents importing * from pylab and numpy\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import datetime\n",
"from itertools import chain\n",
"\n",
"import matplotlib.dates as mdates\n",
"\n",
"from IPython.display import HTML, Image, YouTubeVideo"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Formulas"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def bmi2weight(height, heightUnit, bmi, weightUnit):\n",
" if heightUnit == \"ft\":\n",
" height *= 0.3048\n",
" weightInKg = bmi * height**2\n",
" if weightUnit == \"lbs\":\n",
" weightInKg *= 2.20462262\n",
" return weightInKg"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Data"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"series = \"\"\"\n",
"2014-05-01 110.1\n",
"2014-05-07 108.0\n",
"2014-05-20 102.9\n",
"2014-06-12 101.2\n",
"\"\"\"\n",
"dateFormat = \"%Y-%m-%d\"\n",
"weightUnit = \"Kg\" # lbs\n",
"\n",
"# bmi parameter\n",
"height = 1.78\n",
"heightUnit = \"m\" # ft\n",
"\n",
"# plot\n",
"minY = 80.0\n",
"maxY = 130.0\n",
"\n",
"# fit\n",
"future = 14 # days\n",
"goals = [95, 92, 87] # enter your goals\n",
"#goals = [b2w(25)]\n",
"\n",
"# motivation\n",
"starEvery = 5\n",
"video = True"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Prepare data for plotting"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"raw = (line.rstrip().split(\" \") for line in iter(series.splitlines()) if len(line.rstrip()) > 0)\n",
"interpreted = [(datetime.datetime.strptime(k, dateFormat), float(v)) for k, v in raw]\n",
"xData, yData = list(zip(*interpreted))\n",
"xFuture = tuple(xData[-1] + datetime.timedelta(days=i) for i in range(future))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 14
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Statistics"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"s = []\n",
"w = s.append\n",
"\n",
"diff = 0\n",
"\n",
"if len(yData) > 1:\n",
" days = str(xData[-1] - xData[0])[:-9]\n",
" weeks = float(days[:-5]) / float(7)\n",
" w(\"Data recorded for <strong>{} ({:.0f} weeks)</strong><br />\".format(days, weeks)) \n",
" diff = yData[-1] - yData[-2]\n",
" diffStart = yData[-1] - yData[0]\n",
" diffPerWeek = diffStart / weeks\n",
" w(\"Last difference: <strong>{} {}</strong><br />\"\n",
" \"Total loss: <strong>{} {}</strong><br />\"\n",
" \"Loss per Week: <strong>{} {}</strong><br />\".format(round(diff, 2), weightUnit, \n",
" round(diffStart, 2), weightUnit,\n",
" round(diffPerWeek, 2), weightUnit))\n",
" \n",
" w( \"Stars ({} {} each):\".format(starEvery, weightUnit))\n",
" w(\"<table><tr>\")\n",
" for i in range(abs(int(diffStart / starEvery))):\n",
" w(\"<td>\")\n",
" w(\"<img src=\\\"https://openclipart.org/people/Rocket000/Rocket000_emblem-star.svg\\\" width=\\\"50px\\\"></img>\") \n",
" w(\"</td>\")\n",
" w(\"</tr></table>\")\n",
"else:\n",
" w(\"Not enough data!\")\n",
" \n",
"h = HTML(\"\\n\".join(str(e) for e in s)); h"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"Data recorded for <strong>42 days (6 weeks)</strong><br />\n",
"Last difference: <strong>-1.7 Kg</strong><br />Total loss: <strong>-8.9 Kg</strong><br />Loss per Week: <strong>-1.48 Kg</strong><br />\n",
"Stars (5 Kg each):\n",
"<table><tr>\n",
"<td>\n",
"<img src=\"https://openclipart.org/people/Rocket000/Rocket000_emblem-star.svg\" width=\"50px\"></img>\n",
"</td>\n",
"</tr></table>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 15,
"text": [
"<IPython.core.display.HTML at 0x7f0298e5b9b0>"
]
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vid = '-0tp3n4opRI' if diff < 0 else \"VlZRLkPXQqQ\"\n",
"v = None\n",
"if video:\n",
" v = YouTubeVideo(vid, autoplay=1, theme=\"light\") \n",
"v"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
" <iframe\n",
" width=\"400\"\n",
" height=300\"\n",
" src=\"https://www.youtube.com/embed/-0tp3n4opRI?theme=light&autoplay=1\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 16,
"text": [
"<IPython.lib.display.YouTubeVideo at 0x7f027e6b9160>"
]
}
],
"prompt_number": 16
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Plot data"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# errorbars for differences between measurements\n",
"yerr = list(chain([0],[(lambda v: 0 if v > 0 else v)(x - yData[i - 1]) for i, x in enumerate(yData) if i > 0]))\n",
"errorbar(xData, yData, yerr = yerr, fmt = 'o-', label = \"\")\n",
"\n",
"# prepare fit\n",
"fit_x = mdates.date2num(xData)\n",
"fit = polyfit(fit_x, yData, 1)\n",
"fit_color = \"red\" if fit[0] > 0 else \"green\"\n",
"fit_fn = poly1d(fit)\n",
"\n",
"# draw fit\n",
"fit_x_future = np.append(fit_x, mdates.date2num(xFuture))\n",
"plot(fit_x_future, fit_fn(fit_x_future), '--k', color = fit_color, label = \"\")\n",
"ylabel(\"Weight [1/{}]\".format(weightUnit))\n",
"xlabel(\"Time\")\n",
"ylim(ymin=minY, ymax=maxY);\n",
"\n",
"# draw bmi limits\n",
"b2w = lambda bmi: bmi2weight(height, heightUnit, bmi, weightUnit)\n",
" \n",
"axhline(color='green', y = b2w(25.0)) # limit normal\n",
"axhline(color='yellow', y = b2w(30.0)) # limit preadipositas\n",
"axhline(color='orange', y = b2w(35.0)) # limit adipositas_I\n",
"axhline(color='red', y = b2w(40.0)) # limit adipositas_II\n",
"\n",
"gcf().autofmt_xdate()\n",
"grid()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n285ouPubkp7K3HdF3+xnSdrp0dne31fUp/crM3tD0Z8cq9u+nkca1Y+RaXiWObnK3ZsyH8k1gLZ9\neW0FK4sAABFgSURBVGTae9kzxGTae82ZmllRZtfDkh5p894dp2idXCk6GXO5pG+Z2bskXaFo/dzm\nEy93ZGb4Brh7Q+bfpF/K5ND8fiXTgMg1rOKkB9CWmc1XtBD3rxV9s95pZpb5Ru3N9xVdf/3B5n84\nd28ys8sU/RAocveqpL6GfGNmCyS9U1GmayU1Zt74TWTac5n36g2Sqs3sMm+zjBe59oxFJ64tkvQJ\nd19v0VndjRKZ9pSZnSzpUXdv+X/f/BiZ9oyZFUu6UtH6uL9p8x6tyzzeXJQMk1Tb5rHbM4+dJ+kZ\nd/9C29fNZN8vi5FMpke7+2OK/upBpgGZWXHbYpdcw8iLGWgzm2xmv1C05uAQSV+WdJrUaTP6JEn3\nmVmZmf3WzI5w93p3/6u7V2V68vLia0uSmV2vqNF/f0n/LunjUssPx+yeRTLtBjObbma/lXS1ol6x\nUc2/kXfyFHLtvrmK/t9/NrPd1MlxZLoPZjbGzO6QtELRBQ6kqOWiM2TaDWb2EUUnVn1J0qjMvr1y\nafNLyjmSlmSOOTWz7zZJV7r7dZn9RernzGyoop7au81sv+Zf9toeQ6a5M7MrzGyVJLl7Q0f/f8m1\nd/JlBvogSc+6+8WSZGb/ow5+eLYppi+Q9G5FvwAscffnso7rt39WlFq+oRcr+qE4391fMbMzJC00\ns9fd/X8VZddIpjk7StJT7n6DJJlZlZkd4+5PtpnN472agzYzzW8q6r39hJmd6e5/NLNB7r5HItMc\nTVT0C94NklaZ2X+5+8ttZ/UlMu2uzJ+vfylppKKcLlR0QYkfq4OZODMbr+gS59PM7LuK/vL3hKTd\nmZn/AYri7++5mrvvMrNnJQ1UNHn2jyLTXsn89ehsSePM7Gvufo2i/9vt6ipy7bnECmgzO1dStbu/\n6O6Vkioz+z+haCZqi5m9pqiwbmwzw1ci6W1F/XuL2vwpwtr8MOiXLFp6Zk3mt8o9ZnaoohMAfijp\nUUnjJX3IzH7v7rvJtHuac5Ukd/+NpN9k9o9VtE7u/pnHvM1zTOTaKYtai9Zm3q/N35jfIWm1ov7b\nqyX9UVJ95njeq/tgZu+WtNHd/+TuL5rZNnd/1cx+oGiVjbnK+gHK+7RrFl2ZscHd683sOnd/IbN/\n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\n",
"text": [
"<matplotlib.figure.Figure at 0x7f027e5d0940>"
]
}
],
"prompt_number": 17
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Prognosis"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fit_fn = poly1d(polyfit(yData, fit_x, 1)) \n",
"\n",
"s = []\n",
"w = s.append\n",
"w(\"<table>\")\n",
"w(\"<tr>\")\n",
"w(\"<th>Goal</th>\")\n",
"w(\"<th>Prognosis</th>\")\n",
"w(\"</tr>\")\n",
"\n",
"for goal in goals:\n",
" w(\"<tr>\")\n",
" w(\"<td>\")\n",
" w(goal)\n",
" w(\"</td>\")\n",
" w(\"<td>\")\n",
" target = mdates.num2date(fit_fn(goal))\n",
" td = datetime.datetime.today()\n",
" if datetime.datetime(td.year, td.month, td.day) <= datetime.datetime(target.year, target.month, target.day):\n",
" w(\"<font color=\\\"purple\\\">\")\n",
" w(str(target)[:10])\n",
" w(\"</font>\")\n",
" else:\n",
" w(\"<font color=\\\"green\\\">\")\n",
" w(str(target)[:10])\n",
" w(\"</font>\")\n",
" w(\"</td>\")\n",
" w(\"</tr>\")\n",
"\n",
"w(\"</table>\")\n",
"h = HTML(\"\\n\".join(str(e) for e in s)); h\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<table>\n",
"<tr>\n",
"<th>Goal</th>\n",
"<th>Prognosis</th>\n",
"</tr>\n",
"<tr>\n",
"<td>\n",
"95\n",
"</td>\n",
"<td>\n",
"<font color=\"green\">\n",
"2014-06-30\n",
"</font>\n",
"</td>\n",
"</tr>\n",
"<tr>\n",
"<td>\n",
"92\n",
"</td>\n",
"<td>\n",
"<font color=\"green\">\n",
"2014-07-12\n",
"</font>\n",
"</td>\n",
"</tr>\n",
"<tr>\n",
"<td>\n",
"87\n",
"</td>\n",
"<td>\n",
"<font color=\"green\">\n",
"2014-08-02\n",
"</font>\n",
"</td>\n",
"</tr>\n",
"</table>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 18,
"text": [
"<IPython.core.display.HTML at 0x7f027e617748>"
]
}
],
"prompt_number": 18
}
],
"metadata": {}
}
]
}
@mnkygrl
Copy link

mnkygrl commented Jun 21, 2017

This is great! Thanks for this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment