Skip to content

Instantly share code, notes, and snippets.

@invisiblefunnel
Created March 24, 2018 06:33
Show Gist options
  • Save invisiblefunnel/194afdafd72a387f5622950d206e124b to your computer and use it in GitHub Desktop.
Save invisiblefunnel/194afdafd72a387f5622950d206e124b to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from functools import lru_cache\n",
"import os\n",
"import sys;sys.path.append('..')\n",
"from timeit import default_timer as timer\n",
"from zipfile import ZipFile\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import partridge as ptg"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"feeds = [\n",
" 'LA-Metro-2017-10-24.zip',\n",
" 'Greater-Sydney-2017-06-13.zip',\n",
" 'NJ-Transit-Bus-2017-11-24.zip',\n",
" 'OpenData_TTC_Schedules.zip',\n",
" 'TfNSW-2017-11-02.zip',\n",
" 'SFMTA-2017-10-26.zip',\n",
" 'AC-Transit-2018-03-13.zip',\n",
"]\n",
"\n",
"I = 3\n",
"N = 20\n",
"\n",
"results = {\n",
" 'fname': [], 'maxsize': [], 'time': [],\n",
" 'hits': [], 'misses': [], 'file_size': [],\n",
" 'compress_size': [],\n",
"}\n",
"\n",
"for fname in feeds:\n",
" with ZipFile(fname) as zipreader:\n",
" for entry in zipreader.filelist:\n",
" if entry.filename == 'stop_times.txt':\n",
" compress_size = entry.compress_size\n",
" file_size = entry.file_size\n",
" break\n",
"\n",
" feed = ptg.raw_feed(fname)\n",
" arrivals = feed.stop_times.arrival_time.values\n",
" departures = feed.stop_times.departure_time.values\n",
"\n",
" vparse_time = np.vectorize(ptg.parsers.parse_time)\n",
" measures = np.zeros(I)\n",
" for i in range(I):\n",
" start = timer()\n",
" _ = vparse_time(arrivals)\n",
" _ = vparse_time(departures)\n",
" end = timer()\n",
" measures[i] = end - start\n",
"\n",
" results['fname'].append(fname) \n",
" results['maxsize'].append(0)\n",
" results['time'].append(np.mean(measures))\n",
" results['compress_size'].append(compress_size)\n",
" results['file_size'].append(file_size)\n",
" results['hits'].append(0.)\n",
" results['misses'].append(arrivals.shape[0] + departures.shape[0])\n",
"\n",
" for n in range(1, N):\n",
" maxsize = 2**n\n",
" parse_time = lru_cache(maxsize=maxsize)(ptg.parsers.parse_time)\n",
" vparse_time = np.vectorize(parse_time)\n",
"\n",
" measures = np.zeros(I)\n",
" for i in range(I):\n",
" start = timer()\n",
" _ = vparse_time(arrivals)\n",
" _ = vparse_time(departures)\n",
" end = timer()\n",
" measures[i] = end - start\n",
"\n",
" cache_info = parse_time.cache_info()\n",
" time = np.mean(measures)\n",
"\n",
" results['fname'].append(fname) \n",
" results['maxsize'].append(maxsize)\n",
" results['time'].append(time)\n",
" results['compress_size'].append(compress_size)\n",
" results['file_size'].append(file_size)\n",
" results['hits'].append(cache_info.hits)\n",
" results['misses'].append(cache_info.misses)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"df = pd.DataFrame(results)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [
{
"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 tr th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe thead tr:last-of-type th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr>\n",
" <th></th>\n",
" <th colspan=\"2\" halign=\"left\">time</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th>amax</th>\n",
" <th>amin</th>\n",
" </tr>\n",
" <tr>\n",
" <th>fname</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>AC-Transit-2018-03-13.zip</th>\n",
" <td>0.702396</td>\n",
" <td>0.186621</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Greater-Sydney-2017-06-13.zip</th>\n",
" <td>16.903961</td>\n",
" <td>1.698864</td>\n",
" </tr>\n",
" <tr>\n",
" <th>LA-Metro-2017-10-24.zip</th>\n",
" <td>7.761545</td>\n",
" <td>0.559866</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NJ-Transit-Bus-2017-11-24.zip</th>\n",
" <td>34.784890</td>\n",
" <td>3.377826</td>\n",
" </tr>\n",
" <tr>\n",
" <th>OpenData_TTC_Schedules.zip</th>\n",
" <td>29.377328</td>\n",
" <td>6.825932</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SFMTA-2017-10-26.zip</th>\n",
" <td>4.727642</td>\n",
" <td>1.168198</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TfNSW-2017-11-02.zip</th>\n",
" <td>19.800654</td>\n",
" <td>1.993504</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" time \n",
" amax amin\n",
"fname \n",
"AC-Transit-2018-03-13.zip 0.702396 0.186621\n",
"Greater-Sydney-2017-06-13.zip 16.903961 1.698864\n",
"LA-Metro-2017-10-24.zip 7.761545 0.559866\n",
"NJ-Transit-Bus-2017-11-24.zip 34.784890 3.377826\n",
"OpenData_TTC_Schedules.zip 29.377328 6.825932\n",
"SFMTA-2017-10-26.zip 4.727642 1.168198\n",
"TfNSW-2017-11-02.zip 19.800654 1.993504"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.groupby('fname').agg({'time': [np.max, np.min]})"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x17b99f1d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"stack_order = df.sort_values('time', ascending=False).fname.unique()\n",
"\n",
"ax = (df.pivot(index='maxsize', columns='fname', values='time')\n",
" .loc[:,stack_order]\n",
" .plot\n",
" .bar(stacked=True, figsize=(10,8), cmap='Set3'))\n",
"\n",
"ax.set(ylabel='time');"
]
}
],
"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.6.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment