9.10. Mapping Bike Stations Using Colab¶
This section will show you how to map our bikeshare data on Google Colab. We are going to be using
a module called
folium instead of
ipyleaflets (as shown in 9.8) because Colab does not support Jupyter widgets.
We will be using the package
folium which is a module that allows for mapping static data in both Jupyter Notebooks
Next, we want to put all the latitude and longitude values from each of the bikeshare stations into a list. What
we want to do is combine the two columns from the
DataFrame into tuples and put them in a list. The aim is to
get something that would look like this:
[(lat1, long1), (lat2, long2), ...] which the Google Maps interface can accept.
While a for loop might be used for this, we will be using a simpler way.
Suppose we have two lists:
list1 = ['a', 'b', 'c'] list2 = [1, 2, 3]
We want to combine these lists into
[('a', 1), ('b', 2), ('c', 3)]. Python has a built-in
that takes in any number of iterable objects and “zips” them together. The
zip function will take the first elements
from each iterable object and puts them in a tuple; then it will do the same for the second element from each object,
then the third, then the fourth, etc. We can use the zip function like this
zip(list1, list2). Let us expand our
list1 = ['a', 'b', 'c'] list2 = [1, 2, 3] str1 = "XYZ"
If we were to run
list(zip(list1, list2, str1)) it would return
[('a', 1, 'X'), ('b', 2, 'Y'), ('c', 3, 'Z')].
Why do we need to put
zip into a
zip returns an iterator that, under most circumstances, behaves like
a list, except when we want to see specific examples. If we want to index into something that has been zipped (or simply
print the zipped values) we have to turn it into a list first. Series are also iterable objects, which means that it is
import pandas as pd stations = pd.read_csv("https://runestone.academy/ns/books/published/httlads/_static/bikeshare_stations.csv") stations.head()
Let us start by loading the stations data into Colab. You can load data into Colab from a database, local file, or remotely as it is being done here. After the file has been loaded, we will create a marker for each station using the longitude and latitude data.
import folium Locations = list(zip(stations.latitude, stations.longitude)) dc_center = (38.9072, -77.0369) dcmap = folium.Map(location=dc_center, zoom_start=12) for loc in Locations: markers = folium.CircleMarker(location=loc,radius=5,fill=True, fill_opacity=1) dcmap.add_child(markers) dcmap
9.10.1. Practice and Further Exploration¶
The map seems a little busy with all those markers. Redo the map so that it only shows the 20 busiest stations. That is the 20 stations with the highest starting counts.
It would also be interesting to add the 20 stations with the largest ending counts. Can you add those in a different color?
Investigate the interface to see if there is a way for you to color code the markers based on the number of rides originating from that station. Show the 50 most popular stations using five different colors. 1 color for the top 10 another for the next 10 and so on.
Bikeshare datasets are available for many cities. Most of them come in a similar format to this one. Find some bikeshare data for a city close to you or for your favorite city and see if you can reproduce this map. Hint, if your data does not come with latitude and longitude then investigate the
geopypackage, you can use a free service like GeocodeFarm to use the address of the station to get the latitude and longitude.
Here is a real challenge for you, pick a station and then follow the rentals, but only map the stations where a bike ends up back at your original starting point. In other words for the bikes that started at station A, go to station B, then D then pause for a while then on to station X and finally back to A. Others may take a different route. If you can do this, you can investigate the AntPath plugin by first importing all folium plugins (
from folium import plugins). Then you can show the routes that the various bikes took to make their way back to the starting point. You may want to limit the time on this to one day or a week.
foliumalso allows you to add a heatmap layer by importing the plugin ( called
HeatMap). This sounds like it could a very interesting way to overlay the popularity of different stations and routes on the map. Investigate this layer and what the data should look like, then see if you can find a way to get the data into the appropriate form to make a heatmap.