Skip to content

Instantly share code, notes, and snippets.

@baldwint
Last active August 28, 2015 19:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save baldwint/1539142569af6a527725 to your computer and use it in GitHub Desktop.
Save baldwint/1539142569af6a527725 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The 12 Body Problem (simulation)\n",
"\n",
"UO Physics runs the 2015 Hood to Coast relay!\n",
"\n",
"![team logo](http://pages.uoregon.edu/tbaldwin/lo.png)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"197.52 miles\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"seq = ['kyle', 'peter', 'caleb', 'matt', 'tyler', 'dileep',\n",
" 'tom', 'wes', 'adam', 'andrea', 'mike', 'liza']\n",
"\n",
"legs = [5.44, 6.07, 3.75, 7.18, 6.05, 6.85, 5.40, 6.00, 5.46, 5.54, 4.51, 6.40,\n",
" 4.14, 6.04, 7.25, 3.78, 7.51, 5.23, 5.89, 5.75, 5.06, 6.70, 4.23, 4.87,\n",
" 3.80, 5.65, 6.10, 4.09, 5.97, 5.32, 3.96, 4.20, 7.72, 3.48, 6.94, 5.19]\n",
"\n",
"ix = pd.MultiIndex.from_product((range(3), seq))\n",
"dists = pd.Series(legs, index=ix)\n",
"\n",
"print(dists.sum(), 'miles')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Distances\n",
"\n",
"in miles:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>kyle</th>\n",
" <td>5.44</td>\n",
" <td>4.14</td>\n",
" <td>3.80</td>\n",
" <td>13.38</td>\n",
" </tr>\n",
" <tr>\n",
" <th>peter</th>\n",
" <td>6.07</td>\n",
" <td>6.04</td>\n",
" <td>5.65</td>\n",
" <td>17.76</td>\n",
" </tr>\n",
" <tr>\n",
" <th>caleb</th>\n",
" <td>3.75</td>\n",
" <td>7.25</td>\n",
" <td>6.10</td>\n",
" <td>17.10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>matt</th>\n",
" <td>7.18</td>\n",
" <td>3.78</td>\n",
" <td>4.09</td>\n",
" <td>15.05</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tyler</th>\n",
" <td>6.05</td>\n",
" <td>7.51</td>\n",
" <td>5.97</td>\n",
" <td>19.53</td>\n",
" </tr>\n",
" <tr>\n",
" <th>dileep</th>\n",
" <td>6.85</td>\n",
" <td>5.23</td>\n",
" <td>5.32</td>\n",
" <td>17.40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tom</th>\n",
" <td>5.40</td>\n",
" <td>5.89</td>\n",
" <td>3.96</td>\n",
" <td>15.25</td>\n",
" </tr>\n",
" <tr>\n",
" <th>wes</th>\n",
" <td>6.00</td>\n",
" <td>5.75</td>\n",
" <td>4.20</td>\n",
" <td>15.95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>adam</th>\n",
" <td>5.46</td>\n",
" <td>5.06</td>\n",
" <td>7.72</td>\n",
" <td>18.24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>andrea</th>\n",
" <td>5.54</td>\n",
" <td>6.70</td>\n",
" <td>3.48</td>\n",
" <td>15.72</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mike</th>\n",
" <td>4.51</td>\n",
" <td>4.23</td>\n",
" <td>6.94</td>\n",
" <td>15.68</td>\n",
" </tr>\n",
" <tr>\n",
" <th>liza</th>\n",
" <td>6.40</td>\n",
" <td>4.87</td>\n",
" <td>5.19</td>\n",
" <td>16.46</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2 total\n",
"kyle 5.44 4.14 3.80 13.38\n",
"peter 6.07 6.04 5.65 17.76\n",
"caleb 3.75 7.25 6.10 17.10\n",
"matt 7.18 3.78 4.09 15.05\n",
"tyler 6.05 7.51 5.97 19.53\n",
"dileep 6.85 5.23 5.32 17.40\n",
"tom 5.40 5.89 3.96 15.25\n",
"wes 6.00 5.75 4.20 15.95\n",
"adam 5.46 5.06 7.72 18.24\n",
"andrea 5.54 6.70 3.48 15.72\n",
"mike 4.51 4.23 6.94 15.68\n",
"liza 6.40 4.87 5.19 16.46"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mileage = dists.unstack(level=0).reindex(seq)\n",
"mileage['total'] = dists.groupby(level=1).sum()\n",
"mileage"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Estimated pace\n",
"\n",
"per teammate, in minutes per mile:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"adam 00:07:00\n",
"andrea 00:09:30\n",
"caleb 00:07:00\n",
"dileep 00:08:00\n",
"kyle 00:07:15\n",
"liza 00:10:00\n",
"matt 00:08:00\n",
"mike 00:08:30\n",
"peter 00:08:30\n",
"roger 00:08:00\n",
"tom 00:09:00\n",
"tyler 00:07:00\n",
"wes 00:07:00\n",
"dtype: timedelta64[ns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"paces = {'peter': 8.5,\n",
" 'tyler': 7,\n",
" 'adam': 7,\n",
" 'wes': 7,\n",
" 'tom': 9,\n",
" 'liza': 10,\n",
" 'andrea': 9.5,\n",
" 'roger': 8,\n",
" 'dileep': 8,\n",
" 'mike': 8.5,\n",
" 'caleb': 7,\n",
" 'kyle': 7.25,\n",
" 'matt': 8,\n",
" }\n",
"paces = pd.Series(paces) * pd.Timedelta('1 minute',dtype='timedelta64[s]')\n",
"paces"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Estimated race duration\n",
"\n",
"Based on pacing estimates we gave during registration, we are forecast to complete the course in approximately 26 hours."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Timedelta('1 days 02:27:46.499999')"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"splits = dists.multiply(paces, level=1)\n",
"splits.sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Estimated splits\n",
"\n",
"Forecasted moving times per leg:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>kyle</th>\n",
" <td>00:39:26.400000</td>\n",
" <td>00:30:00.899999</td>\n",
" <td>00:27:33</td>\n",
" </tr>\n",
" <tr>\n",
" <th>peter</th>\n",
" <td>00:51:35.700000</td>\n",
" <td>00:51:20.400000</td>\n",
" <td>00:48:01.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>caleb</th>\n",
" <td>00:26:15</td>\n",
" <td>00:50:45</td>\n",
" <td>00:42:42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>matt</th>\n",
" <td>00:57:26.400000</td>\n",
" <td>00:30:14.400000</td>\n",
" <td>00:32:43.200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tyler</th>\n",
" <td>00:42:21</td>\n",
" <td>00:52:34.200000</td>\n",
" <td>00:41:47.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>dileep</th>\n",
" <td>00:54:48</td>\n",
" <td>00:41:50.400000</td>\n",
" <td>00:42:33.600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tom</th>\n",
" <td>00:48:36</td>\n",
" <td>00:53:00.600000</td>\n",
" <td>00:35:38.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>wes</th>\n",
" <td>00:42:00</td>\n",
" <td>00:40:15</td>\n",
" <td>00:29:24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>adam</th>\n",
" <td>00:38:13.200000</td>\n",
" <td>00:35:25.199999</td>\n",
" <td>00:54:02.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>andrea</th>\n",
" <td>00:52:37.800000</td>\n",
" <td>01:03:39</td>\n",
" <td>00:33:03.600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mike</th>\n",
" <td>00:38:20.100000</td>\n",
" <td>00:35:57.300000</td>\n",
" <td>00:58:59.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>liza</th>\n",
" <td>01:04:00</td>\n",
" <td>00:48:42</td>\n",
" <td>00:51:54</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"kyle 00:39:26.400000 00:30:00.899999 00:27:33\n",
"peter 00:51:35.700000 00:51:20.400000 00:48:01.500000\n",
"caleb 00:26:15 00:50:45 00:42:42\n",
"matt 00:57:26.400000 00:30:14.400000 00:32:43.200000\n",
"tyler 00:42:21 00:52:34.200000 00:41:47.400000\n",
"dileep 00:54:48 00:41:50.400000 00:42:33.600000\n",
"tom 00:48:36 00:53:00.600000 00:35:38.400000\n",
"wes 00:42:00 00:40:15 00:29:24\n",
"adam 00:38:13.200000 00:35:25.199999 00:54:02.400000\n",
"andrea 00:52:37.800000 01:03:39 00:33:03.600000\n",
"mike 00:38:20.100000 00:35:57.300000 00:58:59.400000\n",
"liza 01:04:00 00:48:42 00:51:54"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"splits.unstack(level=0).reindex(seq)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our start time is 4:15pm (final wave)."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"START = pd.Timestamp('2015-08-28 16:15:00')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Approximate schedule\n",
"\n",
"The time at which each runner is forecast to begin each leg:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>kyle</th>\n",
" <td>Fri 04:15:00 PM</td>\n",
" <td>Sat 01:30:39 AM</td>\n",
" <td>Sat 10:24:23 AM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>peter</th>\n",
" <td>Fri 04:54:26 PM</td>\n",
" <td>Sat 02:00:40 AM</td>\n",
" <td>Sat 10:51:56 AM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>caleb</th>\n",
" <td>Fri 05:46:02 PM</td>\n",
" <td>Sat 02:52:00 AM</td>\n",
" <td>Sat 11:39:58 AM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>matt</th>\n",
" <td>Fri 06:12:17 PM</td>\n",
" <td>Sat 03:42:45 AM</td>\n",
" <td>Sat 12:22:40 PM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tyler</th>\n",
" <td>Fri 07:09:43 PM</td>\n",
" <td>Sat 04:13:00 AM</td>\n",
" <td>Sat 12:55:23 PM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>dileep</th>\n",
" <td>Fri 07:52:04 PM</td>\n",
" <td>Sat 05:05:34 AM</td>\n",
" <td>Sat 01:37:11 PM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tom</th>\n",
" <td>Fri 08:46:52 PM</td>\n",
" <td>Sat 05:47:24 AM</td>\n",
" <td>Sat 02:19:44 PM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>wes</th>\n",
" <td>Fri 09:35:28 PM</td>\n",
" <td>Sat 06:40:25 AM</td>\n",
" <td>Sat 02:55:23 PM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>adam</th>\n",
" <td>Fri 10:17:28 PM</td>\n",
" <td>Sat 07:20:40 AM</td>\n",
" <td>Sat 03:24:47 PM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>andrea</th>\n",
" <td>Fri 10:55:41 PM</td>\n",
" <td>Sat 07:56:05 AM</td>\n",
" <td>Sat 04:18:49 PM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mike</th>\n",
" <td>Fri 11:48:19 PM</td>\n",
" <td>Sat 08:59:44 AM</td>\n",
" <td>Sat 04:51:53 PM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>liza</th>\n",
" <td>Sat 12:26:39 AM</td>\n",
" <td>Sat 09:35:41 AM</td>\n",
" <td>Sat 05:50:52 PM</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"kyle Fri 04:15:00 PM Sat 01:30:39 AM Sat 10:24:23 AM\n",
"peter Fri 04:54:26 PM Sat 02:00:40 AM Sat 10:51:56 AM\n",
"caleb Fri 05:46:02 PM Sat 02:52:00 AM Sat 11:39:58 AM\n",
"matt Fri 06:12:17 PM Sat 03:42:45 AM Sat 12:22:40 PM\n",
"tyler Fri 07:09:43 PM Sat 04:13:00 AM Sat 12:55:23 PM\n",
"dileep Fri 07:52:04 PM Sat 05:05:34 AM Sat 01:37:11 PM\n",
"tom Fri 08:46:52 PM Sat 05:47:24 AM Sat 02:19:44 PM\n",
"wes Fri 09:35:28 PM Sat 06:40:25 AM Sat 02:55:23 PM\n",
"adam Fri 10:17:28 PM Sat 07:20:40 AM Sat 03:24:47 PM\n",
"andrea Fri 10:55:41 PM Sat 07:56:05 AM Sat 04:18:49 PM\n",
"mike Fri 11:48:19 PM Sat 08:59:44 AM Sat 04:51:53 PM\n",
"liza Sat 12:26:39 AM Sat 09:35:41 AM Sat 05:50:52 PM"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def fmt(dt):\n",
" return dt.strftime('%a %I:%M:%S %p')\n",
"\n",
"starts = START + splits.cumsum() - splits\n",
"starts.apply(fmt).unstack(level=0).reindex(seq)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Estimated finish time\n",
"\n",
"The time at which the entire race is forecast to be completed:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'Sat 06:42:46 PM'"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"finish = START + splits.sum()\n",
"fmt(finish)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment