{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"tags": [
"remove_input"
]
},
"outputs": [],
"source": [
"path_data = '../../data/'\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import math\n",
"from scipy import stats\n",
"\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use('fivethirtyeight')\n",
"\n",
"import folium\n",
"from folium.plugins import MarkerCluster, BeautifyIcon\n",
"\n",
"import warnings\n",
"warnings.filterwarnings('ignore')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bike Sharing in the Bay Area\n",
"\n",
"We end this chapter by using all the methods we have learned to examine a new and large dataset. We will also introduce the [`folium`](https://python-visualization.github.io/folium/) module, a powerful visualization tool.\n",
"\n",
"The [Bay Area Bike Share](http://www.bayareabikeshare.com/) service published a [dataset](http://www.bayareabikeshare.com/open-data) describing every bicycle rental from September 2014 to August 2015 in their system. There were 354,152 rentals in all. The columns are:\n",
"\n",
"- An ID for the rental\n",
"- Duration of the rental, in seconds\n",
"- Start date\n",
"- Name of the Start Station and code for Start Terminal\n",
"- Name of the End Station and code for End Terminal\n",
"- A serial number for the bike\n",
"- Subscriber type and zip code \n",
"\n",
"[Python Folium](https://python-visualization.github.io/folium/)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Trip ID
\n",
"
Duration
\n",
"
Start Date
\n",
"
Start Station
\n",
"
Start Terminal
\n",
"
End Date
\n",
"
End Station
\n",
"
End Terminal
\n",
"
Bike #
\n",
"
Subscriber Type
\n",
"
Zip Code
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
913460
\n",
"
765
\n",
"
8/31/2015 23:26
\n",
"
Harry Bridges Plaza (Ferry Building)
\n",
"
50
\n",
"
8/31/2015 23:39
\n",
"
San Francisco Caltrain (Townsend at 4th)
\n",
"
70
\n",
"
288
\n",
"
Subscriber
\n",
"
2139
\n",
"
\n",
"
\n",
"
1
\n",
"
913459
\n",
"
1036
\n",
"
8/31/2015 23:11
\n",
"
San Antonio Shopping Center
\n",
"
31
\n",
"
8/31/2015 23:28
\n",
"
Mountain View City Hall
\n",
"
27
\n",
"
35
\n",
"
Subscriber
\n",
"
95032
\n",
"
\n",
"
\n",
"
2
\n",
"
913455
\n",
"
307
\n",
"
8/31/2015 23:13
\n",
"
Post at Kearny
\n",
"
47
\n",
"
8/31/2015 23:18
\n",
"
2nd at South Park
\n",
"
64
\n",
"
468
\n",
"
Subscriber
\n",
"
94107
\n",
"
\n",
"
\n",
"
3
\n",
"
913454
\n",
"
409
\n",
"
8/31/2015 23:10
\n",
"
San Jose City Hall
\n",
"
10
\n",
"
8/31/2015 23:17
\n",
"
San Salvador at 1st
\n",
"
8
\n",
"
68
\n",
"
Subscriber
\n",
"
95113
\n",
"
\n",
"
\n",
"
4
\n",
"
913453
\n",
"
789
\n",
"
8/31/2015 23:09
\n",
"
Embarcadero at Folsom
\n",
"
51
\n",
"
8/31/2015 23:22
\n",
"
Embarcadero at Sansome
\n",
"
60
\n",
"
487
\n",
"
Customer
\n",
"
9069
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
354147
\n",
"
432951
\n",
"
619
\n",
"
9/1/2014 4:21
\n",
"
Powell Street BART
\n",
"
39
\n",
"
9/1/2014 4:32
\n",
"
Townsend at 7th
\n",
"
65
\n",
"
335
\n",
"
Subscriber
\n",
"
94118
\n",
"
\n",
"
\n",
"
354148
\n",
"
432950
\n",
"
6712
\n",
"
9/1/2014 3:16
\n",
"
Harry Bridges Plaza (Ferry Building)
\n",
"
50
\n",
"
9/1/2014 5:08
\n",
"
San Francisco Caltrain (Townsend at 4th)
\n",
"
70
\n",
"
259
\n",
"
Customer
\n",
"
44100
\n",
"
\n",
"
\n",
"
354149
\n",
"
432949
\n",
"
538
\n",
"
9/1/2014 0:05
\n",
"
South Van Ness at Market
\n",
"
66
\n",
"
9/1/2014 0:14
\n",
"
5th at Howard
\n",
"
57
\n",
"
466
\n",
"
Customer
\n",
"
32
\n",
"
\n",
"
\n",
"
354150
\n",
"
432948
\n",
"
568
\n",
"
9/1/2014 0:05
\n",
"
South Van Ness at Market
\n",
"
66
\n",
"
9/1/2014 0:15
\n",
"
5th at Howard
\n",
"
57
\n",
"
461
\n",
"
Customer
\n",
"
32
\n",
"
\n",
"
\n",
"
354151
\n",
"
432947
\n",
"
569
\n",
"
9/1/2014 0:05
\n",
"
South Van Ness at Market
\n",
"
66
\n",
"
9/1/2014 0:15
\n",
"
5th at Howard
\n",
"
57
\n",
"
318
\n",
"
Customer
\n",
"
32
\n",
"
\n",
" \n",
"
\n",
"
354152 rows × 11 columns
\n",
"
"
],
"text/plain": [
" Trip ID Duration Start Date \\\n",
"0 913460 765 8/31/2015 23:26 \n",
"1 913459 1036 8/31/2015 23:11 \n",
"2 913455 307 8/31/2015 23:13 \n",
"3 913454 409 8/31/2015 23:10 \n",
"4 913453 789 8/31/2015 23:09 \n",
"... ... ... ... \n",
"354147 432951 619 9/1/2014 4:21 \n",
"354148 432950 6712 9/1/2014 3:16 \n",
"354149 432949 538 9/1/2014 0:05 \n",
"354150 432948 568 9/1/2014 0:05 \n",
"354151 432947 569 9/1/2014 0:05 \n",
"\n",
" Start Station Start Terminal End Date \\\n",
"0 Harry Bridges Plaza (Ferry Building) 50 8/31/2015 23:39 \n",
"1 San Antonio Shopping Center 31 8/31/2015 23:28 \n",
"2 Post at Kearny 47 8/31/2015 23:18 \n",
"3 San Jose City Hall 10 8/31/2015 23:17 \n",
"4 Embarcadero at Folsom 51 8/31/2015 23:22 \n",
"... ... ... ... \n",
"354147 Powell Street BART 39 9/1/2014 4:32 \n",
"354148 Harry Bridges Plaza (Ferry Building) 50 9/1/2014 5:08 \n",
"354149 South Van Ness at Market 66 9/1/2014 0:14 \n",
"354150 South Van Ness at Market 66 9/1/2014 0:15 \n",
"354151 South Van Ness at Market 66 9/1/2014 0:15 \n",
"\n",
" End Station End Terminal Bike # \\\n",
"0 San Francisco Caltrain (Townsend at 4th) 70 288 \n",
"1 Mountain View City Hall 27 35 \n",
"2 2nd at South Park 64 468 \n",
"3 San Salvador at 1st 8 68 \n",
"4 Embarcadero at Sansome 60 487 \n",
"... ... ... ... \n",
"354147 Townsend at 7th 65 335 \n",
"354148 San Francisco Caltrain (Townsend at 4th) 70 259 \n",
"354149 5th at Howard 57 466 \n",
"354150 5th at Howard 57 461 \n",
"354151 5th at Howard 57 318 \n",
"\n",
" Subscriber Type Zip Code \n",
"0 Subscriber 2139 \n",
"1 Subscriber 95032 \n",
"2 Subscriber 94107 \n",
"3 Subscriber 95113 \n",
"4 Customer 9069 \n",
"... ... ... \n",
"354147 Subscriber 94118 \n",
"354148 Customer 44100 \n",
"354149 Customer 32 \n",
"354150 Customer 32 \n",
"354151 Customer 32 \n",
"\n",
"[354152 rows x 11 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"trips = pd.read_csv(path_data + 'trip.csv')\n",
"trips"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll focus only on the *free trips*, which are trips that last less than 1800 seconds (half an hour). There is a charge for longer trips.\n",
"\n",
"The histogram below shows that most of the trips took around 10 minutes (600 seconds) or so. Very few took near 30 minutes (1800 seconds), possibly because people try to return the bikes before the cutoff time so as not to have to pay."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"commute = trips[trips['Duration'] < 1800]\n",
"\n",
"unit = 'Seconds'\n",
"\n",
"fig, ax1 = plt.subplots()\n",
"\n",
"ax1.hist(commute['Duration'], 10, density=True, ec='white')\n",
"\n",
"y_vals = ax1.get_yticks()\n",
"\n",
"y_label = 'Percent per ' + (unit if unit else 'unit')\n",
"\n",
"x_label = 'Duration (' + (unit if unit else 'unit') + ')'\n",
"\n",
"ax1.set_yticklabels(['{:g}'.format(x * 100) for x in y_vals])\n",
"\n",
"plt.ylabel(y_label)\n",
"\n",
"plt.xlabel(x_label)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can get more detail by specifying a larger number of bins. But the overall shape doesn't change much."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"commute = trips[trips['Duration'] < 1800]\n",
"\n",
"unit = 'Seconds'\n",
"\n",
"fig, ax1 = plt.subplots()\n",
"\n",
"ax1.hist(commute['Duration'], 60, density=True, ec='white')\n",
"\n",
"y_vals = ax1.get_yticks()\n",
"\n",
"y_label = 'Percent per ' + (unit if unit else 'unit')\n",
"\n",
"x_label = 'Duration (' + (unit if unit else 'unit') + ')'\n",
"\n",
"ax1.set_yticklabels(['{:g}'.format(x * 100) for x in y_vals])\n",
"\n",
"plt.ylabel(y_label)\n",
"\n",
"plt.xlabel(x_label)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exploring the Data with `group` and `pivot`\n",
"\n",
"We can use `group` to identify the most highly used Start Station:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
count
\n",
"
\n",
"
\n",
"
Start Station
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
San Francisco Caltrain (Townsend at 4th)
\n",
"
25858
\n",
"
\n",
"
\n",
"
San Francisco Caltrain 2 (330 Townsend)
\n",
"
21523
\n",
"
\n",
"
\n",
"
Harry Bridges Plaza (Ferry Building)
\n",
"
15543
\n",
"
\n",
"
\n",
"
Temporary Transbay Terminal (Howard at Beale)
\n",
"
14298
\n",
"
\n",
"
\n",
"
2nd at Townsend
\n",
"
13674
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
Mezes Park
\n",
"
189
\n",
"
\n",
"
\n",
"
Redwood City Medical Center
\n",
"
139
\n",
"
\n",
"
\n",
"
San Mateo County Center
\n",
"
108
\n",
"
\n",
"
\n",
"
Redwood City Public Library
\n",
"
101
\n",
"
\n",
"
\n",
"
Franklin at Maple
\n",
"
62
\n",
"
\n",
" \n",
"
\n",
"
70 rows × 1 columns
\n",
"
"
],
"text/plain": [
" count\n",
"Start Station \n",
"San Francisco Caltrain (Townsend at 4th) 25858\n",
"San Francisco Caltrain 2 (330 Townsend) 21523\n",
"Harry Bridges Plaza (Ferry Building) 15543\n",
"Temporary Transbay Terminal (Howard at Beale) 14298\n",
"2nd at Townsend 13674\n",
"... ...\n",
"Mezes Park 189\n",
"Redwood City Medical Center 139\n",
"San Mateo County Center 108\n",
"Redwood City Public Library 101\n",
"Franklin at Maple 62\n",
"\n",
"[70 rows x 1 columns]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"starts = commute.groupby([\"Start Station\"]).agg(\n",
" count=pd.NamedAgg(column=\"Start Station\", aggfunc=\"count\")\n",
")\n",
"\n",
"starts.sort_values('count', ascending=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The largest number of trips started at the Caltrain Station on Townsend and 4th in San Francisco. People take the train into the city, and then use a shared bike to get to their next destination."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `group` method can also be used to classify the rentals by both Start Station and End Station."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
count
\n",
"
\n",
"
\n",
"
Start Station
\n",
"
End Station
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
2nd at Folsom
\n",
"
2nd at Folsom
\n",
"
54
\n",
"
\n",
"
\n",
"
2nd at South Park
\n",
"
295
\n",
"
\n",
"
\n",
"
2nd at Townsend
\n",
"
437
\n",
"
\n",
"
\n",
"
5th at Howard
\n",
"
113
\n",
"
\n",
"
\n",
"
Beale at Market
\n",
"
127
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
Yerba Buena Center of the Arts (3rd @ Howard)
\n",
"
Steuart at Market
\n",
"
202
\n",
"
\n",
"
\n",
"
Temporary Transbay Terminal (Howard at Beale)
\n",
"
113
\n",
"
\n",
"
\n",
"
Townsend at 7th
\n",
"
261
\n",
"
\n",
"
\n",
"
Washington at Kearny
\n",
"
66
\n",
"
\n",
"
\n",
"
Yerba Buena Center of the Arts (3rd @ Howard)
\n",
"
73
\n",
"
\n",
" \n",
"
\n",
"
1629 rows × 1 columns
\n",
"
"
],
"text/plain": [
" count\n",
"Start Station End Station \n",
"2nd at Folsom 2nd at Folsom 54\n",
" 2nd at South Park 295\n",
" 2nd at Townsend 437\n",
" 5th at Howard 113\n",
" Beale at Market 127\n",
"... ...\n",
"Yerba Buena Center of the Arts (3rd @ Howard) Steuart at Market 202\n",
" Temporary Transbay Terminal (Howard at Beale) 113\n",
" Townsend at 7th 261\n",
" Washington at Kearny 66\n",
" Yerba Buena Center of the Arts (3rd @ Howard) 73\n",
"\n",
"[1629 rows x 1 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commute_groupby = commute.groupby([\"Start Station\", \"End Station\"]).agg(\n",
" count=pd.NamedAgg(column=\"Start Station\", aggfunc=\"count\")\n",
")\n",
"\n",
"commute_groupby.sort_values(['Start Station', 'End Station'])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
count
\n",
"
\n",
"
\n",
"
Start Station
\n",
"
End Station
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
2nd at Folsom
\n",
"
2nd at Folsom
\n",
"
54
\n",
"
\n",
"
\n",
"
2nd at South Park
\n",
"
295
\n",
"
\n",
"
\n",
"
2nd at Townsend
\n",
"
437
\n",
"
\n",
"
\n",
"
5th at Howard
\n",
"
113
\n",
"
\n",
"
\n",
"
Beale at Market
\n",
"
127
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
Yerba Buena Center of the Arts (3rd @ Howard)
\n",
"
Steuart at Market
\n",
"
202
\n",
"
\n",
"
\n",
"
Temporary Transbay Terminal (Howard at Beale)
\n",
"
113
\n",
"
\n",
"
\n",
"
Townsend at 7th
\n",
"
261
\n",
"
\n",
"
\n",
"
Washington at Kearny
\n",
"
66
\n",
"
\n",
"
\n",
"
Yerba Buena Center of the Arts (3rd @ Howard)
\n",
"
73
\n",
"
\n",
" \n",
"
\n",
"
1629 rows × 1 columns
\n",
"
"
],
"text/plain": [
" count\n",
"Start Station End Station \n",
"2nd at Folsom 2nd at Folsom 54\n",
" 2nd at South Park 295\n",
" 2nd at Townsend 437\n",
" 5th at Howard 113\n",
" Beale at Market 127\n",
"... ...\n",
"Yerba Buena Center of the Arts (3rd @ Howard) Steuart at Market 202\n",
" Temporary Transbay Terminal (Howard at Beale) 113\n",
" Townsend at 7th 261\n",
" Washington at Kearny 66\n",
" Yerba Buena Center of the Arts (3rd @ Howard) 73\n",
"\n",
"[1629 rows x 1 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Or\n",
"\n",
"commute_groupby = commute.groupby([\"Start Station\", \"End Station\"]).agg(\n",
" count=pd.NamedAgg(column=\"Start Station\", aggfunc=\"count\")\n",
")\n",
"\n",
"commute_groupby.sort_values(['Start Station', 'End Station']).reset_index()\n",
"\n",
"commute_groupby"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Fifty-four trips both started and ended at the station on 2nd at Folsom. A much large number (437) were between 2nd at Folsom and 2nd at Townsend. \n",
"\n",
"The `pivot` method does the same classification but displays its results in a contingency table that shows all possible combinations of Start and End Stations, even though some of them didn't correspond to any trips. Remember that the first argument of a `pivot` statement specifies the column labels of the pivot table; the second argument labels the rows.\n",
"\n",
"There is a train station as well as a Bay Area Rapid Transit (BART) station near Beale at Market, explaining the high number of trips that start and end there."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
End Station
\n",
"
2nd at Folsom
\n",
"
2nd at South Park
\n",
"
2nd at Townsend
\n",
"
5th at Howard
\n",
"
Adobe on Almaden
\n",
"
Arena Green / SAP Center
\n",
"
Beale at Market
\n",
"
Broadway St at Battery St
\n",
"
California Ave Caltrain Station
\n",
"
Castro Street and El Camino Real
\n",
"
...
\n",
"
South Van Ness at Market
\n",
"
Spear at Folsom
\n",
"
St James Park
\n",
"
Stanford in Redwood City
\n",
"
Steuart at Market
\n",
"
Temporary Transbay Terminal (Howard at Beale)
\n",
"
Townsend at 7th
\n",
"
University and Emerson
\n",
"
Washington at Kearny
\n",
"
Yerba Buena Center of the Arts (3rd @ Howard)
\n",
"
\n",
"
\n",
"
Start Station
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
2nd at Folsom
\n",
"
54.0
\n",
"
295.0
\n",
"
437.0
\n",
"
113.0
\n",
"
0.0
\n",
"
0.0
\n",
"
127.0
\n",
"
67.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
46.0
\n",
"
327.0
\n",
"
0.0
\n",
"
0.0
\n",
"
128.0
\n",
"
414.0
\n",
"
347.0
\n",
"
0.0
\n",
"
142.0
\n",
"
83.0
\n",
"
\n",
"
\n",
"
2nd at South Park
\n",
"
190.0
\n",
"
164.0
\n",
"
151.0
\n",
"
177.0
\n",
"
0.0
\n",
"
0.0
\n",
"
79.0
\n",
"
89.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
41.0
\n",
"
209.0
\n",
"
0.0
\n",
"
0.0
\n",
"
224.0
\n",
"
437.0
\n",
"
309.0
\n",
"
0.0
\n",
"
142.0
\n",
"
180.0
\n",
"
\n",
"
\n",
"
2nd at Townsend
\n",
"
554.0
\n",
"
71.0
\n",
"
185.0
\n",
"
148.0
\n",
"
0.0
\n",
"
0.0
\n",
"
183.0
\n",
"
279.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
50.0
\n",
"
407.0
\n",
"
0.0
\n",
"
0.0
\n",
"
1644.0
\n",
"
486.0
\n",
"
418.0
\n",
"
0.0
\n",
"
72.0
\n",
"
174.0
\n",
"
\n",
"
\n",
"
5th at Howard
\n",
"
107.0
\n",
"
180.0
\n",
"
92.0
\n",
"
83.0
\n",
"
0.0
\n",
"
0.0
\n",
"
59.0
\n",
"
119.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
102.0
\n",
"
100.0
\n",
"
0.0
\n",
"
0.0
\n",
"
371.0
\n",
"
561.0
\n",
"
313.0
\n",
"
0.0
\n",
"
47.0
\n",
"
90.0
\n",
"
\n",
"
\n",
"
Adobe on Almaden
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
11.0
\n",
"
7.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
0.0
\n",
"
0.0
\n",
"
10.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
Temporary Transbay Terminal (Howard at Beale)
\n",
"
237.0
\n",
"
429.0
\n",
"
784.0
\n",
"
750.0
\n",
"
0.0
\n",
"
0.0
\n",
"
167.0
\n",
"
748.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
351.0
\n",
"
99.0
\n",
"
0.0
\n",
"
0.0
\n",
"
204.0
\n",
"
94.0
\n",
"
825.0
\n",
"
0.0
\n",
"
90.0
\n",
"
403.0
\n",
"
\n",
"
\n",
"
Townsend at 7th
\n",
"
342.0
\n",
"
143.0
\n",
"
417.0
\n",
"
200.0
\n",
"
0.0
\n",
"
0.0
\n",
"
35.0
\n",
"
50.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
366.0
\n",
"
336.0
\n",
"
0.0
\n",
"
0.0
\n",
"
276.0
\n",
"
732.0
\n",
"
132.0
\n",
"
0.0
\n",
"
29.0
\n",
"
153.0
\n",
"
\n",
"
\n",
"
University and Emerson
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
57.0
\n",
"
0.0
\n",
"
...
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
62.0
\n",
"
0.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
Washington at Kearny
\n",
"
17.0
\n",
"
63.0
\n",
"
57.0
\n",
"
43.0
\n",
"
0.0
\n",
"
0.0
\n",
"
64.0
\n",
"
79.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
25.0
\n",
"
24.0
\n",
"
0.0
\n",
"
0.0
\n",
"
31.0
\n",
"
98.0
\n",
"
53.0
\n",
"
0.0
\n",
"
55.0
\n",
"
36.0
\n",
"
\n",
"
\n",
"
Yerba Buena Center of the Arts (3rd @ Howard)
\n",
"
31.0
\n",
"
209.0
\n",
"
166.0
\n",
"
267.0
\n",
"
0.0
\n",
"
0.0
\n",
"
45.0
\n",
"
47.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
115.0
\n",
"
71.0
\n",
"
0.0
\n",
"
0.0
\n",
"
202.0
\n",
"
113.0
\n",
"
261.0
\n",
"
0.0
\n",
"
66.0
\n",
"
73.0
\n",
"
\n",
" \n",
"
\n",
"
70 rows × 70 columns
\n",
"
"
],
"text/plain": [
"End Station 2nd at Folsom \\\n",
"Start Station \n",
"2nd at Folsom 54.0 \n",
"2nd at South Park 190.0 \n",
"2nd at Townsend 554.0 \n",
"5th at Howard 107.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 237.0 \n",
"Townsend at 7th 342.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 17.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 31.0 \n",
"\n",
"End Station 2nd at South Park \\\n",
"Start Station \n",
"2nd at Folsom 295.0 \n",
"2nd at South Park 164.0 \n",
"2nd at Townsend 71.0 \n",
"5th at Howard 180.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 429.0 \n",
"Townsend at 7th 143.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 63.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 209.0 \n",
"\n",
"End Station 2nd at Townsend 5th at Howard \\\n",
"Start Station \n",
"2nd at Folsom 437.0 113.0 \n",
"2nd at South Park 151.0 177.0 \n",
"2nd at Townsend 185.0 148.0 \n",
"5th at Howard 92.0 83.0 \n",
"Adobe on Almaden 0.0 0.0 \n",
"... ... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 784.0 750.0 \n",
"Townsend at 7th 417.0 200.0 \n",
"University and Emerson 0.0 0.0 \n",
"Washington at Kearny 57.0 43.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 166.0 267.0 \n",
"\n",
"End Station Adobe on Almaden \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 11.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Arena Green / SAP Center \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 7.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Beale at Market \\\n",
"Start Station \n",
"2nd at Folsom 127.0 \n",
"2nd at South Park 79.0 \n",
"2nd at Townsend 183.0 \n",
"5th at Howard 59.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 167.0 \n",
"Townsend at 7th 35.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 64.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 45.0 \n",
"\n",
"End Station Broadway St at Battery St \\\n",
"Start Station \n",
"2nd at Folsom 67.0 \n",
"2nd at South Park 89.0 \n",
"2nd at Townsend 279.0 \n",
"5th at Howard 119.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 748.0 \n",
"Townsend at 7th 50.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 79.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 47.0 \n",
"\n",
"End Station California Ave Caltrain Station \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 57.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Castro Street and El Camino Real \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station ... South Van Ness at Market \\\n",
"Start Station ... \n",
"2nd at Folsom ... 46.0 \n",
"2nd at South Park ... 41.0 \n",
"2nd at Townsend ... 50.0 \n",
"5th at Howard ... 102.0 \n",
"Adobe on Almaden ... 0.0 \n",
"... ... ... \n",
"Temporary Transbay Terminal (Howard at Beale) ... 351.0 \n",
"Townsend at 7th ... 366.0 \n",
"University and Emerson ... 0.0 \n",
"Washington at Kearny ... 25.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) ... 115.0 \n",
"\n",
"End Station Spear at Folsom St James Park \\\n",
"Start Station \n",
"2nd at Folsom 327.0 0.0 \n",
"2nd at South Park 209.0 0.0 \n",
"2nd at Townsend 407.0 0.0 \n",
"5th at Howard 100.0 0.0 \n",
"Adobe on Almaden 0.0 10.0 \n",
"... ... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 99.0 0.0 \n",
"Townsend at 7th 336.0 0.0 \n",
"University and Emerson 0.0 0.0 \n",
"Washington at Kearny 24.0 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 71.0 0.0 \n",
"\n",
"End Station Stanford in Redwood City \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Steuart at Market \\\n",
"Start Station \n",
"2nd at Folsom 128.0 \n",
"2nd at South Park 224.0 \n",
"2nd at Townsend 1644.0 \n",
"5th at Howard 371.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 204.0 \n",
"Townsend at 7th 276.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 31.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 202.0 \n",
"\n",
"End Station Temporary Transbay Terminal (Howard at Beale) \\\n",
"Start Station \n",
"2nd at Folsom 414.0 \n",
"2nd at South Park 437.0 \n",
"2nd at Townsend 486.0 \n",
"5th at Howard 561.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 94.0 \n",
"Townsend at 7th 732.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 98.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 113.0 \n",
"\n",
"End Station Townsend at 7th \\\n",
"Start Station \n",
"2nd at Folsom 347.0 \n",
"2nd at South Park 309.0 \n",
"2nd at Townsend 418.0 \n",
"5th at Howard 313.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 825.0 \n",
"Townsend at 7th 132.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 53.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 261.0 \n",
"\n",
"End Station University and Emerson \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 62.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Washington at Kearny \\\n",
"Start Station \n",
"2nd at Folsom 142.0 \n",
"2nd at South Park 142.0 \n",
"2nd at Townsend 72.0 \n",
"5th at Howard 47.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 90.0 \n",
"Townsend at 7th 29.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 55.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 66.0 \n",
"\n",
"End Station Yerba Buena Center of the Arts (3rd @ Howard) \n",
"Start Station \n",
"2nd at Folsom 83.0 \n",
"2nd at South Park 180.0 \n",
"2nd at Townsend 174.0 \n",
"5th at Howard 90.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 403.0 \n",
"Townsend at 7th 153.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 36.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 73.0 \n",
"\n",
"[70 rows x 70 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commuteGroupby = commute_groupby.copy()\n",
"\n",
"#Though 'Start Station' is displayed as a column it is actually an index.\n",
"#To enable use as a df column the index must be reset setting parameter 'inplace' = True\n",
"\n",
"commuteGroupby.reset_index(inplace=True)\n",
"\n",
"commuteGroupby.pivot(index='Start Station', columns='End Station', values='count').fillna(0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also use `pivot` to find the shortest time of the rides between Start and End Stations. Here `pivot` has been given `Duration` as the optional `values` argument, and `min` as the function which to perform on the values in each cell."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
End Station
\n",
"
2nd at Folsom
\n",
"
2nd at South Park
\n",
"
2nd at Townsend
\n",
"
5th at Howard
\n",
"
Adobe on Almaden
\n",
"
Arena Green / SAP Center
\n",
"
Beale at Market
\n",
"
Broadway St at Battery St
\n",
"
California Ave Caltrain Station
\n",
"
Castro Street and El Camino Real
\n",
"
...
\n",
"
South Van Ness at Market
\n",
"
Spear at Folsom
\n",
"
St James Park
\n",
"
Stanford in Redwood City
\n",
"
Steuart at Market
\n",
"
Temporary Transbay Terminal (Howard at Beale)
\n",
"
Townsend at 7th
\n",
"
University and Emerson
\n",
"
Washington at Kearny
\n",
"
Yerba Buena Center of the Arts (3rd @ Howard)
\n",
"
\n",
"
\n",
"
Start Station
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
2nd at Folsom
\n",
"
61.0
\n",
"
61.0
\n",
"
137.0
\n",
"
215.0
\n",
"
0.0
\n",
"
0.0
\n",
"
219.0
\n",
"
351.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
673.0
\n",
"
154.0
\n",
"
0.0
\n",
"
0.0
\n",
"
219.0
\n",
"
112.0
\n",
"
399.0
\n",
"
0.0
\n",
"
266.0
\n",
"
145.0
\n",
"
\n",
"
\n",
"
2nd at South Park
\n",
"
97.0
\n",
"
60.0
\n",
"
67.0
\n",
"
300.0
\n",
"
0.0
\n",
"
0.0
\n",
"
343.0
\n",
"
424.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
801.0
\n",
"
219.0
\n",
"
0.0
\n",
"
0.0
\n",
"
322.0
\n",
"
195.0
\n",
"
324.0
\n",
"
0.0
\n",
"
378.0
\n",
"
212.0
\n",
"
\n",
"
\n",
"
2nd at Townsend
\n",
"
164.0
\n",
"
77.0
\n",
"
60.0
\n",
"
384.0
\n",
"
0.0
\n",
"
0.0
\n",
"
417.0
\n",
"
499.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
727.0
\n",
"
242.0
\n",
"
0.0
\n",
"
0.0
\n",
"
312.0
\n",
"
261.0
\n",
"
319.0
\n",
"
0.0
\n",
"
464.0
\n",
"
299.0
\n",
"
\n",
"
\n",
"
5th at Howard
\n",
"
268.0
\n",
"
86.0
\n",
"
423.0
\n",
"
68.0
\n",
"
0.0
\n",
"
0.0
\n",
"
387.0
\n",
"
555.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
383.0
\n",
"
382.0
\n",
"
0.0
\n",
"
0.0
\n",
"
384.0
\n",
"
279.0
\n",
"
330.0
\n",
"
0.0
\n",
"
269.0
\n",
"
128.0
\n",
"
\n",
"
\n",
"
Adobe on Almaden
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
84.0
\n",
"
305.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
0.0
\n",
"
0.0
\n",
"
409.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
Temporary Transbay Terminal (Howard at Beale)
\n",
"
149.0
\n",
"
61.0
\n",
"
249.0
\n",
"
265.0
\n",
"
0.0
\n",
"
0.0
\n",
"
94.0
\n",
"
291.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
644.0
\n",
"
119.0
\n",
"
0.0
\n",
"
0.0
\n",
"
128.0
\n",
"
60.0
\n",
"
534.0
\n",
"
0.0
\n",
"
248.0
\n",
"
190.0
\n",
"
\n",
"
\n",
"
Townsend at 7th
\n",
"
448.0
\n",
"
78.0
\n",
"
259.0
\n",
"
357.0
\n",
"
0.0
\n",
"
0.0
\n",
"
619.0
\n",
"
885.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
378.0
\n",
"
486.0
\n",
"
0.0
\n",
"
0.0
\n",
"
581.0
\n",
"
542.0
\n",
"
61.0
\n",
"
0.0
\n",
"
642.0
\n",
"
479.0
\n",
"
\n",
"
\n",
"
University and Emerson
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
531.0
\n",
"
0.0
\n",
"
...
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
93.0
\n",
"
0.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
Washington at Kearny
\n",
"
429.0
\n",
"
270.0
\n",
"
610.0
\n",
"
553.0
\n",
"
0.0
\n",
"
0.0
\n",
"
222.0
\n",
"
134.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
749.0
\n",
"
439.0
\n",
"
0.0
\n",
"
0.0
\n",
"
296.0
\n",
"
311.0
\n",
"
817.0
\n",
"
0.0
\n",
"
65.0
\n",
"
360.0
\n",
"
\n",
"
\n",
"
Yerba Buena Center of the Arts (3rd @ Howard)
\n",
"
165.0
\n",
"
96.0
\n",
"
284.0
\n",
"
109.0
\n",
"
0.0
\n",
"
0.0
\n",
"
264.0
\n",
"
411.0
\n",
"
0.0
\n",
"
0.0
\n",
"
...
\n",
"
479.0
\n",
"
303.0
\n",
"
0.0
\n",
"
0.0
\n",
"
280.0
\n",
"
226.0
\n",
"
432.0
\n",
"
0.0
\n",
"
190.0
\n",
"
60.0
\n",
"
\n",
" \n",
"
\n",
"
70 rows × 70 columns
\n",
"
"
],
"text/plain": [
"End Station 2nd at Folsom \\\n",
"Start Station \n",
"2nd at Folsom 61.0 \n",
"2nd at South Park 97.0 \n",
"2nd at Townsend 164.0 \n",
"5th at Howard 268.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 149.0 \n",
"Townsend at 7th 448.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 429.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 165.0 \n",
"\n",
"End Station 2nd at South Park \\\n",
"Start Station \n",
"2nd at Folsom 61.0 \n",
"2nd at South Park 60.0 \n",
"2nd at Townsend 77.0 \n",
"5th at Howard 86.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 61.0 \n",
"Townsend at 7th 78.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 270.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 96.0 \n",
"\n",
"End Station 2nd at Townsend 5th at Howard \\\n",
"Start Station \n",
"2nd at Folsom 137.0 215.0 \n",
"2nd at South Park 67.0 300.0 \n",
"2nd at Townsend 60.0 384.0 \n",
"5th at Howard 423.0 68.0 \n",
"Adobe on Almaden 0.0 0.0 \n",
"... ... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 249.0 265.0 \n",
"Townsend at 7th 259.0 357.0 \n",
"University and Emerson 0.0 0.0 \n",
"Washington at Kearny 610.0 553.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 284.0 109.0 \n",
"\n",
"End Station Adobe on Almaden \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 84.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Arena Green / SAP Center \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 305.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Beale at Market \\\n",
"Start Station \n",
"2nd at Folsom 219.0 \n",
"2nd at South Park 343.0 \n",
"2nd at Townsend 417.0 \n",
"5th at Howard 387.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 94.0 \n",
"Townsend at 7th 619.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 222.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 264.0 \n",
"\n",
"End Station Broadway St at Battery St \\\n",
"Start Station \n",
"2nd at Folsom 351.0 \n",
"2nd at South Park 424.0 \n",
"2nd at Townsend 499.0 \n",
"5th at Howard 555.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 291.0 \n",
"Townsend at 7th 885.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 134.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 411.0 \n",
"\n",
"End Station California Ave Caltrain Station \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 531.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Castro Street and El Camino Real \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station ... South Van Ness at Market \\\n",
"Start Station ... \n",
"2nd at Folsom ... 673.0 \n",
"2nd at South Park ... 801.0 \n",
"2nd at Townsend ... 727.0 \n",
"5th at Howard ... 383.0 \n",
"Adobe on Almaden ... 0.0 \n",
"... ... ... \n",
"Temporary Transbay Terminal (Howard at Beale) ... 644.0 \n",
"Townsend at 7th ... 378.0 \n",
"University and Emerson ... 0.0 \n",
"Washington at Kearny ... 749.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) ... 479.0 \n",
"\n",
"End Station Spear at Folsom St James Park \\\n",
"Start Station \n",
"2nd at Folsom 154.0 0.0 \n",
"2nd at South Park 219.0 0.0 \n",
"2nd at Townsend 242.0 0.0 \n",
"5th at Howard 382.0 0.0 \n",
"Adobe on Almaden 0.0 409.0 \n",
"... ... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 119.0 0.0 \n",
"Townsend at 7th 486.0 0.0 \n",
"University and Emerson 0.0 0.0 \n",
"Washington at Kearny 439.0 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 303.0 0.0 \n",
"\n",
"End Station Stanford in Redwood City \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Steuart at Market \\\n",
"Start Station \n",
"2nd at Folsom 219.0 \n",
"2nd at South Park 322.0 \n",
"2nd at Townsend 312.0 \n",
"5th at Howard 384.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 128.0 \n",
"Townsend at 7th 581.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 296.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 280.0 \n",
"\n",
"End Station Temporary Transbay Terminal (Howard at Beale) \\\n",
"Start Station \n",
"2nd at Folsom 112.0 \n",
"2nd at South Park 195.0 \n",
"2nd at Townsend 261.0 \n",
"5th at Howard 279.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 60.0 \n",
"Townsend at 7th 542.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 311.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 226.0 \n",
"\n",
"End Station Townsend at 7th \\\n",
"Start Station \n",
"2nd at Folsom 399.0 \n",
"2nd at South Park 324.0 \n",
"2nd at Townsend 319.0 \n",
"5th at Howard 330.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 534.0 \n",
"Townsend at 7th 61.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 817.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 432.0 \n",
"\n",
"End Station University and Emerson \\\n",
"Start Station \n",
"2nd at Folsom 0.0 \n",
"2nd at South Park 0.0 \n",
"2nd at Townsend 0.0 \n",
"5th at Howard 0.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 0.0 \n",
"Townsend at 7th 0.0 \n",
"University and Emerson 93.0 \n",
"Washington at Kearny 0.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 0.0 \n",
"\n",
"End Station Washington at Kearny \\\n",
"Start Station \n",
"2nd at Folsom 266.0 \n",
"2nd at South Park 378.0 \n",
"2nd at Townsend 464.0 \n",
"5th at Howard 269.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 248.0 \n",
"Townsend at 7th 642.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 65.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 190.0 \n",
"\n",
"End Station Yerba Buena Center of the Arts (3rd @ Howard) \n",
"Start Station \n",
"2nd at Folsom 145.0 \n",
"2nd at South Park 212.0 \n",
"2nd at Townsend 299.0 \n",
"5th at Howard 128.0 \n",
"Adobe on Almaden 0.0 \n",
"... ... \n",
"Temporary Transbay Terminal (Howard at Beale) 190.0 \n",
"Townsend at 7th 479.0 \n",
"University and Emerson 0.0 \n",
"Washington at Kearny 360.0 \n",
"Yerba Buena Center of the Arts (3rd @ Howard) 60.0 \n",
"\n",
"[70 rows x 70 columns]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commuteMin = commute.groupby([\"Start Station\", \"End Station\"]).agg(\n",
" min=pd.NamedAgg(column=\"Duration\", aggfunc=\"min\")\n",
")\n",
"\n",
"#Though 'Start Station' is displayed as a column it is actually an index.\n",
"#To enable use as a df column the index must be reset setting parameter 'inplace' = True\n",
"\n",
"commuteMin.reset_index(inplace=True) \n",
"\n",
"commuteMin.pivot(index='Start Station', columns='End Station', values='min').fillna(0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Someone had a very quick trip (271 seconds, or about 4.5 minutes) from 2nd at Folsom to Beale at Market, about five blocks away. There are no bike trips between the 2nd Avenue stations and Adobe on Almaden, because the latter is in a different city."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Drawing Maps\n",
"The table `stations` contains geographical information about each bike station, including latitude, longitude, and a \"landmark\" which is the name of the city where the station is located."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
station_id
\n",
"
name
\n",
"
lat
\n",
"
long
\n",
"
dockcount
\n",
"
landmark
\n",
"
installation
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
2
\n",
"
San Jose Diridon Caltrain Station
\n",
"
37.329732
\n",
"
-121.901782
\n",
"
27
\n",
"
San Jose
\n",
"
8/6/2013
\n",
"
\n",
"
\n",
"
1
\n",
"
3
\n",
"
San Jose Civic Center
\n",
"
37.330698
\n",
"
-121.888979
\n",
"
15
\n",
"
San Jose
\n",
"
8/5/2013
\n",
"
\n",
"
\n",
"
2
\n",
"
4
\n",
"
Santa Clara at Almaden
\n",
"
37.333988
\n",
"
-121.894902
\n",
"
11
\n",
"
San Jose
\n",
"
8/6/2013
\n",
"
\n",
"
\n",
"
3
\n",
"
5
\n",
"
Adobe on Almaden
\n",
"
37.331415
\n",
"
-121.893200
\n",
"
19
\n",
"
San Jose
\n",
"
8/5/2013
\n",
"
\n",
"
\n",
"
4
\n",
"
6
\n",
"
San Pedro Square
\n",
"
37.336721
\n",
"
-121.894074
\n",
"
15
\n",
"
San Jose
\n",
"
8/7/2013
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
65
\n",
"
77
\n",
"
Market at Sansome
\n",
"
37.789625
\n",
"
-122.400811
\n",
"
27
\n",
"
San Francisco
\n",
"
8/25/2013
\n",
"
\n",
"
\n",
"
66
\n",
"
80
\n",
"
Santa Clara County Civic Center
\n",
"
37.352601
\n",
"
-121.905733
\n",
"
15
\n",
"
San Jose
\n",
"
12/31/2013
\n",
"
\n",
"
\n",
"
67
\n",
"
82
\n",
"
Broadway St at Battery St
\n",
"
37.798541
\n",
"
-122.400862
\n",
"
15
\n",
"
San Francisco
\n",
"
1/22/2014
\n",
"
\n",
"
\n",
"
68
\n",
"
83
\n",
"
Mezes Park
\n",
"
37.491269
\n",
"
-122.236234
\n",
"
15
\n",
"
Redwood City
\n",
"
2/20/2014
\n",
"
\n",
"
\n",
"
69
\n",
"
84
\n",
"
Ryland Park
\n",
"
37.342725
\n",
"
-121.895617
\n",
"
15
\n",
"
San Jose
\n",
"
4/9/2014
\n",
"
\n",
" \n",
"
\n",
"
70 rows × 7 columns
\n",
"
"
],
"text/plain": [
" station_id name lat long \\\n",
"0 2 San Jose Diridon Caltrain Station 37.329732 -121.901782 \n",
"1 3 San Jose Civic Center 37.330698 -121.888979 \n",
"2 4 Santa Clara at Almaden 37.333988 -121.894902 \n",
"3 5 Adobe on Almaden 37.331415 -121.893200 \n",
"4 6 San Pedro Square 37.336721 -121.894074 \n",
".. ... ... ... ... \n",
"65 77 Market at Sansome 37.789625 -122.400811 \n",
"66 80 Santa Clara County Civic Center 37.352601 -121.905733 \n",
"67 82 Broadway St at Battery St 37.798541 -122.400862 \n",
"68 83 Mezes Park 37.491269 -122.236234 \n",
"69 84 Ryland Park 37.342725 -121.895617 \n",
"\n",
" dockcount landmark installation \n",
"0 27 San Jose 8/6/2013 \n",
"1 15 San Jose 8/5/2013 \n",
"2 11 San Jose 8/6/2013 \n",
"3 19 San Jose 8/5/2013 \n",
"4 15 San Jose 8/7/2013 \n",
".. ... ... ... \n",
"65 27 San Francisco 8/25/2013 \n",
"66 15 San Jose 12/31/2013 \n",
"67 15 San Francisco 1/22/2014 \n",
"68 15 Redwood City 2/20/2014 \n",
"69 15 San Jose 4/9/2014 \n",
"\n",
"[70 rows x 7 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stations = pd.read_csv(path_data + 'station.csv')\n",
"stations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can draw a map of where the stations are located, using `Marker.map_table`. The function operates on a table, whose columns are (in order) latitude, longitude, and an optional identifier for each point."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The map is created using [OpenStreetMap](http://www.openstreetmap.org/#map=5/51.500/-0.100), which is an open online mapping system that you can use just as you would use Google Maps or any other online map. Zoom in to San Francisco to see how the stations are distributed. Click on a marker to see which station it is."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also represent points on a map by colored circles. Here is such a map of the San Francisco bike stations."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
Make this Notebook Trusted to load map: File -> Trust Notebook
Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sf = stations[stations['landmark']=='San Francisco']\n",
"\n",
"lat = np.asarray(sf['lat'])\n",
"\n",
"lon = np.asarray(sf['long'])\n",
"\n",
"name = np.asarray(sf['name'])\n",
"\n",
"data = pd.DataFrame({'lat':lat,'lon':lon})\n",
"\n",
"data2 = pd.DataFrame({'name':name})\n",
"\n",
"data1 = data.values.tolist()\n",
"\n",
"data3 = data2.values.tolist()\n",
"\n",
"mapCircle = folium.Map(location=[37.78, -122.423], zoom_start=14)\n",
"\n",
"for i in range(0,len(data1)):\n",
"\n",
" folium.CircleMarker(location=data1[i], radius=6, popup=data3[i]).add_to(mapCircle)\n",
" \n",
"mapCircle"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## More Informative Maps: An Application of `join` ###\n",
"The bike stations are located in five different cities in the Bay Area. To distinguish the points by using a different color for each city, let's start by using group to identify all the cities and assign each one a color."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" city count color\n",
"0 Mountain View 7 blue\n",
"1 Palo Alto 5 red\n",
"2 Redwood City 7 green\n",
"3 San Francisco 35 orange\n",
"4 San Jose 16 purple"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities_grouped['color'] = np.array(['blue', 'red', 'green', 'orange', 'purple'])\n",
"\n",
"colors = cities_grouped.copy()\n",
"\n",
"colors.reset_index(inplace=True)\n",
"\n",
"colors1 = colors.copy()\n",
"\n",
"colors1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can join `stations` and `colors` by `landmark`, and then select the columns we need to draw a map."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
station_id
\n",
"
name
\n",
"
lat
\n",
"
long
\n",
"
dockcount
\n",
"
landmark
\n",
"
installation
\n",
"
count
\n",
"
color
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
2
\n",
"
San Jose Diridon Caltrain Station
\n",
"
37.329732
\n",
"
-121.901782
\n",
"
27
\n",
"
San Jose
\n",
"
8/6/2013
\n",
"
16
\n",
"
purple
\n",
"
\n",
"
\n",
"
1
\n",
"
3
\n",
"
San Jose Civic Center
\n",
"
37.330698
\n",
"
-121.888979
\n",
"
15
\n",
"
San Jose
\n",
"
8/5/2013
\n",
"
16
\n",
"
purple
\n",
"
\n",
"
\n",
"
2
\n",
"
4
\n",
"
Santa Clara at Almaden
\n",
"
37.333988
\n",
"
-121.894902
\n",
"
11
\n",
"
San Jose
\n",
"
8/6/2013
\n",
"
16
\n",
"
purple
\n",
"
\n",
"
\n",
"
3
\n",
"
5
\n",
"
Adobe on Almaden
\n",
"
37.331415
\n",
"
-121.893200
\n",
"
19
\n",
"
San Jose
\n",
"
8/5/2013
\n",
"
16
\n",
"
purple
\n",
"
\n",
"
\n",
"
4
\n",
"
6
\n",
"
San Pedro Square
\n",
"
37.336721
\n",
"
-121.894074
\n",
"
15
\n",
"
San Jose
\n",
"
8/7/2013
\n",
"
16
\n",
"
purple
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
65
\n",
"
77
\n",
"
Market at Sansome
\n",
"
37.789625
\n",
"
-122.400811
\n",
"
27
\n",
"
San Francisco
\n",
"
8/25/2013
\n",
"
35
\n",
"
orange
\n",
"
\n",
"
\n",
"
66
\n",
"
80
\n",
"
Santa Clara County Civic Center
\n",
"
37.352601
\n",
"
-121.905733
\n",
"
15
\n",
"
San Jose
\n",
"
12/31/2013
\n",
"
16
\n",
"
purple
\n",
"
\n",
"
\n",
"
67
\n",
"
82
\n",
"
Broadway St at Battery St
\n",
"
37.798541
\n",
"
-122.400862
\n",
"
15
\n",
"
San Francisco
\n",
"
1/22/2014
\n",
"
35
\n",
"
orange
\n",
"
\n",
"
\n",
"
68
\n",
"
83
\n",
"
Mezes Park
\n",
"
37.491269
\n",
"
-122.236234
\n",
"
15
\n",
"
Redwood City
\n",
"
2/20/2014
\n",
"
7
\n",
"
green
\n",
"
\n",
"
\n",
"
69
\n",
"
84
\n",
"
Ryland Park
\n",
"
37.342725
\n",
"
-121.895617
\n",
"
15
\n",
"
San Jose
\n",
"
4/9/2014
\n",
"
16
\n",
"
purple
\n",
"
\n",
" \n",
"
\n",
"
70 rows × 9 columns
\n",
"
"
],
"text/plain": [
" station_id name lat long \\\n",
"0 2 San Jose Diridon Caltrain Station 37.329732 -121.901782 \n",
"1 3 San Jose Civic Center 37.330698 -121.888979 \n",
"2 4 Santa Clara at Almaden 37.333988 -121.894902 \n",
"3 5 Adobe on Almaden 37.331415 -121.893200 \n",
"4 6 San Pedro Square 37.336721 -121.894074 \n",
".. ... ... ... ... \n",
"65 77 Market at Sansome 37.789625 -122.400811 \n",
"66 80 Santa Clara County Civic Center 37.352601 -121.905733 \n",
"67 82 Broadway St at Battery St 37.798541 -122.400862 \n",
"68 83 Mezes Park 37.491269 -122.236234 \n",
"69 84 Ryland Park 37.342725 -121.895617 \n",
"\n",
" dockcount landmark installation count color \n",
"0 27 San Jose 8/6/2013 16 purple \n",
"1 15 San Jose 8/5/2013 16 purple \n",
"2 11 San Jose 8/6/2013 16 purple \n",
"3 19 San Jose 8/5/2013 16 purple \n",
"4 15 San Jose 8/7/2013 16 purple \n",
".. ... ... ... ... ... \n",
"65 27 San Francisco 8/25/2013 35 orange \n",
"66 15 San Jose 12/31/2013 16 purple \n",
"67 15 San Francisco 1/22/2014 35 orange \n",
"68 15 Redwood City 2/20/2014 7 green \n",
"69 15 San Jose 4/9/2014 16 purple \n",
"\n",
"[70 rows x 9 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"colors2 = colors1.set_index(['city'])\n",
"\n",
"colored = stations.join(colors2, on='landmark')\n",
"\n",
"colored"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"coloredSelect = colored[['lat', 'long', 'name', 'color']]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lat = np.asarray(coloredSelect['lat'])\n",
"\n",
"lon = np.asarray(coloredSelect['long'])\n",
"\n",
"name = np.asarray(coloredSelect['name'])\n",
"\n",
"color = np.asarray(coloredSelect['color'])\n",
"\n",
"data = pd.DataFrame({'lat':lat,'long':lon})\n",
"\n",
"data2 = pd.DataFrame({'name':name})\n",
"\n",
"data1 = data.values.tolist()\n",
"\n",
"data3 = data2.values.tolist()\n",
"\n",
"mapPointer = folium.Map(location=[37.5630, -122.3255], zoom_start=10)\n",
"\n",
"for i in range(0,len(data)):\n",
" \n",
" folium.Marker(data1[i], popup=data3[i], icon=folium.Icon(color=color[i])).add_to(mapPointer)\n",
"\n",
"mapPointer"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now the markers have five different colors for the five different cities."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To see where most of the bike rentals originate, let's identify the start stations:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
count
\n",
"
\n",
"
\n",
"
Start Station
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
San Francisco Caltrain (Townsend at 4th)
\n",
"
25858
\n",
"
\n",
"
\n",
"
San Francisco Caltrain 2 (330 Townsend)
\n",
"
21523
\n",
"
\n",
"
\n",
"
Harry Bridges Plaza (Ferry Building)
\n",
"
15543
\n",
"
\n",
"
\n",
"
Temporary Transbay Terminal (Howard at Beale)
\n",
"
14298
\n",
"
\n",
"
\n",
"
2nd at Townsend
\n",
"
13674
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
Mezes Park
\n",
"
189
\n",
"
\n",
"
\n",
"
Redwood City Medical Center
\n",
"
139
\n",
"
\n",
"
\n",
"
San Mateo County Center
\n",
"
108
\n",
"
\n",
"
\n",
"
Redwood City Public Library
\n",
"
101
\n",
"
\n",
"
\n",
"
Franklin at Maple
\n",
"
62
\n",
"
\n",
" \n",
"
\n",
"
70 rows × 1 columns
\n",
"
"
],
"text/plain": [
" count\n",
"Start Station \n",
"San Francisco Caltrain (Townsend at 4th) 25858\n",
"San Francisco Caltrain 2 (330 Townsend) 21523\n",
"Harry Bridges Plaza (Ferry Building) 15543\n",
"Temporary Transbay Terminal (Howard at Beale) 14298\n",
"2nd at Townsend 13674\n",
"... ...\n",
"Mezes Park 189\n",
"Redwood City Medical Center 139\n",
"San Mateo County Center 108\n",
"Redwood City Public Library 101\n",
"Franklin at Maple 62\n",
"\n",
"[70 rows x 1 columns]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"starts = commute.groupby(['Start Station']).agg(\n",
" count=pd.NamedAgg(column=\"Start Station\", aggfunc=\"count\")\n",
")\n",
"\n",
"starts.sort_values(['count'], ascending=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can include the geographical data needed to map these stations, by first joining `starts` with `stations`:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
station_id
\n",
"
name
\n",
"
lat
\n",
"
long
\n",
"
dockcount
\n",
"
landmark
\n",
"
installation
\n",
"
count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
50
\n",
"
62
\n",
"
2nd at Folsom
\n",
"
37.785299
\n",
"
-122.396236
\n",
"
19
\n",
"
San Francisco
\n",
"
8/22/2013
\n",
"
7841.0
\n",
"
\n",
"
\n",
"
52
\n",
"
64
\n",
"
2nd at South Park
\n",
"
37.782259
\n",
"
-122.392738
\n",
"
15
\n",
"
San Francisco
\n",
"
8/22/2013
\n",
"
9274.0
\n",
"
\n",
"
\n",
"
49
\n",
"
61
\n",
"
2nd at Townsend
\n",
"
37.780526
\n",
"
-122.390288
\n",
"
27
\n",
"
San Francisco
\n",
"
8/22/2013
\n",
"
13674.0
\n",
"
\n",
"
\n",
"
45
\n",
"
57
\n",
"
5th at Howard
\n",
"
37.781752
\n",
"
-122.405127
\n",
"
15
\n",
"
San Francisco
\n",
"
8/21/2013
\n",
"
7394.0
\n",
"
\n",
"
\n",
"
3
\n",
"
5
\n",
"
Adobe on Almaden
\n",
"
37.331415
\n",
"
-121.893200
\n",
"
19
\n",
"
San Jose
\n",
"
8/5/2013
\n",
"
522.0
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
43
\n",
"
55
\n",
"
Temporary Transbay Terminal (Howard at Beale)
\n",
"
37.789756
\n",
"
-122.394643
\n",
"
23
\n",
"
San Francisco
\n",
"
8/20/2013
\n",
"
14298.0
\n",
"
\n",
"
\n",
"
53
\n",
"
65
\n",
"
Townsend at 7th
\n",
"
37.771058
\n",
"
-122.402717
\n",
"
15
\n",
"
San Francisco
\n",
"
8/22/2013
\n",
"
13579.0
\n",
"
\n",
"
\n",
"
28
\n",
"
35
\n",
"
University and Emerson
\n",
"
37.444521
\n",
"
-122.163093
\n",
"
11
\n",
"
Palo Alto
\n",
"
8/15/2013
\n",
"
248.0
\n",
"
\n",
"
\n",
"
35
\n",
"
46
\n",
"
Washington at Kearney
\n",
"
37.795425
\n",
"
-122.404767
\n",
"
15
\n",
"
San Francisco
\n",
"
8/19/2013
\n",
"
NaN
\n",
"
\n",
"
\n",
"
56
\n",
"
68
\n",
"
Yerba Buena Center of the Arts (3rd @ Howard)
\n",
"
37.784878
\n",
"
-122.401014
\n",
"
19
\n",
"
San Francisco
\n",
"
8/23/2013
\n",
"
5249.0
\n",
"
\n",
" \n",
"
\n",
"
70 rows × 8 columns
\n",
"
"
],
"text/plain": [
" station_id name lat \\\n",
"50 62 2nd at Folsom 37.785299 \n",
"52 64 2nd at South Park 37.782259 \n",
"49 61 2nd at Townsend 37.780526 \n",
"45 57 5th at Howard 37.781752 \n",
"3 5 Adobe on Almaden 37.331415 \n",
".. ... ... ... \n",
"43 55 Temporary Transbay Terminal (Howard at Beale) 37.789756 \n",
"53 65 Townsend at 7th 37.771058 \n",
"28 35 University and Emerson 37.444521 \n",
"35 46 Washington at Kearney 37.795425 \n",
"56 68 Yerba Buena Center of the Arts (3rd @ Howard) 37.784878 \n",
"\n",
" long dockcount landmark installation count \n",
"50 -122.396236 19 San Francisco 8/22/2013 7841.0 \n",
"52 -122.392738 15 San Francisco 8/22/2013 9274.0 \n",
"49 -122.390288 27 San Francisco 8/22/2013 13674.0 \n",
"45 -122.405127 15 San Francisco 8/21/2013 7394.0 \n",
"3 -121.893200 19 San Jose 8/5/2013 522.0 \n",
".. ... ... ... ... ... \n",
"43 -122.394643 23 San Francisco 8/20/2013 14298.0 \n",
"53 -122.402717 15 San Francisco 8/22/2013 13579.0 \n",
"28 -122.163093 11 Palo Alto 8/15/2013 248.0 \n",
"35 -122.404767 15 San Francisco 8/19/2013 NaN \n",
"56 -122.401014 19 San Francisco 8/23/2013 5249.0 \n",
"\n",
"[70 rows x 8 columns]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"station_starts = stations.join(starts, 'name')\n",
"\n",
"station_starts.sort_values(['name'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we extract just the data needed for drawing our map, adding a color and an area to each station. The area is 1000 times the count of the number of rentals starting at each station, where the constant 1000 was chosen so that the circles would appear at an appropriate scale on the map."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"starts_map_data = station_starts[['lat', 'long', 'name']].copy()\n",
"\n",
"starts_map_data['color'] = 'blue'\n",
"starts_map_data['area'] = station_starts['count'] / 10\n",
"\n",
"#starts_map_data.sort_values(['name']).head(3)\n",
"\n",
"#area = pi * r**2\n",
"\n",
"# r = sqrt(area / math.pi)\n",
"\n",
"smd = starts_map_data\n",
"\n",
"lat = np.asarray(smd['lat'])\n",
"\n",
"lon = np.asarray(smd['long'])\n",
"\n",
"name = np.asarray(smd['name'])\n",
"\n",
"color = np.asarray(smd['color'])\n",
"\n",
"area = np.asarray(smd['area'])\n",
"\n",
"data = pd.DataFrame({'lat':lat,'lon':lon})\n",
"\n",
"data2 = pd.DataFrame({'name':name})\n",
"\n",
"data1 = data.values.tolist()\n",
"\n",
"data3 = data2.values.tolist()\n",
"\n",
"mapCircle = folium.Map(location=[37.5630, -122.3255], zoom_start=10)\n",
"\n",
"for i in range(0,len(data1)):\n",
"\n",
" folium.CircleMarker(location=data1[i], radius=math.sqrt(area[i]/math.pi), popup=data3[i], fill=True,\n",
" fill_color='#3186cc').add_to(mapCircle)\n",
" \n",
"mapCircle\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That huge blob in San Francisco shows that the eastern section of the city is the unrivaled capital of bike rentals in the Bay Area."
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.12"
}
},
"nbformat": 4,
"nbformat_minor": 2
}