Skip to content

Instantly share code, notes, and snippets.

@emptyr1
Created December 2, 2014 01:21
Show Gist options
  • Save emptyr1/e550fe5b19952e0380f9 to your computer and use it in GitHub Desktop.
Save emptyr1/e550fe5b19952e0380f9 to your computer and use it in GitHub Desktop.
Lesson3_Wrangling
{
"metadata": {
"name": "",
"signature": "sha256:5e1095c7a3d068a2bd6e745cbac8dfb813c938d75a2114645112865c207be9dd"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"print 'Welcome to a tutorial on Data Analysis with Pandas'\n",
"print 'You can run any cell by pressing shift + enter command from your keyboard'"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Welcome to a tutorial on Data Analysis with Pandas\n",
"You can run any cell by pressing shift + enter command from your keyboard\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import pandas\n",
"import matplotlib.pyplot as plt\n",
"\n",
"def entries_histogram(turnstile_weather):\n",
" '''\n",
" Before we perform any analysis, it might be useful to take a\n",
" look at the data we're hoping to analyze. More specifically, let's \n",
" examine the hourly entries in our NYC subway data and determine what\n",
" distribution the data follows. This data is stored in a dataframe\n",
" called turnstile_weather under the ['ENTRIESn_hourly'] column.\n",
" \n",
" Let's plot two histograms on the same axes to show hourly\n",
" entries when raining vs. when not raining. Here's an example on how\n",
" to plot histograms with pandas and matplotlib:\n",
" turnstile_weather['column_to_graph'].hist()\n",
" \n",
" Your histograph may look similar to bar graph in the instructor notes below.\n",
" \n",
" You can read a bit about using matplotlib and pandas to plot histograms here:\n",
" http://pandas.pydata.org/pandas-docs/stable/visualization.html#histograms\n",
" \n",
" You can see the information contained within the turnstile weather data here:\n",
" https://www.dropbox.com/s/meyki2wl9xfa7yk/turnstile_data_master_with_weather.csv\n",
" '''\n",
" turnstile_weather = pandas.read_csv(turnstile_weather)\n",
" plt.figure()\n",
" turnstile_weather['ENTRIESn_hourly'][turnstile_weather['rain']==1].hist(bins=20, alpha = 0.8) # code here to plot a historgram for hourly entries when it is raining\n",
" turnstile_weather['ENTRIESn_hourly'][turnstile_weather['rain']==0].hist(bins=20, alpha = 0.3) # code here to plot a historgram for hourly entries when it is not raining\n",
" return plt\n",
"\n",
"if __name__ == '__main__':\n",
" entries_histogram('data/turnstile_data_master_with_weather.csv')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAEACAYAAABLfPrqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHFlJREFUeJzt3X2QXeV9H/APSEKAkADxIpAwLLLlALXaxASTNIm9xkBJ\nJgU8Q3iZCaMkbqZBdfzSJkE400KnU4KZaS2YjuNpwBZ4AoEaF4sEFF7MZpo0kgxhHcWyDIotC0lI\nYAjC2A4Go/7xnGUv61V1r8LdPffR9zNz55zz7DlX52vk/e3z/M5eERERERERERERERERERERERER\nEREREdPkGnwNG3AHZmM+HsKTeBBHTTj/KWzC+R3jZzbv8RRu6hifjbua8bU4pR8hIiJi6gzhm8o3\neMo3+WW4Eb/XjF2NG5r9MzCKWc21m3FQ87X1eE+zfz8uaPaX49PN/mX4k7c2QkRETLX5+AaOxkzc\nh/OUWcWC5pwTmmPKrOPqjuvX4GdwIr7eMX45PtNxztnN/kw895YmiIiIt9zB+/j6C/hv2IodeFFZ\nrlqAXc05u4wXkoXY1nH9NiyaZHx7M67ZPt3sv4bdStGKiIiW2lfxeDs+pixBLcQR+NUJ5+xpXhER\ncYCYuY+v/zT+L55vjr+In8VOZblqp7Ik9Wzz9e14W8f1Jykzju3N/sTxsWtOVmY2M3GkMuN5k4UL\nF+7ZsWNHN5kiImLc3+Mdb/Wb7mvmsUnpWRymNL7PxUal97GsOWcZ7m32Vyv9jENwKpYojfKdeEnp\nbRyEK/GljmvG3usSPDLZjezYscOePXuqfV177bXTfg/JlnzJV99LWUF6y+1r5vFV3I7H8Dr+Bv8T\nc3E3PoQtuLQ5f2MzvlHpXyw3vqS1HKuUQnS/0iiHW/F55VHd55Xic8DZsmXLdN9C39ScjeQbdLXn\n65d9FQ/KY7k3Thh7QZmFTOb65jXR41g6yfgrxotPREQMgH0tW8UU+bVf+7XpvoW+qTkbyTfoas/X\nLwft+5TW2NOs30VERJcOOugg+vC9PjOPlhgZGZnuW+ibmrORfIOu9nz9kuIRERE9y7JVRETFsmwV\nERGtkeLREjWvu9acjeQbdLXn65dufs+jNbZt27bvkxrHHXec2bNn7/vEiIjo2UD1PD5z32f2fRb+\n8eV/dOHZFzr11FP7fEsREe3Wr57HQM08Fi5Z2NV5O765Q5rrERH9k55HS9S87lpzNpJv0NWer19S\nPCIiomcD1fNYvWl1Vyfu+OYO5/3EeRYvXtznW4qIaLf8nkdERLRGikdL1LzuWnM2km/Q1Z6vX1I8\nIiKiZ+l5RERULD2PiIhojRSPlqh53bXmbCTfoKs9X790Uzx+Ak90vHbjI5iPh/AkHsRRHddcg6ew\nCed3jJ+JDc3XbuoYn427mvG1OKX3KBERMVV6XQc7GNvxHvw2voMbcTWOxgqcgTtwFhbhYSzBHqzH\nh5vt/bgZa7Ac72q2l+GDuHzCn52eR0REj9rS8zgXm/E0LsRtzfhtuLjZvwh34lVsac4/GydirlI4\n4PaOazrf6x58oMf7ioiIKdRr8bhcKQywALua/V3NMSxE52enb1NmIBPHtzfjmu3Tzf5rytLY/B7v\nbaDVvO5aczaSb9DVnq9feikeh+Bf439N8rU9zSsiIg4AvXwk+y/icTzXHO/CCdipLEk924xvx9s6\nrjtJmXFsb/Ynjo9dczJ2NPd0JF6YeAMrV6x0/KLjwZy5cyw+fbGlZy8FG9ZtgDeO165da+vWrYaH\nhzH+00Vbj8fG2nI/b+Xx8PBwq+4n+ZKv5nwjIyNWrVoFhoaG9EsvTZQ/wQPGexM34nl8UmmUH+XN\nDfP3GG+Yv0OZmaxTntRajz/z5ob5UlylLI1dLA3ziIh/sulumM9RmuVf7Bi7Aecpj+qe0xzDRtzd\nbB9QCsPYktZy3KI8krtZKRxwK45pxj+mFKEDythPDjWqORvJN+hqz9cv3S5bfQ/HThh7QSkok7m+\neU30uDLDmOgVXNrlvURExDTLZ1tFRFRsupetIiIi3pDi0RI1r7vWnI3kG3S15+uXFI+IiOhZeh4R\nERVLzyMiIlojxaMlal53rTkbyTfoas/XLykeERHRs/Q8IiIqlp5HRES0RopHS9S87lpzNpJv0NWe\nr19SPCIiomfpeUREVCw9j4iIaI0Uj5aoed215mwk36CrPV+/pHhERETP0vOIiKhYeh4REdEaKR4t\nUfO6a83ZSL5BV3u+fum2eByFL+Dr2IizMR8P4Uk82Jwz5ho8hU04v2P8TGxovnZTx/hs3NWMr8Up\nPeaIiIgp1O062G34C3wWMzEHv4/v4EZcjaOxAmfgDpyFRXgYS7AH6/HhZns/bsYaLMe7mu1l+CAu\nn3AP6XlERPRoOnseR+IXlMIBr2E3LlSKimZ7cbN/Ee7Eq9iCzcpM5UTMVQoH3N5xTed73YMP9Jwk\nIiKmTDfF41Q8h8/hb/BHysxjAXY15+xqjmEhtnVcv02ZgUwc396Ma7ZPN/tjxWl+DzkGXs3rrjVn\nI/kGXe35+mVml+e8W1lu+gpWKstTnfY0r75auWKl4xcdD+bMnWPx6YstPXsp2LBuA7xxvHbtWlu3\nbjU8PIzxvyBtPR4dHW3V/eQ4xzkezOORkRGrVq0CQ0ND+qWbdbAT8NfKDAR+XmmIL8b7sVNZknoU\npxkvLDc02zW4Ft9uzjm9Gb8C78VVzTnXKc3ymXgGx024j/Q8IiJ6NJ09j53KktI7m+Nz8TXch2XN\n2DLc2+yvVprdhygFZ4nS59iJl5T+x0G4El/quGbsvS7BI/uVJiIipkS3j+r+Nv4YX8U/x39VZhbn\nKY/qnmN8prERdzfbB5QnqMaWtJbjFuWR3M3KjANuxTHN+Mf8+LJY9camnTWqORvJN+hqz9cv3fQ8\nKEXjrEnGz93L+dc3r4kex9JJxl/BpV3eS0RETLN8tlVERMXy2VYREdEaKR4tUfO6a83ZSL5BV3u+\nfknxiIiInqXnERFRsfQ8IiKiNVI8WqLmddeas5F8g672fP2S4hERET1LzyMiomLpeURERGukeLRE\nzeuuNWcj+QZd7fn6JcUjIiJ6lp5HRETF0vOIiIjWSPFoiZrXXWvORvINutrz9UuKR0RE9Cw9j4iI\niqXnERERrZHi0RI1r7vWnI3kG3S15+uXbovHFvwtnsD6Zmw+HsKTeBBHdZx/DZ7CJpzfMX4mNjRf\nu6ljfDbuasbX4pQeMkRExBTrdh3sW8o3/hc6xm7Ed5rt1TgaK3AG7sBZWISHsQR7lMLz4WZ7P27G\nGizHu5rtZfggLp9wD+l5RET0qA09j4l/+IW4rdm/DRc3+xfhTryqzFg242yciLnGZy63d1zT+V73\n4AM93FdEREyxbovHHmUG8Rh+sxlbgF3N/q7mGBZiW8e125QZyMTx7c24Zvt0s/8adivLYgeMmtdd\na85G8g262vP1y8wuz/s5PIPjlD7Hpglf39O8+mrlipWOX3Q8mDN3jsWnL7b07KVgw7oN8Mbx2rVr\nbd261fDwMMb/grT1eHR0tFX3k+Mc53gwj0dGRqxatQoMDQ3pl/1ZB7sWLyszkGHsVJakHsVpSt8D\nbmi2a5prvt2cc3ozfgXei6uac65TmuUzjReqTul5RET0aDp7HocrvQqYozw9tQGrsawZX4Z7m/3V\nSrP7EJyqNMvXK0XmJaX/cRCuxJc6rhl7r0vwyH6liYiIKdFN8ViA/4NRrMOfKo/m3oDzlEd1zzE+\n09iIu5vtA8oTVGNLWstxi/JI7mZlxgG34phm/GPGZy8HjLFpZ41qzkbyDbra8/VLNz2Pb+EnJxl/\nAefu5Zrrm9dEj2PpJOOv4NIu7iUiIlogn20VEVGxNvyeR0REBFI8WqPmddeas5F8g672fP2S4hER\nET1LzyMiomLpeURERGukeLREzeuuNWcj+QZd7fn6JcUjIiJ6lp5HRETF0vOIiIjWSPFoiZrXXWvO\nRvINutrz9UuKR0RE9Cw9j4iIiqXnERERrZHi0RI1r7vWnI3kG3S15+uXFI+IiOhZeh4RERVLzyMi\nIlojxaMlal53rTkbyTfoas/XL90Wjxl4Avc1x/PxEJ7Egziq49xr8BQ24fyO8TOxofnaTR3js3FX\nM74Wp/SUICIiply3xeOj2Ig9zfEKpXi8E480x3AGLmu2F+DTxtfa/hAfwpLmdUEz/iE834x9Cp/c\nvyiDbXh4eLpvoW9qzkbyDbra8/VLN8XjJPwSbjFeCC7Ebc3+bbi42b8Id+JVbMFmnI0TMRfrm/Nu\n77im873uwQd6jxEREVOpm+LxKfwuXu8YW4Bdzf6u5hgWYlvHeduwaJLx7c24Zvt0s/8adivLYgeU\nmtdda85G8g262vP1y8x9fP2X8azS7xjeyzl7jC9n9dXKFSsdv+h4MGfuHItPX2zp2UvBhnUb4I3j\ntWvX2rp16xtT0rG/IG09Hh0dbdX95DjHOR7M45GREatWrQJDQ0P6ZV/P/l6PK5UZwaGYhy/iLKWY\n7FSWpB7FacZ7Hzc02zW4Ft9uzjm9Gb8C78VVzTnXKc3ymXgGx01yL/k9j4iIHvXr9zz2NfP4RPOC\n9+F3lGJyI5Ypze1luLc5ZzXuwH9XlqOWKH2OPXhJ6X+sb97j5o5rlinF4xKlAT+pbzz5ja5CPbf1\nOaM/GPXcc8859thjvf3tb+/quoiI6E4v1eh9+A9Kg3s+7sbJSmP8UrzYnPcJ/IYyW/ko/rwZPxOr\ncBjux0ea8dn4PH5Keerq8uY9J9qz6Jxf6upGX/vu98x5/iQzZhzipJNe8uUvf6HLiNNnZGTkjSlo\nbWrORvINutrzTdfMo9NfNC94Aefu5bzrm9dEj2PpJOOvKMVnnw499Le6Oc0PX9nh8MPPwwyvvPLx\nrq6JiIjuDdRnW739l7rrefxw9w5H7i7FY968j/urv/pif+8sIqKl8tlWERHRGikeLTH2qF2Nas5G\n8g262vP1S4pHRET0LD2PiIiKpecRERGtkeLREjWvu9acjeQbdLXn65cUj4iI6Fl6HhERFUvPIyIi\nWiPFoyVqXnetORvJN+hqz9cvKR4REdGz9DwiIiqWnkdERLRGikdL1LzuWnM2km/Q1Z6vX1I8IiKi\nZ+l5RERULD2PiIhojRSPlqh53bXmbCTfoKs9X7/sq3gcinUYxUb8QTM+Hw/hSTyIozquuQZPYRPO\n7xg/Exuar93UMT4bdzXja3HKfuSIiIgp1M062OH4PmbiL/E7uBDfwY24GkdjBc7AHTgLi/AwlmAP\n1uPDzfZ+3Iw1WI53NdvL8EFcPsl9pOcREdGj6ex5fL/ZHoIZ+AeleNzWjN+Gi5v9i3AnXsUWbMbZ\nOBFzlcIBt3dc0/le9+ADvceIiIip1E3xOFhZttqFR/E1LGiONdsFzf5CbOu4dpsyA5k4vr0Z12yf\nbvZfw25lWeyAUvO6a83ZSL5BV3u+fpnZxTmv4ydxJP4c75/w9T3Nq+92fXWlWYcdDw6eNcfseYsd\ndsxS8IPnN8Abxy+/vBYHmzevXDv2F2R4eLiVx6Ojo626nxznOMeDeTwyMmLVqlVgaGhIv/S6DvYf\n8QP8Gwxjp7Ik9ShOU/oecEOzXYNr8e3mnNOb8SvwXlzVnHOd0iyfiWdw3CR/dnoeERE9mq6ex7HG\nn6Q6DOfhCazGsmZ8Ge5t9lcrze5DcKrSLF+vFJmXlP7HQbgSX+q4Zuy9LsEj+50mIiKmxL6Kx4n4\nstLzWIf7lG/uNyiF5EmcY3ymsRF3N9sHlCeoxpa0luMW5ZHczcqMA27FMc34x4zPXg4oY9POGtWc\njeQbdLXn65d99Tw24N2TjL+Ac/dyzfXNa6LHsXSS8Vdw6T7uIyIiWiSfbRURUbF8tlVERLRGikdL\n1LzuWnM2km/Q1Z6vX1I8IiKiZ+l5RERULD2PiIhojRSPlqh53bXmbCTfoKs9X7+keERERM/S84iI\nqFh6HhER0RopHi1R87przdlIvkFXe75+SfGIiIiepecREVGx9DwiIqI1UjxaouZ115qzkXyDrvZ8\n/ZLiERERPUvPIyKiYul5REREa6R4tETN6641ZyP5Bl3t+fqlm+LxNjyKr+Hv8JFmfD4ewpN4EEd1\nXHMNnsImnN8xfqby76I/hZs6xmfjrmZ8LU7pMUdEREyhbtbBTmheozgCj+Ni/Dq+gxtxNY7GCpyB\nO3AWFuFhLMEerMeHm+39uBlrsBzvaraX4YO4fMJ9pOcREdGj6ex57FQKB7yMrytF4ULc1ozfphQU\nuAh34lVswWacjRMxVykccHvHNZ3vdQ8+0HOSiIiYMr32PIbwU1iHBdjVjO9qjmEhtnVcs00pNhPH\ntzfjmu3Tzf5r2K0six0wal53rTkbyTfoas/XLzN7OPcIZVbwUXx3wtf2NK++2vXVlWYddjw4eNYc\ns+ctdtgxS8EPnt8Abxy//PJaHGzevHLt2F+Q4eHhVh6Pjo626n5ynOMcD+bxyMiIVatWgaGhIf3S\n7TrYLPwpHsDKZmwThpVlrROVpvppSt8Dbmi2a3Atvt2cc3ozfgXei6uac65TmuUz8QyOm3AP6XlE\nRPRoOnseB+FWbDReOGA1ljX7y3Bvx/jlOASnKs3y9UqReUnpfxyEK/GlSd7rEjzSe5SIiJgq3RSP\nn8Ov4v14onldoMwszlMe1T3H+ExjI+5utg8oT1CNLWktxy3KI7mblRkHpTgd04x/zPjs5YAxNu2s\nUc3ZSL5BV3u+fumm5/GX9l5kzt3L+PXNa6LHsXSS8VdwaRf3EhERLZDPtoqIqFg+2yoiIlojxaMl\nal53rTkbyTfoas/XLykeERHRs/Q8IiIqlp5HRES0RopHS9S87lpzNpJv0NWer19SPCIiomfpeURE\nVCw9j4iIaI0Uj5aoed215mwk36CrPV+/pHhERETP0vOIiKhYeh4REdEaKR4tUfO6a83ZSL5BV3u+\nfknxiIiInqXnERFRsfQ8IiKiNbopHp/FLmzoGJuPh5R/v/xBHNXxtWuUf4t8E87vGD+zeY+ncFPH\n+Gzc1YyvxSk9JahEzeuuNWcj+QZd7fn6pZvi8TlcMGFshVI83olHmmM4A5c12wvwaePTpT/Eh7Ck\neY2954fwfDP2KXxyP3JERMQU6nYdbAj3YWlzvAnvU2YkJ2AEpymzjteNF4A1uA7fxpdxejN+OYbx\nW80512IdZuIZHDfJPaTnERHRo7b1PBYohUOzXdDsL8S2jvO2YdEk49ubcc326Wb/NexWlsUiIqKl\n3oqG+Z7mFf8ENa+71pyN5Bt0tefrl5n7ed3YctVOnIhnm/HteFvHeScpM47tzf7E8bFrTsaO5n6O\nxAuT/qFfXWnWYceDg2fNMXveYocdU1bSfvB86eePHb/88locbN68cu3YX5Dh4eFWHo+OjrbqfnKc\n4xwP5vHIyIhVq1aBoaEh/bK/PY8blSb3J5Vm+VHN9gzcgfcoy1EP4x3KzGQdPoL1+DPcrPQ7ljfv\ne5XSC7m42U6UnkdERI/61fPoZuZxp9IcP1bpTfwn3IC7lSeltuDS5tyNzfhGpX+x3PiS1nKswmG4\nXykccCs+rzyq+7zJC0dERLRINz2PK5SG9yHKktTnlGWlc5VHdc/Hix3nX6/MNk7Dn3eMP67MMN6h\nzEDGvKIUnyX4GaUYHXDGpp01qjkbyTfoas/XL/kN84iI6Fk+2yoiomJt+z2PiIg4gO3vo7qt9+I/\n3u9HM3b7/ve+6TN//Jl9nn/MEcf4lYt+ZQrubHIjIyNvPHZXm5qzkXyDrvZ8/VJt8fjRjBfNOvlE\nhxx+mEU/vWif529/bPsU3FVERB2ybNUSNf/kU3M2km/Q1Z6vX1I8IiKiZykeLVHzs+Y1ZyP5Bl3t\n+folxSMiInqW4tESNa+71pyN5Bt0tefrlxSPiIjoWYpHS9S87lpzNpJv0NWer19SPCIiomcpHi1R\n87przdlIvkFXe75+SfGIiIieVfupuq995zmzTj7Rrl0rzJ175D6v+dHTr5rruDeNHX/8PF/5ypf3\n62Z7VfPn69ScjeQbdLXnm85/SXCg/eg1jjzyU/s879UXtzvu0N9609izz/50v24rImKgVT/z2LF9\nhVOGPrvPa178xmpzDj3zTWPf/e4fuP76ayY9f7o/hTciohuZefTZ6zO+Z9Ypb/703Rm7Z+31E3nz\nKbwRcSBrU8P8AmzCU7h6mu9lytX8rHnN2Ui+QVd7vn5pS/GYgf+hFJAzcAVOn9Y7mmKjo6PTfQt9\nU3M2km/Q1Z6vX9qybPUebMaW5vhPcBG+Pl03BC/+w/N+40Mfn/Rr3//Wiz7xiT+Y9Gtz5x7qmmve\nfN2+eiQvvvji/t9oy9WcjeQbdLXn65e2FI9FeLrjeBvOnqZ7ecPrrx+81ye1fnTEnea/44pJv7Z7\n98d/rFey+pbVnn/5+b3+WY/97WNv+udy05CPiDZrS/HY081JL++4qbs3e/U1P3rlh/xw3rQ8TzbZ\njOV7T7/g3r9+dK/XvPTkLuue3eSll/7BvHlH+/63XvRvP/I7Xf+Zs2a87j//l9/v+vwnNz3pnae9\ns+vz/ynFbMuWLft13aBIvsFWe75+acujuj+D65SeB1yD1/HJjnM24+1Te1sREQPv7/GO6b6Jfpmp\nBBzCIRh1gDXMIyJi//wivqHMMCb/zbyIiIiIiIh+GaRfHvwsdmFDx9h8PIQn8SCO6vjaNUquTTi/\nY/zM5j2eQudTArNxVzO+Fqe8tbf///U2PIqv4e/wkWa8lnyHYp2yZLoRY89h15JvzAw8gfua45ry\nbcHfKvnWN2M15TsKX1B+hWGj8kRqTfneUjOUZawhzNL+Xsgv4Ke8uXjciN9r9q/GDc3+GUqeWUq+\nzcYfYFiv/O4L3G/8QYLl+HSzf5ny+zBT5QT8ZLN/hLLEeLp68sHhzXam8n+en1dXPvj3+GOMfVBc\nTfm+pXwz7VRTvtvwG83+TByprnxvqZ/Fmo7jFc2rzYa8uXhswoJm/4TmmPJTQedMao3y1NmJ3vzL\nkZfjMx3njP3+y0w891bd9H64F+eqM9/h+Ar+mbrynYSH8X7jM4+a8n0Lx0wYqyXfkfjmJOPTlq8t\nH0+yN5P98uDkn1TYXguUpSzNduw/9EIlz5ixbBPHtxvP3Pm/x2vY7cd/0poKQ8oMa5268h2s/LS2\ny/gSXU35PoXfVR6DH1NTvj1KcXwMv9mM1ZLvVOWb+efwN/gjzDGN+dpePLr65cEBssfgZzoC9+Cj\n+O6Erw16vteVpbmT8F7lJ/ROg5zvl/Gs0g/Y2+93DXI++Dnlh5pfxL9TlpE7DXK+mXi3sqz0bnzP\nj6/CTGm+theP7UqjdszbvLlqDoJdynSSMmV8ttmfmO0kJdv2Zn/i+Ng1Jzf7Y2ueL7z1t7xXs5TC\n8Xll2Yq68o3ZjT9TGou15PuXuFBZ2rkT5yj/HWvJB8802+fwv5V1/VrybWteX2mOv6AUkZ2mKV/b\ni8djWGL8lwcvM97oGxSrsazZX2b8m+5qZb3xEGVKukRpZO3ES8ra40G4El+a5L0uwSN9vvdOB+FW\n5SmPlR3jteQ71viTKofhPOWn9FryfUL5ZnKqct9fbu6tlnyHY26zP0d5umiDevLtVJaUxj5T6Fxl\nWfU+deTri0H65cE7sQM/VP5D/7qyZviwyR+l+4SSaxP+Vcf42KN0m3Fzx/hs3G38UbqhPmTYm59X\nlnVGlW+qTyhPadSSb6myljyqPO75u814Lfk6vc/4D2G15DtV+W83qjxKPva9opZ88C+UmcdX8UVl\nZlBTvoiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiJgK/w/d4qrPu3rfYwAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x10adb6690>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import scipy\n",
"import scipy.stats\n",
"import pandas\n",
"\n",
"def mann_whitney_plus_means(turnstile_weather):\n",
" '''\n",
" This function will consume the turnstile_weather dataframe containing\n",
" our final turnstile weather data. \n",
" \n",
" You will want to take the means and run the Mann Whitney U-test on the \n",
" ENTRIESn_hourly column in the turnstile_weather dataframe.\n",
" \n",
" This function should return:\n",
" 1) the mean of entries with rain\n",
" 2) the mean of entries without rain\n",
" 3) the Mann-Whitney U-statistic and p-value comparing the number of entries\n",
" with rain and the number of entries without rain\n",
" \n",
" You should feel free to use scipy's Mann-Whitney implementation, and you \n",
" might also find it useful to use numpy's mean function.\n",
" \n",
" Here are the functions' documentation:\n",
" http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html\n",
" http://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html\n",
" \n",
" You can look at the final turnstile weather data at the link below:\n",
" https://www.dropbox.com/s/meyki2wl9xfa7yk/turnstile_data_master_with_weather.csv\n",
" '''\n",
" turnstile_weather = pandas.read_csv(turnstile_weather)\n",
" with_rain = turnstile_weather['ENTRIESn_hourly'][turnstile_weather['rain']==1]\n",
" with_rain_mean = np.mean(with_rain)\n",
" \n",
" without_rain = turnstile_weather['ENTRIESn_hourly'][turnstile_weather['rain']==0]\n",
" without_rain_mean = np.mean(without_rain)\n",
" \n",
" U, p = scipy.stats.mannwhitneyu(with_rain, without_rain)\n",
" print with_rain_mean, without_rain_mean, U, p\n",
" \n",
" return with_rain_mean, without_rain_mean, U, p\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" mann_whitney_plus_means('data/turnstile_data_master_with_weather.csv')\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1105.44637675 1090.27878015 1924409167.0 0.0249999127935\n"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import pandas\n",
"from ggplot import *\n",
"\n",
"def normalize_features(array):\n",
" \"\"\"\n",
" Normalize the features in the data set.\n",
" \"\"\"\n",
" array_normalized = (array-array.mean())/array.std()\n",
" mu = array.mean()\n",
" sigma = array.std()\n",
"\n",
" return array_normalized, mu, sigma\n",
"\n",
"def compute_cost(features, values, theta):\n",
" \"\"\"\n",
" Compute the cost function given a set of features / values, \n",
" and the values for our thetas.\n",
" \n",
" \"\"\"\n",
" m = len(values)\n",
" sum_of_square_errors = (numpy.square(numpy.dot(features, theta) - values)).sum()\n",
" cost = sum_of_square_errors/2*m\n",
"\n",
" return cost\n",
"\n",
"def gradient_descent(features, values, theta, alpha, num_iterations):\n",
" \"\"\"\n",
" Perform gradient descent given a data set with an arbitrary number of features.\n",
" \n",
" \"\"\"\n",
" \n",
" m = len(values)\n",
" cost_history = []\n",
"\n",
" for i in range(num_iterations):\n",
" predicted_values = np.dot(features, theta) - values\n",
" theta = theta - ((alpha/m) * np.dot(predicted_values, features))\n",
" cost = compute_cost(features, values, theta)\n",
" cost_history.append(cost)\n",
" \n",
" return theta, pandas.Series(cost_history)\n",
"\n",
"def predictions(dataframe):\n",
" '''\n",
" The NYC turnstile data is stored in a pandas dataframe called weather_turnstile.\n",
" Using the information stored in the dataframe, let's predict the ridership of\n",
" the NYC subway using linear regression with gradient descent.\n",
" \n",
" You can see the information contained in the turnstile weather dataframe here:\n",
" https://www.dropbox.com/s/meyki2wl9xfa7yk/turnstile_data_master_with_weather.csv \n",
" \n",
" The prediction should have a R^2 value of 0.40 or better.\n",
" \n",
" Note: Due to the memory and CPU limitation of our Amazon EC2 instance, we will\n",
" give you a random subet (~15%) of the data contained in \n",
" turnstile_data_master_with_weather.csv\n",
" \n",
" If you'd like to view a plot of your cost history, uncomment the call to \n",
" plot_cost_history below. The slowdown from plotting is significant, so if you \n",
" are timing out, the first thing to do is to comment out the plot command again.\n",
" \n",
" '''\n",
" \n",
" dataframe = pandas.read_csv(dataframe)\n",
"\n",
" dummy_units = pandas.get_dummies(dataframe['UNIT'], prefix='unit')\n",
" features = dataframe[['rain', 'precipi', 'Hour', 'meantempi']].join(dummy_units)\n",
" values = dataframe[['ENTRIESn_hourly']]\n",
" m = len(values)\n",
"\n",
" features, mu, sigma = normalize_features(features)\n",
"\n",
" features['ones'] = np.ones(m)\n",
" features_array = np.array(features)\n",
" values_array = np.array(values).flatten()\n",
"\n",
" #Set values for alpha, number of iterations.\n",
" alpha = 0.1 # please feel free to change this value --- alpha is how long the steps be\n",
" num_iterations = 75 # please feel free to change this value\n",
"\n",
" #Initialize theta, perform gradient descent\n",
" theta_gradient_descent = np.zeros(len(features.columns))\n",
" theta_gradient_descent, cost_history = gradient_descent(features_array, \n",
" values_array, \n",
" theta_gradient_descent, \n",
" alpha, \n",
" num_iterations)\n",
" \n",
" plot = None\n",
" \n",
" plot = plot_cost_history(alpha, cost_history)\n",
" predictions = np.dot(features_array, theta_gradient_descent)\n",
" return predictions, plot\n",
" print 'working...?'\n",
"\n",
"\n",
"def plot_cost_history(alpha, cost_history):\n",
" \"\"\"This function is for viewing the plot of your cost history.\n",
" You can run it by uncommenting this\n",
"\n",
" plot_cost_history(alpha, cost_history) \n",
"\n",
" call in predictions.\n",
" \n",
" If you want to run this locally, you should print the return value\n",
" from this function.\n",
" \"\"\"\n",
" cost_df = pandas.DataFrame({\n",
" 'Cost_History': cost_history,\n",
" 'Iteration': range(len(cost_history))\n",
" })\n",
" \n",
" print ggplot(cost_df, aes('Iteration', 'Cost_History')) + \\\n",
" geom_point() + ggtitle('Cost History for alpha = %.3f' % alpha )\n",
" return ggplot(cost_df, aes('Iteration', 'Cost_History')) + \\\n",
" geom_point() + ggtitle('Cost History for alpha = %.3f' % alpha )\n",
" \n",
"\n",
" \n",
"if __name__ == '__main__':\n",
" predictions('data/turnstile_data_master_with_weather.csv')\n",
" print 'Go'"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nkVLl/u2339oer1q1Ss2bNy/3bV955ZXauHGjzx7v3/46vpf5ZNxut6688kqfK94//fRTtW/f/nfd\nJaFNmzYKDg62vXdJSYmWLVumjh07SpIaNGig2rVrn3T7x9cB8PsE+nuAcyU/P1+pqal69913vcvO\ndL/DkpIS/fTTTxo2bJiqVKmid999V+vXr1fr1q3Le1yg3Lz88svq0KGD2rRpo7Fjx6ply5Zyu936\n73//q2effVazZs3S5ZdfruHDh2v06NGqUaOGLr/8ci1cuFAfffSRli1bJkn68MMPlZKSoquvvlo1\natTQunXrlJqaqksvvVSS1LBhQ+96HTp0UGho6Dk/hWXSpEmqU6eOWrZsqdDQUM2bN0+BgYGKjY2V\nJDVq1EgLFy7U5s2bFRMTo8jISF1zzTWKj49X//799dJLLykyMlLjxo1TQUGB7rnnnjNuMywsTAMG\nDNDIkSPVqFEjJSQknPE1Jxay/v37a+zYsbr55ps1adIklZSU6OGHH1bdunV18803lymD+vXrKzg4\nWP/+97/10EMPaffu3XrkkUdKVcKWLFmil156Sd27d9enn36qd955RwsXLjzjZzn+ec5228cPwf8e\no0aNUp8+fRQfH69rr71WS5Ys0aJFi7R48WLvOlOnTtVLL71k+8fGjh07lJWVpT179kiSNmzYIGOM\nmjRporCwMEVGRmrYsGF67LHHVKtWLTVo0ECTJk1Sfn6+hg4dKunYXuD/+7//02OPPaZmzZqpTZs2\nmjlzppKSkvTmm2/+rs8F4H/8cubpOXLkyBHvRUi5ublm0qRJp11/0aJFtouQUlNTzfTp072P169f\nbxYvXlw+wwIOSktLMw8//LCJjY01Ho/HxMTEmE6dOplXX33VFBUVGWOMKSwsNI888oj3NkzNmzc3\n8+bN877HihUrTNeuXU2NGjWMx+MxsbGxZuLEibbtPPDAAyYmJuZ33YbpxIuQXC6X9yKk1157zbRp\n08ZERkaa8PBwEx8fbz766CPv+keOHDHXXXedqVKliu02TD///LO55ZZbbLdhWrdu3Sm3c6INGzYY\ny7LMs88+e8rP9FsnXoRkjDHbtm3zuQ3Tzp07T/nZT2fhwoWmSZMmxuPxmNatW5vExEQTGBjo/bzG\nnPo2TD179jShoaGmdu3a5oUXXrC978n+XLp162b7syzNtsvLzJkzTWxsrHG73aZp06Y+s44ZM8a4\n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\nLaG/dbysbt++Xdu3b/cuP3r0qD7++GP169dPq1ev1iuvvOK9l+n+/fsVFxenO+64QykpKbr11lv1\n008/SZK++OILLVy4UCEhITp69KjuvPNO7dmzRyEhIXrwwQfVq1cvSVJhYaHGjh2rHTt26OKLL9ZT\nTz3lPfXAGKOPP/5Y27ZtU/fu3dWyZUvbzHv27FFmZqaaNGni87Wmxz/P8XuwAgAqjoAxY8aM8fcQ\nZysnJ8dnD4/TgoKCVFRU5NcZAgICFBYWRh7/U5HykJzJJCIiQq1bt1ZsbKzt0H379u1Vo0YNhYaG\nqm/fvt5zQF0ul5KSkrRz504VFxcrLCxMffr0UYcOHZSdna133nnHe6hekho3bqxevXrpgw8+0LJl\ny7zLi4qKFBUVpeuuu05PPvmkvv32W+9zBw4cUJMmTdSsWTM9+OCD+s9//qPMzEylp6crKSlJffv2\nlcfj0d/+9je988472r17t5KSkrR582ZvOX3ooYf073//W998840+//xz1apVS02bNpUkPfrooxoz\nZozmzp2rzz//XD169JDH45ExRo8//rhGjx6t6dOn66efflLXrl0lHSulo0eP1jPPPKO33npLtWrV\nUr169byfZcyYMZo6daqWLVumDh06ePfgFhQUaOzYsZo5c6aSk5PVvn17b845OTkaN26cFixYIJfL\npSZNmngz+PXXX/XMM8/ok08+0SWXXKLo6Gjvc/v379fUqVO1du1aNW/e3Fagd+zYobfeekv79u1T\n06ZNbX+mGzdu1AcffKDi4mLVrVvX9nOwevVqffnll6pSpYqioqK8y40x+uabb/TDDz8oJibG9tWw\nBQUF+vrrr7Vnzx5Vr17dtq3MzEx9/fXXOnLkiGrVqmV77tChQ/r2229VUlKiqlWr2ubYu3evvv/+\ne7ndbtu5y5KUnJysLVu2KDIy0rY33BijH3/8UampqYqOjlZg4P/fP1JQUKAffvhBhw4dUkxMjG2O\nrKwsrV+/Xrm5uT5zHD58WElJSXK5XD5z7Nu3T1u3blVoaKjPV+empKRo79698ng8tlNcSkpKtGnT\nJh04cEDVqlWz/eMmPz9fGzduVGZmpqpVq2Z7v4yMDCUlJam4uFhVqlSxPZeWlqbNmzcrODjY54hB\namqqdu7cqdDQUO9pNcezSk5OVmpqqqpWrWqbsaioSJs2bdLhw4d9/jxzc3OVlJSkvLw828+iJKWn\n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\nmzfPOHOysoSEBPr3729Vs0RERETEYpYNwYeGhhpnhwYEBBAZGVnlGmIiIiIi8ttXLRei9yzDd/FF\noW02GydOnOCtt94iNDSUO+64g+joaPLz86usehISEnLJCz1bzdfX13RNsOrgyUF5uNWkPECZXEx5\nmCkPM+VhpjyqUiZmNSmPq2H5ZZhKS0tZsGABt912W5XrWXlWXvD39yczM5M1a9YwevRoNmzYwKZN\nm0yP7dKlC7fffruVTRcRERGRX4ClpXtFRQXLli2jdevWl7yYauXVIho3bszq1aspLi4mJSXFdHFk\ncPeA2u32Kst9WS0gIKDK8ltWq1WrFnXr1lUe/1aT8gBlcjHlYaY8zJSHmfKoSpmY1aQ8ruo516gt\nVbhcLj799FOioqLo1KnTJR9TWFhIcHAwNpuNkydP4nK5jNU1Ki+L5VETLgBbq1atam+DR3l5ebW3\nRXlUpUzMlIeZ8jBTHmbKoyplYlaT8rgalhWgx48f58cffyQmJoY5c+YA7jWg8/LyAGjXrh379+/n\n+++/x8fHBz8/P/r27WtV80RERETEIpYVoAkJCUyaNOmKj+nQoYNpLVYRERER+e3RSkgiIiIiYikV\noCIiIiJiKRWgIiIiImIpFaAiIiIiYikVoCIiIiJiKRWgIiIiImIpFaAiIiIiYikVoCIiIiJiKRWg\nIiIiImIpFaAiIiIiYikVoCIiIiJiKRWgIiIiImIpFaAiIiIiYikVoCIiIiJiKRWgIiIiImIpFaAi\nIiIiYikVoCIiIiJiKRWgIiIiImIpFaAiIiIiYikVoCIiIiJiKRWgIiIiImIpFaAiIiIiYikVoCIi\nIiJiKRWgIiIiImIpFaAiIiIiYikVoCIiIiJiKRWgIiIiImIpm8vlclV3I/4bJSUllJSUUN3N9/Hx\nwel0VmsbbDYb/v7+lJWVKQ9qVh6gTC6mPMyUh5nyMFMeVSkTs5qSR506da7qObWuUVuuucDAQAoK\nCnA4HNXajqCgIC5cuFCtbfDz86NOnToUFRUpD2pWHqBMLqY8zJSHmfIwUx5VKROzmpLH1dIQvIiI\niIhYSgWoiIiIiFhKBaiIiIiIWEoFqIiIiIhYSgWoiIiIiFhKBaiIiIiIWEoFqIiIiIhYSgWoiIiI\niFhKBaiIiIiIWEoFqIiIiIhYSgWoiIiIiFhKBaiIiIiIWEoFqIiIiIhYSgWoiIiIiFhKBaiIiIiI\nWEoFqIiIiIhYSgWoiIiIiFhKBaiIiIiIWEoFqIiIiIhYSgWoiIiIiFhKBaiIiIiIWEoFqIiIiIhY\nSgWoiIiIiFhKBaiIiIiIWEoFqIiIiIhYSgWoiIiIiFiqllVvlJeXR1paGkVFRQCkpKTQsWPHKo/7\n4osvOHjwIH5+fvTp04fY2FirmigiIiIiFrCsAPXx8aFXr17ExsZSWlrKvHnzSE5OJioqynjMgQMH\nyMnJYfTo0Zw8eZLPP/+coUOHWtVEEREREbGAZUPwoaGhRm9mQEAAkZGRFBQUmB6TkZHBDTfcAEB8\nfDwlJSUUFhZa1UQRERERsYBlPaCV2e12Tp8+TVxcnOn+goICwsLCjNthYWHk5+fjdDqrFKIhISHU\nqlUtzTfx9fXFz8+vWtvgyUF5uNWkPECZXEx5mCkPM+VhpjyqUiZmNSmPq3rONWjHFZWWlrJs2TLu\nvPNOAgICftZzdu7cyaZNm0z3JSQk8MADD1C3bt1r0cxflfz8fDZs2EBKSoryQHlcijIxUx5mysNM\neZgpj6qUiVnlPCp3JF6JpWfBV1RUsGzZMlq3bk3z5s2rbA8NDSUvL8+4nZ+fT1hYGCkpKTz++OPG\nf/fddx/Hjh3T8Py/FRYWsmnTJuXxb8qjKmVipjzMlIeZ8jBTHlUpE7P/Jg/LekBdLheffvopUVFR\ndOrU6ZKPadq0KTt27KBVq1acOHGCwMBAQkJCAH52RS0iIiIiNZtlBejx48f58ccfiYmJYc6cOQB0\n797d6PFs164dTZo0ITMzk9dffx1/f3969+5tVfNERERExCKWFaAJCQlMmjTpPz7u7rvvvvaNERER\nEZFq4zvp51SFNYzL5cLf35/ExMSffSLTb5nyMFMeVSkTM+VhpjzMlIeZ8qhKmZj9N3nYXC6X6xq3\nS0RERETEUP0XsLoK+/btY+PGjZw/f56hQ4dSv359Y9uWLVvYtWsXNpuNu+66i0aNGlVjS62VmZnJ\nl19+icvlom3bttx6663V3SRLffLJJ2RmZhIcHMwTTzwBQHFxMcuXLyc3N5c6derQr18/goKCqrml\n1rjcsrfemonD4WDBggWUl5dTUVFBs2bN6NGjh9fm4eF0Opk3bx5hYWH079/f6/OYOXMmAQEB+Pj4\n4OPjw+OPP+7VmVy4cIFVq1Zx7tw5APr06UNERIRX5nH+/HmWL19u3Lbb7dx+++20bt3aK/MAd831\n448/YrPZiI6Opk+fPpSVlV1VHr+qIXibzUbLli05e/YsycnJhIaGAnD27Fk2bdrE8OHDadq0KcuX\nL6dDhw7YbLZqbvG153Q6Wbx4MQMHDqRz586sWbOGxMREgoODq7tplgkKCuLGG2/kp59+on379gBs\n2LCB6Oho+vXrR0FBAYcPHyY5ObmaW2oNh8NBgwYN6NatG23atOGzzz4jKSmJHTt2eGUmvr6+tGrV\nio4dO5KSksKGDRuIjIxk165dXpmHx7Zt23A6nVRUVNCqVSuv/s0AfPfddwwZMoROnTqRkpICePe/\nI59//jlJSUn07t2blJQUAgMD2bJli1fmUbt2bdq1a0e7du1o27YtO3bsoFevXmzbts0r87Db7axZ\ns4YnnniCm266iX379lFRUUF6evpV5WHpdUD/V1FRUURGRla5PyMjg1atWuHr60vdunWJiIggKyur\nGlpovaysLCIiIqhbty6+vr60bNmSn376qbqbZamEhAQCAwNN91Ve1rVNmzZelcmllr3Nz8/36kz8\n/f0B97WIXS4XQUFBXp1HXl4emZmZtG3b1rjPm/O4HG/NpKSkhGPHjhn7h6+vL4GBgV6bR2WHDx8m\nIiKC8PBwr80jICAAX19fHA4HFRUVOBwOQkNDrzqPX9UQ/OUUFBQQHx9v3A4LC6uyzvxvVX5+PuHh\n4cbtsLAwrym+r6SoqMi4hmxISIgxHO1tPMvexsfHe3UmTqeTuXPnYrfbadeuHdHR0V6dx9q1a7nj\njjsoLS017vPmPDwWLlyIzWajXbt2pKSkeG0mdrud4OBgPvnkE06fPk39+vW58847vTaPyvbu3UvL\nli0B7/3N1K5dm06dOjFz5kxq1apFo0aNSE5Ovuo8alwBunDhwkteSb979+40bdq0GlpUs3nDNIP/\nlbdmdKVlb70tEx8fH4YPH05JSQmLFi3iyJEjpu3elEdGRgbBwcHExsZWycHDm/LwGDJkCKGhoRQV\nFbFw4cIqo23elInT6SQ7O5vf//73xMXFsWbNGr755hvTY7wpD4/y8nIOHDhAz549q2zzpjxycnLY\nvn07qampBAQE8PHHH7Nnzx7TY35OHjWuAB00aNBVP+dyS3h6A2/+7FcSHBxMQUEBoaGhFBQUeNWc\nWLj0srfenglAYGAgTZo04dSpU16bx4kTJ8jIyCAzM5Py8nJKS0tZuXKl1+bh4TmnIDg4mObNm5OV\nleW1mYSFhREWFkZcXBwALVq04JtvviEkJMQr8/A4ePAgsbGxxuf21v3j1KlTXHfdddSuXRuA5s2b\nc/LkyaveP35Vc0Avp2nTpuzdu5fy8nLsdjs5OTnGD+e3rn79+uTk5GC32ykvL2fv3r3qKca9T3iO\nyHbv3k2zZs2quUXWudyyt96aSVFRERcuXADcJ2gdOnSI2NhYr82jR48ePP3006SmptK3b18aNmzI\n/fff77V5AJSVlRnTEcrKyjh06BDR0dFem0loaChhYWGcP38ecM97jIqKokmTJl6Zh8c///lPWrVq\nZdz21v0jMjKSkydP4nA4cLlc//X+8au6Dmh6ejpr1qyhuLiYgIAAYmNjGTBgAACbN29m165d+Pj4\neO1lmJxOJ23btqVz587V3SRLLV++nKNHj1JcXExISAi33347TZs25eOPPyYvL8/rLo9x7Ngx5s+f\nT0xMjDEM0r17d+Li4rwykzNnzpCWlobL5cLlctGmTRtuueUWiouLvTKPyo4ePcrWrVuNyzB5ax52\nu52lS5cC7uHn1q1b07lzZ6/O5PTp06xatYqKigrq1q1Lnz59cDqdXptHWVkZM2fONIadAa/eP775\n5hv27NmDzWYjNjaWe++9l9LS0qvK41dVgIqIiIjIr99vYgheRERERH49VICKiIiIiKVUgIqIiIiI\npVSAioiIiIilVICKiIiIiKVUgIqIiIiIpVSAiojUUKGhoRw9erS6myEi8otTASoichmJiYmsX7+e\nBQsWXPMFHrp27cq7775ruq+goIDExMRr+r4iItVBBaiIyGV4VpL6X5WXl1v2XiIivwYqQEVEriA9\nPZ3hw4ezbds2QkNDiYiIAKC0tJRnnnmGhIQE6tWrx/DhwykpKQFg48aNxMfH88orrxAbG8uQIUPI\nzc3lnnvuITo6moiICP7whz+QlZUFwNixY9myZQsjR44kNDSU0aNHA+Dj48Phw4cByMvLY9CgQURH\nR5OYmMi0adPwLGS3YMECbr31Vp599lkiIiJISkriyy+/tDoqEZGfTQWoiMgVtGjRgjlz5tCpUycK\nCgrIyckB4LnnnuPgwYPs2bOHgwcPkpWVxZQpU4znnTlzBrvdzvHjx5k7dy5Op5MhQ4Zw/Phxjh8/\nTlBQECNHjgRg2rRpdO7cmb/97W8UFBQwa9asKu0YNWoUBQUFHDlyhE2bNrFw4ULmz59vbN+xYwfN\nmjXjX//6F2PGjGHIkCHXOBkRkf+eClARkStwuVxGT2Pl+95++21effVV6tSpQ0hICM8//zxLly41\nHuPj48PkyZPx8/MjMDCQiIgI7rvvPgIDAwkJCeGFF15g06ZNVV73UioqKvjoo4946aWXCA4OJiEh\ngT//+c8sWrTIeExCQgJDhgzBZrMxaNAgsrOzOXv27C+YhIjIL6dWdTdARKQmu9TczHPnzlFcXExK\nSopxn8vlwul0GrejoqLw9/c3bhcXF/PUU0+xdu1a7HY7AIWFhbhcLuM9LjcP9Pz58zgcDhISEoz7\nGjRoYAzhA9SrV8/4/9q1axuvHx0dfVWfV0TECuoBFRH5Dy4uDCMjIwkKCmL//v3Y7Xbsdju5ubnk\n5+df9jkzZszgwIED7Nixg7y8PDZt2mTqXb3SSUiRkZH4+fmZLsl0/Phx4uPjf4FPJyJiPRWgIiL/\nQb169Th58iQOhwNwD68PHTqU1NRUzp07B0BWVhbr1q277GsUFhYSFBREeHg4OTk5TJ482bQ9JiaG\nQ4cOXfK5vr6+/PGPf2Ts2LEUFhZy7NgxZs6cyYABA36hTygiYi0VoCIi/0G3bt24/vrrqVevnjGk\n/fLLL9OoUSM6duxIeHg4PXv25MCBA8ZzLu7RTE1N5cKFC0RGRnLzzTdz1113mR7z5JNPsnz5ciIi\nIkhNTa3ShtmzZxMcHExSUhKdO3fmkUceYfDgwcZ7Xfx+uqyTiNRkNtflZr2LiIiIiFwD6gEVERER\nEUupABURERERS6kAFRERERFLqQAVEREREUupABURERERS6kAFRERERFLqQAVEREREUupABURERER\nS/0//4BUC7QeeuYAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x10fab90d0>"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"<ggplot: (283817437)>\n",
"Go"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import pandas\n",
"\n",
"def normalize_features(array):\n",
" \"\"\"\n",
" Normalize the features in the data set.\n",
" \"\"\"\n",
" #print array\n",
" array_normalized = (array-array.mean())/array.std()\n",
" mu = array.mean()\n",
" sigma = array.std()\n",
"\n",
" return array_normalized, mu, sigma\n",
"\n",
"def predictions2(dataframe):\n",
" dataframe = pandas.read_csv(dataframe)\n",
" dummy_units = pandas.get_dummies(dataframe['UNIT'], prefix='unit')\n",
" \n",
" features = dataframe[['rain', 'precipi', 'Hour', 'meantempi']].join(dummy_units)\n",
" #print features\n",
" values = dataframe[['ENTRIESn_hourly']]\n",
" \n",
" m = len(values)\n",
" #print features.mean()\n",
" features, mu, sigma = normalize_features(features)\n",
" features['ones'] = np.ones(m)\n",
" \n",
" features_array = np.array(features)\n",
" values_array = np.array(values).flatten()\n",
"\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" predictions2('data/turnstile_data_master_with_weather.csv')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[-0.70855551 -0.4015719 -1.43587319 ..., -0.15562002 -0.16528617 1. ]\n",
" [-0.70855551 -0.4015719 -0.8554972 ..., -0.15562002 -0.16528617 1. ]\n",
" [-0.70855551 -0.4015719 -0.27512121 ..., -0.15562002 -0.16528617 1. ]\n",
" ..., \n",
" [-0.70855551 -0.4015719 0.74053678 ..., -0.15562002 -0.16528617 1. ]\n",
" [-0.70855551 -0.4015719 -1.58096719 ..., -0.15562002 -0.16528617 1. ]\n",
" [-0.70855551 -0.4015719 -1.0005912 ..., -0.15562002 -0.16528617 1. ]]\n",
"[ 0. 217. 890. ..., 54. 59. 123.]\n"
]
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import scipy\n",
"import matplotlib.pyplot as plt\n",
"import sys\n",
"\n",
"def compute_r_squared(data, predictions):\n",
" '''\n",
" Calculate R square -- the coefficient of determination. The closer to one, the better the model\n",
" \n",
" Given a list of original data points, and also a list of predicted data points,\n",
" write a function that will compute and return the coefficient of determination (R^2)\n",
" for this data. numpy.mean() and numpy.sum() might both be useful here, but\n",
" not necessary.\n",
"\n",
" Documentation about numpy.mean() and numpy.sum() below:\n",
" http://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html\n",
" http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html\n",
" '''\n",
" \n",
" # your code here\n",
" \n",
" r_squared = 1 - ( np.sum( np.square(data - predictions) )) / np.sum(np.square(data-np.mean(data) ))\n",
" \n",
" return r_squared"
],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment