{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# New York Subway and Weather Data \n", "\n", "Working with 2D data with numpy and pandas.\n", "\n", "### Questions \n", "\n", "* What variables area related to subway ridership? \n", " * What stations have the most riders?\n", " * What are the ridership patterns over time? On weekends Holidays? \n", " * How does the weather affect ridership?\n", "* What patterns can I find in the weather?\n", " * How does the weather vary across the city? \n", " * How does the temperature rise throughout the month?\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "# Libraries\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "%pylab inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Storing 2D Data \n", "\n", "* Pure python: Lists of lists \n", "* NumPy: 2D array (more memory efficent, accessing elements differ in syntax) \n", "* Pandas : Dataframe \n", "\n", "### Storing 2D Data : NumPy \n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('int64')" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Sample Numpy 2D array: Subway ridership for 5 stations and 10 days\n", "# Columns represent train stations, and rows represent days\n", "\n", "ridership = np.array([\n", " [ 0, 0, 2, 5, 0],\n", " [1478, 3877, 3674, 2328, 2539],\n", " [1613, 4088, 3991, 6461, 2691],\n", " [1560, 3392, 3826, 4787, 2613],\n", " [1608, 4802, 3932, 4477, 2705],\n", " [1576, 3933, 3909, 4979, 2685],\n", " [ 95, 229, 255, 496, 201],\n", " [ 2, 0, 1, 27, 0],\n", " [1438, 3785, 3589, 4174, 2215],\n", " [1342, 4043, 4009, 4665, 3033]\n", "])\n", "\n", "# Check type of 2D array\n", "ridership.dtype" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Working with Numpy 2D arrays: \n", "\n", "* Station with max number of riders on day 1 and the mean riders per day (mean_for_max)\n", "* For all days and stations what is the mean ridership overall? (overall_mean)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2342.5999999999999, 3239.9000000000001)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def mean_riders_for_max_station(ridership):\n", " # Max riders on day 1\n", " max_station = ridership[0,:].argmax() # argmax returns position\n", " # Mean riders per day for max_station\n", " mean_for_max = ridership[:, max_station].mean()\n", " overall_mean = ridership.mean()\n", " return (overall_mean, mean_for_max)\n", "\n", "mean_riders_for_max_station(ridership)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Station with higher ridership on day1 had a higher ridership than average. This is interesting but not useful.\n", "\n", "###### Use NumPy's axis function to find more practical results:\n", "* Mean ridership per day for each subway station\n", "* Maximum and minimum ridership for each day for each subway station" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(3239.9000000000001, 1071.2)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def min_and_max_riders_per_day(ridership):\n", " # Mean per day for each station \n", " station_riders = ridership.mean(axis = 0) #selects columns \n", " \n", " max_daily_ridership = station_riders.max()\n", " min_daily_ridership = station_riders.min() \n", " \n", " return (max_daily_ridership, min_daily_ridership)\n", "\n", "min_and_max_riders_per_day(ridership)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The station with the max daily ridership had 3239 riders.\n", "The station with the min daily ridership had 1071 riders." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Storing 2D Data : Pandas Dataframes\n", "\n", "Recreate the sample 2D numpy array using a pandas dataframe. Advantages of a pandas dataframe over a 2D NumPy array includes the following:\n", "* Indexs for rows \n", "* Name for columns \n", "* Different data types for each column " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
R003R004R005R006R007
05-01-1100250
05-02-1114783877367423282539
05-03-1116134088399164612691
05-04-1115603392382647872613
05-05-1116084802393244772705
05-06-1115763933390949792685
05-07-1195229255496201
05-08-11201270
05-09-1114383785358941742215
05-10-1113424043400946653033
\n", "
" ], "text/plain": [ " R003 R004 R005 R006 R007\n", "05-01-11 0 0 2 5 0\n", "05-02-11 1478 3877 3674 2328 2539\n", "05-03-11 1613 4088 3991 6461 2691\n", "05-04-11 1560 3392 3826 4787 2613\n", "05-05-11 1608 4802 3932 4477 2705\n", "05-06-11 1576 3933 3909 4979 2685\n", "05-07-11 95 229 255 496 201\n", "05-08-11 2 0 1 27 0\n", "05-09-11 1438 3785 3589 4174 2215\n", "05-10-11 1342 4043 4009 4665 3033" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a pandas df\n", "\n", "ridership_df = pd.DataFrame(\n", " data=[[ 0, 0, 2, 5, 0],\n", " [1478, 3877, 3674, 2328, 2539],\n", " [1613, 4088, 3991, 6461, 2691],\n", " [1560, 3392, 3826, 4787, 2613],\n", " [1608, 4802, 3932, 4477, 2705],\n", " [1576, 3933, 3909, 4979, 2685],\n", " [ 95, 229, 255, 496, 201],\n", " [ 2, 0, 1, 27, 0],\n", " [1438, 3785, 3589, 4174, 2215],\n", " [1342, 4043, 4009, 4665, 3033]],\n", " index=['05-01-11', '05-02-11', '05-03-11', '05-04-11', '05-05-11',\n", " '05-06-11', '05-07-11', '05-08-11', '05-09-11', '05-10-11'],\n", " columns=['R003', 'R004', 'R005', 'R006', 'R007']\n", ")\n", "\n", "# Print df\n", "ridership_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mean ridership for each station (column)." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "R003 1071.2\n", "R004 2814.9\n", "R005 2718.8\n", "R006 3239.9\n", "R007 1868.2\n", "dtype: float64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Mean of each column \n", "ridership_df.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mean ridership for each day (row)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "05-01-11 1.4\n", "05-02-11 2779.2\n", "05-03-11 3768.8\n", "05-04-11 3235.6\n", "05-05-11 3504.8\n", "05-06-11 3416.4\n", "05-07-11 255.2\n", "05-08-11 6.0\n", "05-09-11 3040.2\n", "05-10-11 3418.4\n", "dtype: float64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Mean of each row \n", "ridership_df.mean(axis = 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Accessing a station (column) of the dataframe using \"iloc\"" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "R003 1608\n", "R004 4802\n", "R005 3932\n", "R006 4477\n", "R007 2705\n", "Name: 05-05-11, dtype: int64\n", "05-01-11 0\n", "05-02-11 2539\n", "05-03-11 2691\n", "05-04-11 2613\n", "05-05-11 2705\n", "05-06-11 2685\n", "05-07-11 201\n", "05-08-11 0\n", "05-09-11 2215\n", "05-10-11 3033\n", "Name: R007, dtype: int64\n" ] } ], "source": [ "#ridership_df.iloc['R007'] --> This is wrong\n", "print ridership_df.iloc[4]\n", "\n", "print ridership_df['R007'] # prints beginning of column" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Accessing a day (row/index) of the dataframe using \"loc\"" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "R003 1438\n", "R004 3785\n", "R005 3589\n", "R006 4174\n", "R007 2215\n", "Name: 05-09-11, dtype: int64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ridership_df.loc['05-09-11']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Accessing a day/station (row/column) of the dataframe using \"iloc\" or \"loc\"" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n", "5\n" ] } ], "source": [ "# Two methods\n", "print ridership_df.iloc[0,3]\n", "print ridership_df.loc['05-01-11', 'R006']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Get a 2D Numpy array from a Pandas Dataframe:\n", "\n", "This will output a 2D array with no rows or columns. Useful for taking the mean of all the values. Make sure data types are consistent." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0 0 2 5 0]\n", " [1478 3877 3674 2328 2539]\n", " [1613 4088 3991 6461 2691]\n", " [1560 3392 3826 4787 2613]\n", " [1608 4802 3932 4477 2705]\n", " [1576 3933 3909 4979 2685]\n", " [ 95 229 255 496 201]\n", " [ 2 0 1 27 0]\n", " [1438 3785 3589 4174 2215]\n", " [1342 4043 4009 4665 3033]]\n", "2342.6\n" ] } ], "source": [ "print ridership_df.values\n", "print ridership_df.values.mean()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'R006'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Maxmimum number of riders on the first day \n", "ridership_df.iloc[0].argmax()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We rewrite the mean_riders_for_max_station function, but this time the input is a Pandas DataFrame rather than a 2D NumPy array. The main differences:\n", "* iloc[0] instead of [0,:] to access a row\n", "* [max_station] instead of [:, max_station] to access a column\n", "* .values.mean() instead of .mean() to get the overall mean instead of a series of means" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2342.5999999999999, 3239.9000000000001)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def mean_riders_for_max_station(ridership):\n", " # Max riders on day 1 station\n", " max_station = ridership.iloc[0].argmax() \n", " # Mean riders per day for max station\n", " mean_for_max = ridership[max_station].mean()\n", " overall_mean = ridership.values.mean()\n", " return (overall_mean, mean_for_max)\n", "\n", "mean_riders_for_max_station(ridership_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Same result regardless of whether we used numpy arrays or pandas dataframe. \n", "\n", "Loading Data into a Dataframe\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Read in file\n", "subway_df = pd.read_csv('nyc_subway_weather.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead of printing all the rows of the data, print the first 4 rows only using .head()." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UNITDATEnTIMEnENTRIESnEXITSnENTRIESn_hourlyEXITSn_hourlydatetimehourday_week...pressureiraintempiwspdimeanprecipimeanpressureimeantempimeanwspdiweather_latweather_lon
0R00305-01-1100:00:00438833329110020.00.02011-05-01 00:00:0006...30.22055.93.50.030.25855.987.8640.700348-73.887177
1R00305-01-1104:00:00438833329110020.00.02011-05-01 04:00:0046...30.25052.03.50.030.25855.987.8640.700348-73.887177
2R00305-01-1112:00:00438833329110020.00.02011-05-01 12:00:00126...30.28062.16.90.030.25855.987.8640.700348-73.887177
3R00305-01-1116:00:00438833329110020.00.02011-05-01 16:00:00166...30.26057.915.00.030.25855.987.8640.700348-73.887177
4R00305-01-1120:00:00438833329110020.00.02011-05-01 20:00:00206...30.28052.010.40.030.25855.987.8640.700348-73.887177
\n", "

5 rows × 27 columns

\n", "
" ], "text/plain": [ " UNIT DATEn TIMEn ENTRIESn EXITSn ENTRIESn_hourly \\\n", "0 R003 05-01-11 00:00:00 4388333 2911002 0.0 \n", "1 R003 05-01-11 04:00:00 4388333 2911002 0.0 \n", "2 R003 05-01-11 12:00:00 4388333 2911002 0.0 \n", "3 R003 05-01-11 16:00:00 4388333 2911002 0.0 \n", "4 R003 05-01-11 20:00:00 4388333 2911002 0.0 \n", "\n", " EXITSn_hourly datetime hour day_week ... pressurei \\\n", "0 0.0 2011-05-01 00:00:00 0 6 ... 30.22 \n", "1 0.0 2011-05-01 04:00:00 4 6 ... 30.25 \n", "2 0.0 2011-05-01 12:00:00 12 6 ... 30.28 \n", "3 0.0 2011-05-01 16:00:00 16 6 ... 30.26 \n", "4 0.0 2011-05-01 20:00:00 20 6 ... 30.28 \n", "\n", " rain tempi wspdi meanprecipi meanpressurei meantempi meanwspdi \\\n", "0 0 55.9 3.5 0.0 30.258 55.98 7.86 \n", "1 0 52.0 3.5 0.0 30.258 55.98 7.86 \n", "2 0 62.1 6.9 0.0 30.258 55.98 7.86 \n", "3 0 57.9 15.0 0.0 30.258 55.98 7.86 \n", "4 0 52.0 10.4 0.0 30.258 55.98 7.86 \n", "\n", " weather_lat weather_lon \n", "0 40.700348 -73.887177 \n", "1 40.700348 -73.887177 \n", "2 40.700348 -73.887177 \n", "3 40.700348 -73.887177 \n", "4 40.700348 -73.887177 \n", "\n", "[5 rows x 27 columns]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "subway_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Number of rows in our dataframe:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "42649" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(subway_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use the describe() function to see some statistics about each column." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ENTRIESnEXITSnENTRIESn_hourlyEXITSn_hourlyhourday_weekweekdaylatitudelongitudefog...pressureiraintempiwspdimeanprecipimeanpressureimeantempimeanwspdiweather_latweather_lon
count4.264900e+044.264900e+0442649.00000042649.00000042649.00000042649.00000042649.00000042649.00000042649.00000042649.000000...42649.00000042649.00000042649.00000042649.00000042649.00000042649.00000042649.00000042649.00000042649.00000042649.000000
mean2.812486e+071.986993e+071886.5899551361.48786610.0467542.9057190.71443640.724647-73.9403640.009824...29.9710960.22474163.1037806.9278720.00461829.97109663.1037806.92787240.728555-73.938693
std3.043607e+072.028986e+072952.3855852183.8454096.9389282.0792310.4516880.0716500.0597130.098631...0.1379420.4174178.4555974.5101780.0163440.1311586.9390113.1798320.0654200.059582
min0.000000e+000.000000e+000.0000000.0000000.0000000.0000000.00000040.576152-74.0736220.000000...29.5500000.00000046.9000000.0000000.00000029.59000049.4000000.00000040.600204-74.014870
25%1.039762e+077.613712e+06274.000000237.0000004.0000001.0000000.00000040.677107-73.9873420.000000...29.8900000.00000057.0000004.6000000.00000029.91333358.2833334.81666740.688591-73.985130
50%1.818389e+071.331609e+07905.000000664.00000012.0000003.0000001.00000040.717241-73.9534590.000000...29.9600000.00000061.0000006.9000000.00000029.95800060.9500006.16666740.720570-73.949150
75%3.263049e+072.393771e+072255.0000001537.00000016.0000005.0000001.00000040.759123-73.9077330.000000...30.0600000.00000069.1000009.2000000.00000030.06000067.4666678.85000040.755226-73.912033
max2.357746e+081.493782e+0832814.00000034828.00000020.0000006.0000001.00000040.889185-73.7553831.000000...30.3200001.00000086.00000023.0000000.15750030.29333379.80000017.08333340.862064-73.694176
\n", "

8 rows × 21 columns

\n", "
" ], "text/plain": [ " ENTRIESn EXITSn ENTRIESn_hourly EXITSn_hourly \\\n", "count 4.264900e+04 4.264900e+04 42649.000000 42649.000000 \n", "mean 2.812486e+07 1.986993e+07 1886.589955 1361.487866 \n", "std 3.043607e+07 2.028986e+07 2952.385585 2183.845409 \n", "min 0.000000e+00 0.000000e+00 0.000000 0.000000 \n", "25% 1.039762e+07 7.613712e+06 274.000000 237.000000 \n", "50% 1.818389e+07 1.331609e+07 905.000000 664.000000 \n", "75% 3.263049e+07 2.393771e+07 2255.000000 1537.000000 \n", "max 2.357746e+08 1.493782e+08 32814.000000 34828.000000 \n", "\n", " hour day_week weekday latitude longitude \\\n", "count 42649.000000 42649.000000 42649.000000 42649.000000 42649.000000 \n", "mean 10.046754 2.905719 0.714436 40.724647 -73.940364 \n", "std 6.938928 2.079231 0.451688 0.071650 0.059713 \n", "min 0.000000 0.000000 0.000000 40.576152 -74.073622 \n", "25% 4.000000 1.000000 0.000000 40.677107 -73.987342 \n", "50% 12.000000 3.000000 1.000000 40.717241 -73.953459 \n", "75% 16.000000 5.000000 1.000000 40.759123 -73.907733 \n", "max 20.000000 6.000000 1.000000 40.889185 -73.755383 \n", "\n", " fog ... pressurei rain tempi \\\n", "count 42649.000000 ... 42649.000000 42649.000000 42649.000000 \n", "mean 0.009824 ... 29.971096 0.224741 63.103780 \n", "std 0.098631 ... 0.137942 0.417417 8.455597 \n", "min 0.000000 ... 29.550000 0.000000 46.900000 \n", "25% 0.000000 ... 29.890000 0.000000 57.000000 \n", "50% 0.000000 ... 29.960000 0.000000 61.000000 \n", "75% 0.000000 ... 30.060000 0.000000 69.100000 \n", "max 1.000000 ... 30.320000 1.000000 86.000000 \n", "\n", " wspdi meanprecipi meanpressurei meantempi meanwspdi \\\n", "count 42649.000000 42649.000000 42649.000000 42649.000000 42649.000000 \n", "mean 6.927872 0.004618 29.971096 63.103780 6.927872 \n", "std 4.510178 0.016344 0.131158 6.939011 3.179832 \n", "min 0.000000 0.000000 29.590000 49.400000 0.000000 \n", "25% 4.600000 0.000000 29.913333 58.283333 4.816667 \n", "50% 6.900000 0.000000 29.958000 60.950000 6.166667 \n", "75% 9.200000 0.000000 30.060000 67.466667 8.850000 \n", "max 23.000000 0.157500 30.293333 79.800000 17.083333 \n", "\n", " weather_lat weather_lon \n", "count 42649.000000 42649.000000 \n", "mean 40.728555 -73.938693 \n", "std 0.065420 0.059582 \n", "min 40.600204 -74.014870 \n", "25% 40.688591 -73.985130 \n", "50% 40.720570 -73.949150 \n", "75% 40.755226 -73.912033 \n", "max 40.862064 -73.694176 \n", "\n", "[8 rows x 21 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "subway_df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Linear correlation between two variables using pearson's r\n", "\n", "* Standardize each variable by converting it to a number of standard deviations above or below the mean. This will help scale the data. The further a data point is from the x,y axis, the larger the contribution to the pearson's r value.\n", "* Multiply each pair of values and take the average of the products. This will split the data into four quadrants where the data is either both above/below.\n", "* Value should be from -1 to +1\n", "\n", "Note: Numpy has a corrcoef() function as awell." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Function to compute linear correlation between 2 variables\n", "def correlation(x, y): # input can be a numpy 2d array or panda series \n", " # Standardize data\n", " std_x = (x - x.mean()) / x.std(ddof=0) #\"ddof=0\" for panda's uncorrected std function \n", " std_y = (y - y.mean()) / y.std(ddof=0)\n", " return (std_x * std_y).mean()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Get columns of data\n", "entries = subway_df['ENTRIESn_hourly']\n", "cum_entries = subway_df['ENTRIESn']\n", "rain = subway_df['meanprecipi']\n", "temp = subway_df['meantempi']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How to interpret pearson's r results:\n", "\n", "* Postive \"r\" value. As one value increases, the other value increases:\n", " * Both values above the mean, product is positive from (+,+)\n", " * Both values below the mean, product is positive from (-,-)\n", "\n", "* Negative \"r\" value. As one value increases, the other value decreases:\n", " * One value above the mean, other value below the mean, product is negative from (-, +) \n", " * One value above the mean, other value below the mean, product is negative from (+, -) \n", " \n", "* If value is near 0, then poor correlation between two variables\n", "\n", "\n", "Applying pearson's r to subway data:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.035648515772244052" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "correlation(entries, rain)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Subway entries and rain \n", "* small positive correlation\n", "* more rain correlated with more subway entries\n" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "-0.026693348321570803" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "correlation(entries, temp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Subway entries and temperature \n", "* small negative correlation\n", "* higher temperature correlated with lower subway entries\n", "* lower temperature correlated with higher subway entries" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.22903432340843488" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "correlation(rain, temp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rain and temperature \n", "* medium negative correlation \n", "* higher rain correlated with lower temperature \n", "* lower rain correlated with higher temperature" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "0.58589547076620752" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "correlation(entries, cum_entries)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Subway daily entries and cummulative subway entries \n", "* high positive correlation \n", "* high cummulative subway entries correlated with high daily entries" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas Means and Axis Names \n", "* For axis = 0 or axis = 'index', the mean of each column is taken\n", "* For axis = 1 or axis = 'columns', the mean of each row is taken\n", "\n", "\n", "Pandas and Vectorized Operations \n", "* Match up elements by index and columns instead of position ( as in numpy 2d arrays)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Convert Total Entries and Exits to Hourly Entries and Exits\n", "\n", "The subway data included the cummulative number of entries and exits by riders. We do not want the cummulative data, instead we want the hourly number of entries and exits. This can be done using two methods." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Sample data: DF with total entries (column1) and total exits (column2)\n", "entries_and_exits = pd.DataFrame({\n", " 'ENTRIESn': [3144312, 3144335, 3144353, 3144424, 3144594,\n", " 3144808, 3144895, 3144905, 3144941, 3145094],\n", " 'EXITSn': [1088151, 1088159, 1088177, 1088231, 1088275,\n", " 1088317, 1088328, 1088331, 1088420, 1088753]\n", "})" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ENTRIESnEXITSn
0NaNNaN
123.08.0
218.018.0
371.054.0
4170.044.0
5214.042.0
687.011.0
710.03.0
836.089.0
9153.0333.0
\n", "
" ], "text/plain": [ " ENTRIESn EXITSn\n", "0 NaN NaN\n", "1 23.0 8.0\n", "2 18.0 18.0\n", "3 71.0 54.0\n", "4 170.0 44.0\n", "5 214.0 42.0\n", "6 87.0 11.0\n", "7 10.0 3.0\n", "8 36.0 89.0\n", "9 153.0 333.0" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Method 1 : Write a function \n", "\n", "# Use shift(1) which shifts index by period of 1\n", "def get_hourly_entries_and_exits(entries_and_exits):\n", " # Subtract value from each previous row \n", " return entries_and_exits - entries_and_exits.shift(1)\n", "get_hourly_entries_and_exits(entries_and_exits)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ENTRIESn EXITSn\n", "0 NaN NaN\n", "1 23.0 8.0\n", "2 18.0 18.0\n", "3 71.0 54.0\n", "4 170.0 44.0\n", "5 214.0 42.0\n", "6 87.0 11.0\n", "7 10.0 3.0\n", "8 36.0 89.0\n", "9 153.0 333.0\n" ] } ], "source": [ "# Method 2: Builtin .diff() function\n", "print entries_and_exits.diff() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas and non built-in functions \n", "* write a helper function\n", "* applymap() function maps a function element to element\n", "\n", "For dataframes the applymap() and apply() functions do different things. \n", "* apply(): applies helper on each column/series. \n", " * Can get max value from each column using df.apply(np.max) \n", "* applymap(): applies helper to each element \n", "\n", "Example: Get the second largest value in each column " ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Helper for single column\n", "def second_largest_in_column(column):\n", " # Sort column in descending order. Find second value.\n", " sorted_column = column.sort_values(ascending=False)\n", " return sorted_column.iloc(1) # Second value at position 1\n", "\n", "# Apply function to a df \n", "def second_largest(df):\n", " return df.apply(second_largest_in_column)\n", "\n", "# second_largest(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas addition of dataframes and series \n", "\n", "* dataframe + dataframe = dataframe \n", "* series + series = series \n", "* dataframe + series = ???\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2 3\n", "0 11 52 93 134\n", "1 21 62 103 144\n", "2 31 72 113 154\n", "3 41 82 123 164\n" ] } ], "source": [ "# Series + Square dataFrame 0,1,2,3 column/index names \n", "s = pd.Series([1, 2, 3, 4])\n", "df = pd.DataFrame({\n", " 0: [10, 20, 30, 40],\n", " 1: [50, 60, 70, 80],\n", " 2: [90, 100, 110, 120],\n", " 3: [130, 140, 150, 160]\n", "})\n", "\n", "# Each value of the series was added to each column of the dataframe\n", "print df + s" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2 3\n", "0 11 22 33 44\n" ] } ], "source": [ "# Series + one-row DataFrame \n", "s = pd.Series([1, 2, 3, 4])\n", "df = pd.DataFrame({0: [10], 1: [20], 2: [30], 3: [40]})\n", "\n", "# Each value of the series was added to each column of the dataframe\n", "# Same as above \n", "print df + s" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2 3\n", "0 11 NaN NaN NaN\n", "1 21 NaN NaN NaN\n", "2 31 NaN NaN NaN\n", "3 41 NaN NaN NaN\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0
011
122
233
344
\n", "
" ], "text/plain": [ " 0\n", "0 11\n", "1 22\n", "2 33\n", "3 44" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Series + one-column DataFrame\n", "s = pd.Series([1, 2, 3, 4])\n", "df = pd.DataFrame({0: [10, 20, 30, 40]}) # one column\n", "\n", "# First column had 1 added, the rest were NaNs\n", "print df + s\n", "\n", "# df.add(s, axis = 'columns') \n", "df.add(s, axis = 'rows') # Each value of series added to one row " ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 11 52 93 134\n", "1 21 62 103 144\n", "2 31 72 113 154\n", "3 41 82 123 164\n" ] } ], "source": [ "# DataFrame column with name + Series index with name ( matching names)\n", "\n", "s = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])\n", "df = pd.DataFrame({\n", " 'a': [10, 20, 30, 40],\n", " 'b': [50, 60, 70, 80],\n", " 'c': [90, 100, 110, 120],\n", " 'd': [130, 140, 150, 160]\n", "})\n", "print df + s" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2 3 a b c d\n", "0 NaN NaN NaN NaN NaN NaN NaN NaN\n", "1 NaN NaN NaN NaN NaN NaN NaN NaN\n", "2 NaN NaN NaN NaN NaN NaN NaN NaN\n", "3 NaN NaN NaN NaN NaN NaN NaN NaN\n" ] } ], "source": [ "# DataFrame column with name + Series index with name ( non- matching names)\n", "s = pd.Series([1, 2, 3, 4])\n", "df = pd.DataFrame({\n", " 'a': [10, 20, 30, 40],\n", " 'b': [50, 60, 70, 80],\n", " 'c': [90, 100, 110, 120],\n", " 'd': [130, 140, 150, 160]\n", "})\n", "\n", "# No match between indexes --> NaN\n", "print df + s" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Standardizing rows/columns using vector operations without apply() \n" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
exam1exam2
Andre4324
Barry8163
Chris7856
Dan7556
Emilio8967
Fred7051
Greta9179
Humbert6546
Ivan9872
James8760
\n", "
" ], "text/plain": [ " exam1 exam2\n", "Andre 43 24\n", "Barry 81 63\n", "Chris 78 56\n", "Dan 75 56\n", "Emilio 89 67\n", "Fred 70 51\n", "Greta 91 79\n", "Humbert 65 46\n", "Ivan 98 72\n", "James 87 60" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Example dataset using grades and names of students \n", "grades_df = pd.DataFrame(\n", " data={'exam1': [43, 81, 78, 75, 89, 70, 91, 65, 98, 87],\n", " 'exam2': [24, 63, 56, 56, 67, 51, 79, 46, 72, 60]},\n", " index=['Andre', 'Barry', 'Chris', 'Dan', 'Emilio', \n", " 'Fred', 'Greta', 'Humbert', 'Ivan', 'James']\n", ")\n", "grades_df" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "exam1 77.7\n", "exam2 57.4\n", "dtype: float64" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades_df.mean()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
exam1exam2
Andre-2.196525-2.186335
Barry0.2088910.366571
Chris0.018990-0.091643
Dan-0.170911-0.091643
Emilio0.7152950.628408
Fred-0.487413-0.418938
Greta0.8418961.413917
Humbert-0.803916-0.746234
Ivan1.2849990.955703
James0.5886940.170194
\n", "
" ], "text/plain": [ " exam1 exam2\n", "Andre -2.196525 -2.186335\n", "Barry 0.208891 0.366571\n", "Chris 0.018990 -0.091643\n", "Dan -0.170911 -0.091643\n", "Emilio 0.715295 0.628408\n", "Fred -0.487413 -0.418938\n", "Greta 0.841896 1.413917\n", "Humbert -0.803916 -0.746234\n", "Ivan 1.284999 0.955703\n", "James 0.588694 0.170194" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Subtract mean1 from column1 and mean2 from column2\n", "# Divide each column by it's standard deviation \n", "\n", "(grades_df - grades_df.mean() )/ grades_df.std()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
exam1exam2
Andre0.707107-0.707107
Barry0.707107-0.707107
Chris0.707107-0.707107
Dan0.707107-0.707107
Emilio0.707107-0.707107
Fred0.707107-0.707107
Greta0.707107-0.707107
Humbert0.707107-0.707107
Ivan0.707107-0.707107
James0.707107-0.707107
\n", "
" ], "text/plain": [ " exam1 exam2\n", "Andre 0.707107 -0.707107\n", "Barry 0.707107 -0.707107\n", "Chris 0.707107 -0.707107\n", "Dan 0.707107 -0.707107\n", "Emilio 0.707107 -0.707107\n", "Fred 0.707107 -0.707107\n", "Greta 0.707107 -0.707107\n", "Humbert 0.707107 -0.707107\n", "Ivan 0.707107 -0.707107\n", "James 0.707107 -0.707107" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Standardize by rows, set axis = columns to get mean of each row \n", "# Subtract means from rows using sub() and axis = 'index'\n", "mean_diffs = grades_df.sub(grades_df.mean(axis='columns'), axis='index')\n", "\n", "# Divide by standard deviation - same values since only 2 columns \n", "mean_diffs.div(grades_df.std(axis='columns'), axis ='index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas Groupby() function \n", "\n", "General idea: Group data then aggregate data by taking an average within the group. Pandas has the following built-in functions:\n", "* group_data()\n", "* sum_grouped_items()\n" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
above_threeevenvalue
aFalseFalse1
bFalseFalse3
cFalseTrue2
dTrueTrue4
eFalseFalse1
fTrueTrue6
gTrueTrue4
\n", "
" ], "text/plain": [ " above_three even value\n", "a False False 1\n", "b False False 3\n", "c False True 2\n", "d True True 4\n", "e False False 1\n", "f True True 6\n", "g True True 4" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Example dataframe\n", "values = np.array([1, 3, 2, 4, 1, 6, 4])\n", "example_df = pd.DataFrame({\n", " 'value': values,\n", " 'even': values % 2 == 0,\n", " 'above_three': values > 3 \n", "}, index=['a', 'b', 'c', 'd', 'e', 'f', 'g'])\n", "\n", "example_df" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{False: Index([u'a', u'b', u'e'], dtype='object'), True: Index([u'c', u'd', u'f', u'g'], dtype='object')}\n" ] } ], "source": [ "# Groups\n", "grouped_data = example_df.groupby('even')\n", "# The groups attribute is a dictionary mapping keys to lists of row indexes\n", "print grouped_data.groups" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{(True, False): Index([u'c'], dtype='object'), (False, False): Index([u'a', u'b', u'e'], dtype='object'), (True, True): Index([u'd', u'f', u'g'], dtype='object')}\n" ] } ], "source": [ "# Group by multiple columns\n", "grouped_data = example_df.groupby(['even', 'above_three'])\n", "print grouped_data.groups" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " above_three value\n", "even \n", "False 0.0 5\n", "True 3.0 16\n" ] } ], "source": [ "# Get sum of each group\n", "grouped_data = example_df.groupby('even')\n", "print grouped_data.sum()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "even\n", "False 5\n", "True 16\n", "Name: value, dtype: int64\n" ] } ], "source": [ "# Limit columns in result\n", "grouped_data = example_df.groupby('even')\n", "print grouped_data.sum()['value']" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "even\n", "False 5\n", "True 16\n", "Name: value, dtype: int64\n" ] } ], "source": [ "# Subset of columns from the grouped data before collapsing to a dataframe\n", "# Same results\n", "print grouped_data['value'].sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas groupby() function applied to NYC subway data \n", "\n", "Question1: How does ridership vary by hour of the day?\n", "* For each hour of the day, group the data \n", "* For each hour of the day, find average ridership \n", "\n", "Question2 : How does rain affect subway ridership?\n", "* Break data into two groups 1) raining 2) non-raining \n", "* Compare ridership between two groups\n", "\n", "Question3: How does ridership vary by day of week?\n", "* For each day of the week, group the data\n", "* For each day of the week, find average ridership " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Question3 Solution: How does ridership vary by day of week?\n", "\n" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UNITDATEnTIMEnENTRIESnEXITSnENTRIESn_hourlyEXITSn_hourlydatetimehourday_week...pressureiraintempiwspdimeanprecipimeanpressureimeantempimeanwspdiweather_latweather_lon
0R00305-01-1100:00:00438833329110020.00.02011-05-01 00:00:0006...30.22055.93.50.030.25855.987.8640.700348-73.887177
1R00305-01-1104:00:00438833329110020.00.02011-05-01 04:00:0046...30.25052.03.50.030.25855.987.8640.700348-73.887177
2R00305-01-1112:00:00438833329110020.00.02011-05-01 12:00:00126...30.28062.16.90.030.25855.987.8640.700348-73.887177
3R00305-01-1116:00:00438833329110020.00.02011-05-01 16:00:00166...30.26057.915.00.030.25855.987.8640.700348-73.887177
4R00305-01-1120:00:00438833329110020.00.02011-05-01 20:00:00206...30.28052.010.40.030.25855.987.8640.700348-73.887177
\n", "

5 rows × 27 columns

\n", "
" ], "text/plain": [ " UNIT DATEn TIMEn ENTRIESn EXITSn ENTRIESn_hourly \\\n", "0 R003 05-01-11 00:00:00 4388333 2911002 0.0 \n", "1 R003 05-01-11 04:00:00 4388333 2911002 0.0 \n", "2 R003 05-01-11 12:00:00 4388333 2911002 0.0 \n", "3 R003 05-01-11 16:00:00 4388333 2911002 0.0 \n", "4 R003 05-01-11 20:00:00 4388333 2911002 0.0 \n", "\n", " EXITSn_hourly datetime hour day_week ... pressurei \\\n", "0 0.0 2011-05-01 00:00:00 0 6 ... 30.22 \n", "1 0.0 2011-05-01 04:00:00 4 6 ... 30.25 \n", "2 0.0 2011-05-01 12:00:00 12 6 ... 30.28 \n", "3 0.0 2011-05-01 16:00:00 16 6 ... 30.26 \n", "4 0.0 2011-05-01 20:00:00 20 6 ... 30.28 \n", "\n", " rain tempi wspdi meanprecipi meanpressurei meantempi meanwspdi \\\n", "0 0 55.9 3.5 0.0 30.258 55.98 7.86 \n", "1 0 52.0 3.5 0.0 30.258 55.98 7.86 \n", "2 0 62.1 6.9 0.0 30.258 55.98 7.86 \n", "3 0 57.9 15.0 0.0 30.258 55.98 7.86 \n", "4 0 52.0 10.4 0.0 30.258 55.98 7.86 \n", "\n", " weather_lat weather_lon \n", "0 40.700348 -73.887177 \n", "1 40.700348 -73.887177 \n", "2 40.700348 -73.887177 \n", "3 40.700348 -73.887177 \n", "4 40.700348 -73.887177 \n", "\n", "[5 rows x 27 columns]" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check headers first\n", "subway_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The hourly data of the dataframe is taken in four hour intervals. " ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hour\n", "0 1403.248441\n", "4 311.717653\n", "8 879.029929\n", "12 3010.949693\n", "16 2306.527816\n", "20 3226.240093\n", "Name: ENTRIESn_hourly, dtype: float64\n" ] } ], "source": [ "# Question 1\n", "ridership_by_hour = subway_df.groupby('hour').mean()['ENTRIESn_hourly']\n", "print ridership_by_hour" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot data in four hour intervals \n", "# ridership_by_hour.plot()\n", "ridership_by_hour.plot.bar()\n", "title('4-Hour Intervals vs Subway Ridership')\n", "ylabel('Number of Subway Riders')\n", "xlabel('Time (4hr intervals)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Above is a plot of the ridership data vs four hour interval units. Highest ridership between the following intervals:\n", "* 12pm - 4pm \n", "* 4pm - 8pm\n", "* 8pm - 12am \n", "\n", "More useful to plot hourly entries and exits for each station (UNIT)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "scrolled": true }, "outputs": [], "source": [ "ex_ridership_df2 = pd.DataFrame({\n", " 'UNIT': ['R051', 'R079', 'R051', 'R079', 'R051', 'R079', 'R051', 'R079', 'R051'],\n", " 'TIMEn': ['00:00:00', '02:00:00', '04:00:00', '06:00:00', '08:00:00', '10:00:00', '12:00:00', '14:00:00', '16:00:00'],\n", " 'ENTRIESn': [3144312, 8936644, 3144335, 8936658, 3144353, 8936687, 3144424, 8936819, 3144594],\n", " 'EXITSn': [1088151, 13755385, 1088159, 13755393, 1088177, 13755598, 1088231, 13756191, 1088275]\n", "})" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ENTRIESn EXITSn\n", "0 NaN NaN\n", "1 NaN NaN\n", "2 23.0 8.0\n", "3 14.0 8.0\n", "4 18.0 18.0\n", "5 29.0 205.0\n", "6 71.0 54.0\n", "7 132.0 593.0\n", "8 170.0 44.0\n" ] } ], "source": [ "# Hourly entries and exits for each station (UNIT)\n", "def hourly_for_group(entries_and_exits):\n", " return entries_and_exits - entries_and_exits.shift(1)\n", "\n", "ridership_by_station = ex_ridership_df2.groupby('UNIT')['ENTRIESn', 'EXITSn'].apply(hourly_for_group)\n", "print ridership_by_station" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nYrykscBY4CLgGGBIehwAXJ+em2TdunXU1tayZs2a5voMHVbXrl0ZMGAAnTv7/i9mHVHVEkS649Zh\npEXD0oJjayUdD4xI1W4iWxXzIrI7U/0irXn/RGp99IuIRU05b21tLT169GDQoEFsvDqyNUVEsHz5\ncmpraxk8eHDR4ZhZAarZxfRusuWZf67sHsM/Tcsg96370U/PdStX9qfk5iNkNx4pvdFLLmvWrGGH\nHXZwcthMkthhhx3cEjPrwKqZILYE9gGuj4hhZPcaHluhfrlf9HesAyLpLElTJU1dunRp+QM5OTQL\nf49mHVs1E0QtUBsRT6bXE8kSxuK6u2al5yUl9QeWvL/snakiYkJEDI+I4X36NHqdRyE6depETU3N\nhsf48eMBGDFiBMOHD99Qb+rUqYwYMYIHHnhgQ93u3buz++67U1NTw6mnnsrkyZPp2bMnw4YNY+jQ\noVx44YUb3n/jjTdyzjnnADBu3Dj69++/0XlXrlzJG2+8wSmnnMJee+3F+973Pg455BBee+21lv1C\nzKxNqtoYRES8JGmhpN0jYi5wJPC39BhDdsOSMWQ3HIHsNpPnSLqFbHD6laaOP5QzaOx9m3uIjSwY\nf1yjdbp168aMGTPK7luyZAm///3vOeaYYzaUHXXUURx11FFAlkS+973vbUgkkydP5tBDD+Xee+9l\n9erVDBs2jI997GMcfPDB7zj2+eefv1ECAbjiiivo27cvs2bNAmDu3LkedDZrzLieOeq8Uv04Clbt\n6yC+BPxa0kygBvgvssTwIUnzgA+l15DdLvI5srth/YSm3YmrzfjqV7/K5Zdfvknv7datGzU1Nfzr\nX43eYnmDRYsW0b//20M5u+++O126dGHBggXssccenHnmmey5556MGjWK1atXb1JcZtY+VTVBRMSM\n1B20d0ScEBErImJ5RBwZEUPS88upbkTE2RHxnojYK91GsU1avXr1Rl09t95664Z9Bx10EF26dGHS\npElNPu6KFSuYN28ehx12WNn9V1111YZzjhw5EoDPfOYzXHnllRx00EFccsklzJs3b0P9efPmcfbZ\nZzN79mx69erFb3/72ybHZGbtV5tei6m1qtTFBHDJJZdw+eWXc+WVV+Y63mOPPcbee+/N3LlzGTt2\nLDvttFPZeuW6mGpqanjuued48MEH+eMf/8h+++3H448/Trdu3Rg8eDA1NTUA7LvvvixYsCDfBzSz\nDsFLbRTgiCOOYM2aNTzxxBO56h966KHMnDmTWbNmcf3111dMPuV0796d0aNHc9111/GpT32K+++/\nH4AuXbpsqNOpUyfWr1/fpOOaWfvmBFGQiy++mO9+97tNes9uu+3G17/+9dwtD4A///nPrFixAoC1\na9fyt7/9jV122aVJ5zWzjskJogrqj0GMHfvOyz+OPfZYNmWa7uc//3mmTJnC888//459pWMQNTU1\nLFiwgGeffZbDDz+cvfbai2HDhjF8+HA+/vGPb9LnMrOOpU3fk3r48OFR/34Qc+bMYY899igoovbH\n36d1SO18mqukaRExvLF6bkGYmVlZThBmZlaWE4SZmZXlBGFmZmU5QZiZWVlOEGZmVpYTRBWUW+77\nzTffZN9992XKlCkb6o0aNYrbb78dgEGDBrF48eIN79lpp502Wr577dq1fOc732HPPfdk7733pqam\nhieffLKhEMzMNlv7X4spz3zmJh2v8bnPDa3FdN111/HZz36W6dOnM3HiRCRx4oknbtjfqVOnDe8b\nN24c3bt337C20uOPP869997L9OnT6dKlC8uWLWPt2rXN9KHMzN6p/SeIVuSAAw7gAx/4AOPGjePm\nm2/moYceyv3eRYsW0bt37w3rJ/Xu3XvDvkGDBjFmzBjuuece1q1bx+23387QoUObPX4z61jcxVQF\nlZb7vuKKK7j66qv55Cc/ya677pr7mKNGjWLhwoXstttufPGLX+TRRx/daH/v3r2ZPn06X/jCF/je\n977XbJ/FzDoutyCqoNJy31OmTKFnz54888wzTTpm9+7dmTZtGo899hiTJk3i5JNPZvz48Zx22mkA\njB49GsiW7b7jjjs2K34zM3ALokW9/vrrfO1rX+ORRx5h6dKlG5bdzqtTp06MGDGCyy67jGuvvXaj\nG/zUdT152W4zay5OEC3oW9/6FieddBJDhw7luuuu4/zzz2fNmjW53jt37tyN7gY3Y8YML9ttZlXl\nLqYqqBuDqHP00Udz6qmncuedd/LXv/4VyO70dtRRR3HllVdy6aWXNnrM1157jS996UusXLmSLbfc\nkl133ZUJEyZU7TOYmXm5b6vI36d1SF7uG3AXk5mZNcAJwszMynKCMDOzstplgmjL4yqtib9Hs46t\n3SWIrl27snz5cv+4baaIYPny5XTt2rXoUMysIO1umuuAAQOora1l6dKlRYfS5nXt2pUBAwYUHYaZ\nFaSqCULSAuBV4E1gfUQMl7Q9cCswCFgAnBQRKyQJ+CFwLPAGcFpETG/qOTt37szgwYOb5wOYmXVg\nLdHFNDIiakrm3I4FHo6IIcDD6TXAMcCQ9DgLuL4FYjMzswYUMQZxPHBT2r4JOKGk/BeReQLoJalf\nAfGZmRnVTxABPChpmqSzUlnfiFgEkJ53TOX9gYUl761NZWZmVoBqD1IfHBEvStoReEjS3yvUVZmy\nd0xFSonmLICdd965eaI0M7N3qGoLIiJeTM9LgDuB/YHFdV1H6XlJql4LDCx5+wDgxTLHnBARwyNi\neJ8+faoZvplZh9akBCFpC0nb5qy7jaQeddvAKOAZ4G5gTKo2Brgrbd8NnKrMgcArdV1RZmbW8hrt\nYpJ0M/B5sqmq04Cekn4QEf/dyFv7Andms1fZErg5Iv4g6SngNklnAC8AJ6b695NNcZ1PNs319E34\nPGZm1kzyjEG8NyJWSTqF7Ef8IrJEUTFBRMRzwPvLlC8HjixTHsDZeYI2M7Pqy9PF1FlSZ7LpqHdF\nxDrKDB6bmVn7kidB/IjsiudtgCmSdgFWVTMoMzMrXsUuJklbAIsjon9J2QvAyGoHZmZmxarYgoiI\nt4Bz6pVFRKyvalRmZla4PF1MD0m6UNJASdvXPaoemZmZFSrPLKbPpOfSGUYBvLv5wzEzs9ai0QQR\nEV4728ysA2q0i0nS1pIukTQhvR4i6cPVD83MzIqUZwzi58Ba4APpdS1wedUiMjOzViFPgnhPRHwX\nWAcQEaspv/KqmZm1I3kSxFpJ3UhXT0t6D/DvqkZlZmaFyzOL6VLgD8BASb8GDgZOq2ZQZmZWvDyz\nmB6SNB04kKxr6dyIWFb1yMzMrFANJghJ+9Qrqrs3w86Sdo6I6dULy8zMilapBfH99NwVGA78lawF\nsTfwJHBIdUMzM7MiNThIHREjI2Ik8E9gn3Sbz32BYWQ39TEzs3YszyymoRExq+5FRDwD1FQvJDMz\naw3yzGKaI+mnwK/Iprp+CphT1ajMzKxweRLE6cAXgHPT6ynA9VWLyMzMWoU801zXAFelh5mZdRCV\nprneFhEnSZpFmXtQR8TeVY3MzMwKVakFUdel5JVbzcw6oAYTREQsSs//LC2X1An4D7Lpr2Zm1k41\nOM1V0raSvi7pWkmjlPkS8BxwUsuFaGZmRajUxfRLYAXwOPBZ4KvAVsDxETGjBWIzM7MCVUoQ746I\nvQDSdRDLgJ0j4tUWiczMzApV6UrqdXUbEfEm8PymJAdJnSQ9Lene9HqwpCclzZN0q6StUnmX9Hp+\n2j+oqecyM7PmUylBvF/SqvR4Fdi7blvSqiac41w2vvL6SuCqiBhC1oV1Rio/A1gREbuSXXNxZRPO\nYWZmzazSYn2dImLb9OgREVuWbG+b5+CSBgDHAT9NrwUcAUxMVW4CTkjbx6fXpP1HpvpmZlaAPIv1\nbY6rga8Bb6XXOwArI2J9el0L9E/b/YGFAGn/K6m+mZkVoGoJQtKHgSURMa20uEzVyLGv9LhnSZoq\naerSpUubIVIzMyunmi2Ig4GPSloA3ELWtXQ10EtS3eypAcCLabsWGAiQ9vcEXq5/0IiYkO5NMbxP\nnz5VDN/MrGNrNEFIOkfSdk09cER8PSIGRMQgsiuvH4mIU4BJwCdStTHAXWn77vSatP+RiHhHC8LM\nzFpGnhbETsBTkm6TdHQzDBxfBHxF0nyyMYYbUvkNwA6p/CvA2M08j5mZbYY8y31fIun/AaPI7g1x\nraTbgBsi4tk8J4mIycDktP0csH+ZOmuAE3NHbmZmVZVrDCJ19byUHuuB7YCJkr5bxdjMzKxAjbYg\nJH2ZbGxgGdn1DF+NiHWStgDmkU1jNTOzdibPLUd7A6PrL/sdEW+lqaxmZtYO5RmD+CaApB2BriXl\nL0TEnAbfaGZmbVqeaa4fkTQPeB54FFgA/L7KcZmZWcHyDFJfDhwI/CMiBgNHAn+ualRmZla4PAli\nXUQsB7aQtEVETAJqqhyXmZkVLM8g9UpJ3YEpwK8lLSGb6mpmZu1YnhbE8cAbwPnAH4BngY9UMygz\nMytenhbEycBjETGPt+/XYGZm7VyeBDEI+FS6BehU4DGyhDGjemGZmVnRGu1iiohvRsQRwJ7An4Cv\nAtMqv8vMzNq6PEttXEJ2b4fuwNPAhWStCDMza8fydDGNJpu1dB/ZhXJPpJVXzcysHcvTxbQP2cVx\nfwE+BMyS9KdqB2ZmZsXK08X0PuBQ4HBgOLAQdzGZmbV7ebqYriS7SO4a4KmIWFfdkMzMrDXIs5rr\ncZK2AoYCQyXNjYi11Q/NzMyKlKeL6Vjgx2RXUAsYLOlzEeEVXc3M2rE8XUw/AEZGxHwASe8hm9Hk\nBGFm1o7lWYtpSV1ySJ4DllQpHjMzayUabEFIGp02Z0u6H7gNCOBE4KkWiM3MzApUqYupdMXWxWTT\nXAGWAttVLSIzM2sVGkwQEXF6SwZiZmatS55ZTD8n61raSER8pioRmZlZq5BnFtO9JdtdgY8BL1Yn\nHDMzay3yXCj329LXkn4D/LGx90nqSnYFdpd0nokRcamkwcAtwPbAdODTEbFWUhfgF8C+wHLg5IhY\n0LSPY2ZmzSXPNNf6hgA756j3b+CIiHg/UAMcLelAsqU7roqIIcAK4IxU/wxgRUTsClyV6pmZWUEa\nTRCSXpW0qu4ZuAe4qLH3Rea19LJzegRwBDAxld8EnJC2j+ftW5pOBI6UpNyfxMzMmlWeLqYem3pw\nSZ3I7j63K/C/ZMt1rIyI9alKLdA/bfcnWymWiFgv6RVgB2DZpp7fzMw2XYMtCEm7SOpZ8nqkpB9K\nOj8t3teoiHgzImqAAcD+wB7lqtWdosK+0rjOkjRV0tSlS5fmCcPMzDZBpS6m24BtACTVALcDL5CN\nJ1zXlJNExEpgMnAg0EtSXctlAG/PiKoFBqbzbQn0BF4uc6wJETE8Iob36dOnKWGYmVkTVEoQ3SKi\n7sf7U8DPIuL7wOlkrYGKJPWR1CttdwM+CMwBJgGfSNXGAHel7bvTa9L+RyLiHS0IMzNrGZXGIEq7\nfI4Avg4QEW/lHDvuB9yUxiG2AG6LiHsl/Q24RdLlwNPADan+DcAvJc0nazn8R5M+iZmZNatKCeIR\nSbcBi8jWXnoEQFI/oNEbBkXETGBYmfLnKNMCiYg1ZAsBmplZK1ApQZwHnEzWEjik5FajOwEXVzsw\nMzMrVqXF+oLsiuf65U9XNSIzM2sVNuVKajMz6wCcIMzMrKxKF8o9nJ69JpKZWQdUaZC6n6TDgY9K\nuoV6VzpHxPSqRmZmZoWqlCC+CYwlu9r5B/X21S26Z2Zm7VSlWUwTgYmS/l9EfLsFYzIzs1Ygz2qu\n35b0UeCwVDQ5Iu6t9B4zM2v78twP4grgXOBv6XFuKjMzs3Yszz2pjwNqIuItAEk3ka2h9PVqBmZm\nZsXKex1Er5Ltng3WMjOzdiNPC+IK4GlJk8imuh6GWw9mZu1enkHq30iaDOxHliAuioiXqh2YmZkV\nK08LgohYRHZDHzMz6yC8FpOZmZXlBGFmZmVVTBCStpD0TEsFY2ZmrUfFBJGuffirpJ1bKB4zM2sl\n8gxS9wNmS/oL8HpdYUR8tGpRmZlZ4fIkiMuqHoWZmbU6ea6DeFTSLsCQiPijpK2BTtUPzczMipRn\nsb4zgYnAj1NRf+B31QzKzMyKl2ea69nAwcAqgIiYB+xYzaDMzKx4eRLEvyNibd0LSVuS3VHOzMza\nsTwJ4lFJ3wC6SfoQcDtwT3XDMjOzouVJEGOBpcAs4HPA/cAljb1J0kBJkyTNkTRb0rmpfHtJD0ma\nl563S+WSdI2k+ZJmStpn0z+WmZltrjyzmN5KNwl6kqxraW5E5OliWg9cEBHTJfUApkl6CDgNeDgi\nxksaS5aALgKOAYakxwHA9enZzMwK0GiCkHQc8CPgWbLlvgdL+lxE/L7S+9IKsIvS9quS5pDNgDoe\nGJGq3QRMJksQxwO/SMnnCUm9JPVLxzGz5jAux/2+xr1S/TisTchzodz3gZERMR9A0nuA+4CKCaKU\npEHAMLJWSN+6H/2IWCSpbkZUf2BhydtqU5kThJlZAfKMQSypSw7Jc8CSvCeQ1B34LXBeRKyqVLVM\n2Tu6siSdJWmqpKlLly7NG4aZmTVRgy0ISaPT5mxJ9wO3kf1gnwg8lefgkjqTJYdfR8QdqXhxXdeR\npH68nWxqgYElbx8AvFj/mBExAZgAMHz4cE+3NTOrkkotiI+kR1dgMXA42djBUmC7xg4sScANwJyI\n+EHJrruBMWl7DHBXSfmpaTbTgcArHn8wMytOgy2IiDh9M499MPBpYJakGansG8B44DZJZwAvkLVI\nIJs+eywwH3gD2Nzzm5nZZsgzi2kw8CVgUGn9xpb7jog/UX5cAeDIMvWDbFkPMzNrBfLMYvodWVfR\nPcBb1Q3HzMxaizwJYk1EXFP1SMzMrFXJkyB+KOlS4EHg33WFETG9alGZmVnh8iSIvcgGm4/g7S6m\nSK/NzKydypMgPga8u3TJbzMza//yJIi/Ar1owtXTZmaW36Cx9zVaZ8H441ogko3lSRB9gb9LeoqN\nxyAqTnM1M7O2LU+CuLTqUZiZWauT534Qj7ZEIGZm1rrkuZL6Vd5eVXUroDPwekRsW83AzMysWHla\nED1KX0s6Adi/ahGZmVmrkOd+EBuJiN/hayDMzNq9PF1Mo0tebgEMp8yNfMzMrH3JM4vpIyXb64EF\nZPePNjOzdizPGITvy2Bm1gFVuuXoNyu8LyLi21WIx8zMWolKLYjXy5RtA5wB7AA4QZiZtWOVbjn6\n/bptST2Ac8luA3oL8P2G3mdmZu1DxTEISdsDXwFOAW4C9omIFS0RmJlZNeRaGK9rCwTSBlQag/hv\nYDQwAdgrIl5rsajMzKxwlS6UuwB4F3AJ8KKkVenxqqRVLROemZkVpdIYRJOvsjYzs/bDScDMzMpy\ngjAzs7KcIMzMrCwnCDMzK6tqCULSzyQtkfRMSdn2kh6SNC89b5fKJekaSfMlzZS0T7XiMjOzfKrZ\ngrgROLpe2Vjg4YgYAjycXgMcAwxJj7OA66sYl5mZ5VC1BBERU4CX6xUfT3ZFNun5hJLyX0TmCaCX\npH7Vis3MzBrX0mMQfSNiEUB63jGV9wcWltSrTWVmZlaQ1jJIrTJlZe9aJ+ksSVMlTV26dGmVwzIz\n67haOkEsrus6Ss9LUnktMLCk3gDgxXIHiIgJETE8Iob36dOnqsGamXVkLZ0g7gbGpO0xwF0l5aem\n2UwHAq/UdUWZmVkx8tyTepNI+g0wAugtqRa4FBgP3CbpDOAF4MRU/X7gWGA+8AbZfSfMzKxAVUsQ\nEfGfDew6skzdAM6uVixmZtZ0rWWQ2szMWhknCDMzK8sJwszMynKCMDOzspwgzMysrKrNYjIzGzT2\nvkbrLBh/XAtEYpvCLQgzMyvLCcLMzMpygjAzs7KcIMzMrCwnCDMzK8uzmMysWON65qjzSvXjsHdw\nC8LMzMpygjAzs7LcxWRm1hbk6YqDZu2OcwvCzMzKcoIwM7OynCDMzKwsJwgzMyvLg9Rm7UCeVVMB\nFnStciDWrrgFYWZmZbkFYRt47X4zK+UWhJmZleUWhFkT5Wppdf1kvoN5jSFrxdyCMDOzstyCsFbN\n4yJmxWlVLQhJR0uaK2m+pLFFx2Nm1pG1mhaEpE7A/wIfAmqBpyTdHRF/KzYy20hrXLu/gEXMzDqC\n1tSC2B+YHxHPRcRa4Bbg+IJjMjPrsBQRRccAgKRPAEdHxGfT608DB0TEOfXqnQWclV7uDsxtphB6\nA8ua6VjNxTHl45jya41xOaZ8mjOmXSKiT2OVWk0XE6AyZe/IXhExAZjQ7CeXpkbE8OY+7uZwTPk4\npvxaY1yOKZ8iYmpNXUy1wMCS1wOAFwuKxcysw2tNCeIpYIikwZK2Av4DuLvgmMzMOqxW08UUEesl\nnQM8AHQCfhYRs1swhGbvtmoGjikfx5Rfa4zLMeXT4jG1mkFqMzNrXVpTF5OZmbUiThBmZlaWE4SZ\nmZXVIROEpKGSLpJ0jaQfpu09io6rNUrf1ZGSutcrP7rAmPaXtF/afq+kr0g6tqh4ypH0i6JjKCXp\nkPQ9jSo4jgMkbZu2u0m6TNI9kq6UlHPNlGaP6cuSBjZes+VI2krSqZI+mF5/UtK1ks6W1LnF4uho\ng9SSLgI12EKoAAAGIklEQVT+k2wpj9pUPIBsWu0tETG+qNgaIun0iPh5Aef9MnA2MAeoAc6NiLvS\nvukRsU8BMV0KHEM2A+8h4ABgMvBB4IGI+E4BMdWfji1gJPAIQER8tICY/hIR+6ftM8n+O94JjALu\nKerfuaTZwPvTrMUJwBvARODIVD66gJheAV4HngV+A9weEUtbOo56Mf2a7N/41sBKoDtwB9n3pIgY\n0yKBRESHegD/ADqXKd8KmFd0fA3E/EJB550FdE/bg4CpZEkC4OkCY+qU/sdZBWybyrsBMwuKaTrw\nK2AEcHh6XpS2Dy8opqdLtp8C+qTtbYBZRcSUzj+n9Hurt29GUd8VWW/KKOAGYCnwB2AM0KOgmGam\n5y2BxUCn9Fot+e+81VwH0YLeAt4F/LNeeb+0rxCSZja0C+jbkrGU6BQRrwFExAJJI4CJknah/NIo\nLWF9RLwJvCHp2YhYleJbLamo/37DgXOBi4GvRsQMSasj4tGC4gHYQtJ2ZD98ivQXcUS8Lml9gXE9\nU9Ii/quk4RExVdJuwLqCYoqIeAt4EHgwdeEcQ9bT8D2g0TWLqmCLdMHwNmR/DPUEXga6AC3WxdQR\nE8R5wMOS5gELU9nOwK7AOQ2+q/r6AkcBK+qVC/i/lg8HgJck1UTEDICIeE3Sh4GfAXsVFNNaSVtH\nxBvAvnWFqf+6kASRflyuknR7el5M8f9v9QSmkf37CUk7RcRLaSypqOQO8Fngh5IuIVt47nFJC8n+\nX/xsQTFt9H1ExDqyVRzultStmJC4Afg7WWv5YuB2Sc8BB5J1j7eIDjcGASBpC7LlxfuT/eOoBZ5K\nf5kWFdMNwM8j4k9l9t0cETlvctysMQ0g+4v9pTL7Do6IPxcQU5eI+HeZ8t5Av4iY1dIxlYnlOODg\niPhG0bHUJ2lroG9EPF9wHD2Ad5Ml0tqIWFxgLLtFxD+KOn9DJL0LICJelNSLbJzthYj4S4vF0BET\nhJmZNa5DTnM1M7PGOUGYmVlZThDWpkm6WNJsSTMlzZB0QCo/L/W3N/b+jepJuj/1925uXOMkvSFp\nx5Ky1zb3uOk4gyQ90xzHMqvECcLaLEkHAR8G9omIvckG8epmpp1HNj2wMRvVi4hjI2JlM4W4DLig\nmY7VbCQVPcPK2ggnCGvL+gHL6mY1RcSyNOPjy2TXukySNAlA0vWSpqbWxmWprFy9BWlGFGlpimfS\n47xUNkjSHEk/Scd6sMJUyJ8BJ0vavrSwfgtA0oWSxqXtyZKukjQlnWc/SXdImifp8pLDbCnpptRy\nmljXCpK0r6RHJU2T9ICkfiXH/S9Jj5Jds2HWKCcIa8seBAZK+oek6yQdDhAR15DdrnZkRIxMdS+O\n7H6+ewOHS9q7gXpA9kMLnE62lMeBwJmShqXdQ4D/jYg9yZZB+HgD8b1GliSa+oO8NiIOA34E3EW2\nTMb7gNMk7ZDq7A5MSC2nVcAX0wVe/wN8IiL2TecuXXqkV0QcHhHfb2I81kE5QVibla7y3hc4i2x5\nhFslndZA9ZMkTSdbVmFP4L2NHP4Q4M6IeD2d5w7g0LTv+bqLB8kuRhtU4TjXAGOUFqjLqW5tp1nA\n7IhYlFpJz/H2fdsXllyH8qsU7+5kieQhSTOAS8jWGatzaxNiMCv8ak+zzZIubpwMTJY0i2z9nBtL\n60gaDFwI7BcRKyTdCHRt5NCVrjYuvVDvTbJ1oBqKb6Wkm4EvlhSvZ+M/zurHUnf8t+qd6y3e/n+2\n/gVMkWKeHREHNRDO6w3FaVaOWxDWZknaXdKQkqIa3l5j61WgR9reluzH8RVJfcnW2aFMvVJTgBMk\nbS1pG+BjwGObGOoPgM/x9o/7YmBHSTtI6kI20N5UO6dBesjWDPoTMBfoU1cuqbOkPTcxZjO3IKxN\n6w78T5qWuh6YT9bdBNkN3n8vaVFEjJT0NDCbrJumdImQjerVFUbE9NTSqFvW4KcR8bSkQU0NMiKW\nSboTOD+9XifpW8CTwPNka+401RyyrqsfA/OA6yNiraRPANektam2BK4m+9xmTealNszMrCx3MZmZ\nWVlOEGZmVpYThJmZleUEYWZmZTlBmJlZWU4QZmZWlhOEmZmV5QRhZmZl/X8p3DmNyjxjfgAAAABJ\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# By station:\n", "# ridership_by_station.plot()\n", "ridership_by_station.plot.bar()\n", "title('Stations vs Ridership')\n", "xlabel('Station Number')\n", "ylabel('Number of Subway Riders')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Joining multiple Pandas Dataframes \n", "\n", "Note: this is unrelated to the NY subway dataset\n", "\n", "* Pandas merge() function joins multiple tables \n", "* Types of joins: inner, left, right \n" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "# This is unrelated to the NY subway dataset\n", "ex_subway_df = pd.DataFrame({\n", " 'UNIT': ['R003', 'R003', 'R003', 'R003', 'R003', 'R004', 'R004', 'R004',\n", " 'R004', 'R004'],\n", " 'DATEn': ['05-01-11', '05-02-11', '05-03-11', '05-04-11', '05-05-11',\n", " '05-01-11', '05-02-11', '05-03-11', '05-04-11', '05-05-11'],\n", " 'hour': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", " 'ENTRIESn': [ 4388333, 4388348, 4389885, 4391507, 4393043, 14656120,\n", " 14656174, 14660126, 14664247, 14668301],\n", " 'EXITSn': [ 2911002, 2911036, 2912127, 2913223, 2914284, 14451774,\n", " 14451851, 14454734, 14457780, 14460818],\n", " 'latitude': [ 40.689945, 40.689945, 40.689945, 40.689945, 40.689945,\n", " 40.69132 , 40.69132 , 40.69132 , 40.69132 , 40.69132 ],\n", " 'longitude': [-73.872564, -73.872564, -73.872564, -73.872564, -73.872564,\n", " -73.867135, -73.867135, -73.867135, -73.867135, -73.867135]\n", "})\n", "\n", "ex_weather_df = pd.DataFrame({\n", " 'DATEn': ['05-01-11', '05-01-11', '05-02-11', '05-02-11', '05-03-11',\n", " '05-03-11', '05-04-11', '05-04-11', '05-05-11', '05-05-11'],\n", " 'hour': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", " 'latitude': [ 40.689945, 40.69132 , 40.689945, 40.69132 , 40.689945,\n", " 40.69132 , 40.689945, 40.69132 , 40.689945, 40.69132 ],\n", " 'longitude': [-73.872564, -73.867135, -73.872564, -73.867135, -73.872564,\n", " -73.867135, -73.872564, -73.867135, -73.872564, -73.867135],\n", " 'pressurei': [ 30.24, 30.24, 30.32, 30.32, 30.14, 30.14, 29.98, 29.98,\n", " 30.01, 30.01],\n", " 'fog': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", " 'rain': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", " 'tempi': [ 52. , 52. , 48.9, 48.9, 54. , 54. , 57.2, 57.2, 48.9, 48.9],\n", " 'wspdi': [ 8.1, 8.1, 6.9, 6.9, 3.5, 3.5, 15. , 15. , 15. , 15. ]\n", "})" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DATEnENTRIESnEXITSnUNIThourlatitudelongitudefogpressureiraintempiwspdi
005-01-1143883332911002R003040.689945-73.872564030.24052.08.1
105-02-1143883482911036R003040.689945-73.872564030.32048.96.9
205-03-1143898852912127R003040.689945-73.872564030.14054.03.5
305-04-1143915072913223R003040.689945-73.872564029.98057.215.0
405-05-1143930432914284R003040.689945-73.872564030.01048.915.0
505-01-111465612014451774R004040.691320-73.867135030.24052.08.1
605-02-111465617414451851R004040.691320-73.867135030.32048.96.9
705-03-111466012614454734R004040.691320-73.867135030.14054.03.5
805-04-111466424714457780R004040.691320-73.867135029.98057.215.0
905-05-111466830114460818R004040.691320-73.867135030.01048.915.0
\n", "
" ], "text/plain": [ " DATEn ENTRIESn EXITSn UNIT hour latitude longitude fog \\\n", "0 05-01-11 4388333 2911002 R003 0 40.689945 -73.872564 0 \n", "1 05-02-11 4388348 2911036 R003 0 40.689945 -73.872564 0 \n", "2 05-03-11 4389885 2912127 R003 0 40.689945 -73.872564 0 \n", "3 05-04-11 4391507 2913223 R003 0 40.689945 -73.872564 0 \n", "4 05-05-11 4393043 2914284 R003 0 40.689945 -73.872564 0 \n", "5 05-01-11 14656120 14451774 R004 0 40.691320 -73.867135 0 \n", "6 05-02-11 14656174 14451851 R004 0 40.691320 -73.867135 0 \n", "7 05-03-11 14660126 14454734 R004 0 40.691320 -73.867135 0 \n", "8 05-04-11 14664247 14457780 R004 0 40.691320 -73.867135 0 \n", "9 05-05-11 14668301 14460818 R004 0 40.691320 -73.867135 0 \n", "\n", " pressurei rain tempi wspdi \n", "0 30.24 0 52.0 8.1 \n", "1 30.32 0 48.9 6.9 \n", "2 30.14 0 54.0 3.5 \n", "3 29.98 0 57.2 15.0 \n", "4 30.01 0 48.9 15.0 \n", "5 30.24 0 52.0 8.1 \n", "6 30.32 0 48.9 6.9 \n", "7 30.14 0 54.0 3.5 \n", "8 29.98 0 57.2 15.0 \n", "9 30.01 0 48.9 15.0 " ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This is unrelated to the NY subway dataset\n", "# JOIN two tables\n", "ex_subway_df.merge(ex_weather_df, on =['DATEn', 'hour', 'latitude', 'longitude'], how = 'inner' )\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualizing Data \n", "* Data1: A scatterplot of subway stations with latitude and longitude as the x and y axes and ridership as the bubble size\n", "* Data2: Histograms of subway ridership for days with rain and days without rain\n", "* Data3: A scatterplot with subway ridership on one axis and precipitation or temperature on the other" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ENTRIESnEXITSnENTRIESn_hourlyEXITSn_hourlyhourday_weekweekdayfogprecipipressureiraintempiwspdimeanprecipimeanpressureimeantempimeanwspdiweather_latweather_lon
latitudelongitude
40.576152-73.9759259.659049e+068.641132e+06403.896175325.95628410.0327872.9071040.7158470.0109290.00628429.9725680.22950863.3836075.5530050.00628429.97256863.3836075.55300540.603489-73.958763
40.576298-73.9685238.306897e+066.646823e+06526.697297419.5621629.9891892.9513510.7081080.0108110.00621629.9732970.22702763.3751355.5178380.00621629.97329763.3751355.51783840.603489-73.958763
40.577961-73.9618064.552910e+074.612408e+071950.2956991930.48387110.0000002.9354840.7096770.0107530.00618329.9731180.22580663.3940865.5317200.00618329.97311863.3940865.53172040.603489-73.958763
40.589547-73.9742957.268214e+067.961334e+06485.382353362.94117610.1647062.9058820.7058820.0117650.00611829.9711760.20000063.6505885.6305880.00611829.97117663.6505885.63058840.603489-73.958763
40.590867-73.7970116.477945e+065.994957e+06500.725610374.62804910.0975612.9512200.7195120.0243900.00274429.9810980.19512261.7213419.9451220.00274429.98109861.7213419.94512240.660004-73.844849
\n", "
" ], "text/plain": [ " ENTRIESn EXITSn ENTRIESn_hourly \\\n", "latitude longitude \n", "40.576152 -73.975925 9.659049e+06 8.641132e+06 403.896175 \n", "40.576298 -73.968523 8.306897e+06 6.646823e+06 526.697297 \n", "40.577961 -73.961806 4.552910e+07 4.612408e+07 1950.295699 \n", "40.589547 -73.974295 7.268214e+06 7.961334e+06 485.382353 \n", "40.590867 -73.797011 6.477945e+06 5.994957e+06 500.725610 \n", "\n", " EXITSn_hourly hour day_week weekday fog \\\n", "latitude longitude \n", "40.576152 -73.975925 325.956284 10.032787 2.907104 0.715847 0.010929 \n", "40.576298 -73.968523 419.562162 9.989189 2.951351 0.708108 0.010811 \n", "40.577961 -73.961806 1930.483871 10.000000 2.935484 0.709677 0.010753 \n", "40.589547 -73.974295 362.941176 10.164706 2.905882 0.705882 0.011765 \n", "40.590867 -73.797011 374.628049 10.097561 2.951220 0.719512 0.024390 \n", "\n", " precipi pressurei rain tempi wspdi \\\n", "latitude longitude \n", "40.576152 -73.975925 0.006284 29.972568 0.229508 63.383607 5.553005 \n", "40.576298 -73.968523 0.006216 29.973297 0.227027 63.375135 5.517838 \n", "40.577961 -73.961806 0.006183 29.973118 0.225806 63.394086 5.531720 \n", "40.589547 -73.974295 0.006118 29.971176 0.200000 63.650588 5.630588 \n", "40.590867 -73.797011 0.002744 29.981098 0.195122 61.721341 9.945122 \n", "\n", " meanprecipi meanpressurei meantempi meanwspdi \\\n", "latitude longitude \n", "40.576152 -73.975925 0.006284 29.972568 63.383607 5.553005 \n", "40.576298 -73.968523 0.006216 29.973297 63.375135 5.517838 \n", "40.577961 -73.961806 0.006183 29.973118 63.394086 5.531720 \n", "40.589547 -73.974295 0.006118 29.971176 63.650588 5.630588 \n", "40.590867 -73.797011 0.002744 29.981098 61.721341 9.945122 \n", "\n", " weather_lat weather_lon \n", "latitude longitude \n", "40.576152 -73.975925 40.603489 -73.958763 \n", "40.576298 -73.968523 40.603489 -73.958763 \n", "40.577961 -73.961806 40.603489 -73.958763 \n", "40.589547 -73.974295 40.603489 -73.958763 \n", "40.590867 -73.797011 40.660004 -73.844849 " ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Data1 : Group data by longitude and latitude. Then find the mean\n", "data_by_location = subway_df.groupby(['latitude', 'longitude']).mean()\n", "data_by_location.head()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 40.576152\n", "1 40.576298\n", "2 40.577961\n", "3 40.589547\n", "4 40.590867\n", "Name: latitude, dtype: float64\n", "0 -73.975925\n", "1 -73.968523\n", "2 -73.961806\n", "3 -73.974295\n", "4 -73.797011\n", "Name: longitude, dtype: float64\n" ] } ], "source": [ "# Only want longitude and latitude (row indexes) --> as_index=False\n", "data_by_location = subway_df.groupby(['latitude', 'longitude'], as_index=False).mean()\n", "print data_by_location.head()['latitude']\n", "print data_by_location.head()['longitude']" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Scatterplot with (x,y) as latitude,longitude and bubblesize = ridership\n", "# Scale bubble markers by dividing by std\n", "scaled_hourly_entries = (10 * data_by_location['ENTRIESn_hourly'] / data_by_location['ENTRIESn_hourly'].std() )\n", "plt.scatter(data_by_location['latitude'], data_by_location['longitude'], s=scaled_hourly_entries )\n", "title('Location and Ridership as Markers')\n", "xlabel('Latitude')\n", "ylabel('Longitude')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Can compare to a NYC subway map to get exact stations. High ridership in the following clusters.\n", "* longitude from - 73.95 to -74.03 \n", "* latitude from 40.70 to 40.79" ] } ], "metadata": { "kernelspec": { "display_name": "Python [cats]", "language": "python", "name": "Python [cats]" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.14" } }, "nbformat": 4, "nbformat_minor": 2 }