GeoVisualization using Keplergl & Uber’s Movement data

We are going to use Uber’s Keplergl and movement data to visualize Mexico times. KeplerGl is uber’s open source and default program for geovisualization. They developed a jupyter widget, so we are going to see how it works. We will use Uber’s Movement data. This dataset contains the average daily ride times for the month of june 19 an 17 for the city of Mexico that is available at https://movement.uber.com

%load_ext autoreload
%autoreload 2
%matplotlib inline
from keplergl import KeplerGl
import pandas as pd
import geopandas
import matplotlib.pyplot as plt
junetimes = pd.read_csv(f'{PATH}Travel_Timesjune.csv')
june17 = pd.read_csv(f'{PATH}Travel_Timesjune17.csv')
agents = geopandas.read_file(f'{PATH}mexico_city_agebs.json')
junetimes.shape
(2099, 8)
june17.shape
(2154, 8)
junetimes.head()
Origin Movement ID Origin Display Name Destination Movement ID Destination Display Name Date Range Mean Travel Time (Seconds) Range - Lower Bound Travel Time (Seconds) Range - Upper Bound Travel Time (Seconds)
0 2922 Movement Zone 2922 9 Movement Zone 9 6/1/2019 - 6/30/2019, Weekdays, Daily Average 2164 1666 2809
1 2922 Movement Zone 2922 10 Movement Zone 10 6/1/2019 - 6/30/2019, Weekdays, Daily Average 1283 988 1665
2 2922 Movement Zone 2922 11 Movement Zone 11 6/1/2019 - 6/30/2019, Weekdays, Daily Average 1465 1080 1986
3 2922 Movement Zone 2922 15 Movement Zone 15 6/1/2019 - 6/30/2019, Weekdays, Daily Average 1633 1194 2232
4 2922 Movement Zone 2922 16 Movement Zone 16 6/1/2019 - 6/30/2019, Weekdays, Daily Average 1480 1049 2086
junetimes.describe()
Origin Movement ID Destination Movement ID Mean Travel Time (Seconds) Range - Lower Bound Travel Time (Seconds) Range - Upper Bound Travel Time (Seconds)
count 2099.0 2099.000000 2099.000000 2099.000000 2099.000000
mean 2922.0 3265.676989 2644.540257 1877.721772 3746.479752
std 0.0 1348.543174 938.813955 683.300357 1373.550719
min 2922.0 9.000000 232.000000 49.000000 596.000000
25% 2922.0 2479.000000 1946.500000 1402.000000 2684.000000
50% 2922.0 3430.000000 2703.000000 1926.000000 3805.000000
75% 2922.0 4404.500000 3343.500000 2360.500000 4721.000000
max 2922.0 5084.000000 5245.000000 3776.000000 9456.000000
june17.drop(['Origin Movement ID','Origin Display Name','Date Range','Destination Display Name'], axis=1,inplace=True)
june17.rename(columns = {'Mean Travel Time (Seconds)':'Travel Time 17',
                        'Range - Lower Bound Travel Time (Seconds)':'Range Lower 17',
                        'Range - Upper Bound Travel Time (Seconds)':'Range Upper 17'}, inplace = True) 
data = junetimes.merge(june17, on='Destination Movement ID' )
data.head()
Origin Movement ID Origin Display Name Destination Movement ID Destination Display Name Date Range Mean Travel Time (Seconds) Range - Lower Bound Travel Time (Seconds) Range - Upper Bound Travel Time (Seconds) Travel Time 17 Range Lower 17 Range Upper 17
0 2922 Movement Zone 2922 9 Movement Zone 9 6/1/2019 - 6/30/2019, Weekdays, Daily Average 2164 1666 2809 1989 1481 2669
1 2922 Movement Zone 2922 10 Movement Zone 10 6/1/2019 - 6/30/2019, Weekdays, Daily Average 1283 988 1665 1583 1158 2162
2 2922 Movement Zone 2922 11 Movement Zone 11 6/1/2019 - 6/30/2019, Weekdays, Daily Average 1465 1080 1986 1478 1056 2066
3 2922 Movement Zone 2922 15 Movement Zone 15 6/1/2019 - 6/30/2019, Weekdays, Daily Average 1633 1194 2232 1831 1305 2567
4 2922 Movement Zone 2922 16 Movement Zone 16 6/1/2019 - 6/30/2019, Weekdays, Daily Average 1480 1049 2086 1660 1125 2447
data.rename(columns = {'Destination Display Name':'DISPLAY_NAME',
                      'Mean Travel Time (Seconds)':'Travel Time 19',
                        'Range - Lower Bound Travel Time (Seconds)':'Range Lower 19',
                        'Range - Upper Bound Travel Time (Seconds)':'Range Upper 19'}, inplace = True) 
data['Travel Time 19'] = data['Travel Time 19']/60
data['Travel Time 17'] = data['Travel Time 17']/60
data['Change'] = data['Travel Time 19'] - data['Travel Time 17']
fig = plt.figure()
ax = fig.add_subplot(111)
timedf = data['Travel Time 19'].values
ax.hist(timedf)
(array([ 52., 108., 227., 300., 351., 376., 355., 151.,  56.,   5.]),
 array([ 3.86666667, 12.22166667, 20.57666667, 28.93166667, 37.28666667,
        45.64166667, 53.99666667, 62.35166667, 70.70666667, 79.06166667,
        87.41666667]),
 <a list of 10 Patch objects>)
fig = plt.figure()
ax = fig.add_subplot(111)
timedf = data['Travel Time 17'].values
ax.hist(timedf)
(array([ 47.,  86., 154., 261., 320., 444., 418., 174.,  67.,  10.]),
 array([ 4.81666667, 13.675     , 22.53333333, 31.39166667, 40.25      ,
        49.10833333, 57.96666667, 66.825     , 75.68333333, 84.54166667,
        93.4       ]),
 <a list of 10 Patch objects>)
agents.head()
CVE_AGEB CVE_MUN CVE_LOC CVE_ENT MOVEMENT_ID DISPLAY_NAME geometry
0 1142 121 0 15 1 Movement Zone 1 POLYGON ((-99.24182 19.68300, -99.24096 19.681...
1 1012 122 0 15 2 Movement Zone 2 POLYGON ((-98.96833 19.29859, -98.96824 19.299...
2 0393 002 0 15 3 Movement Zone 3 POLYGON ((-98.91891 19.68579, -98.91798 19.685...
3 003A 046 0 15 4 Movement Zone 4 POLYGON ((-99.34220 19.55510, -99.34167 19.554...
4 0037 089 0 15 5 Movement Zone 5 POLYGON ((-98.87485 19.18100, -98.87470 19.180...
df = agents.merge(data, on='DISPLAY_NAME' )
map1 = KeplerGl(height=850)
User Guide: https://github.com/keplergl/kepler.gl/blob/master/docs/keplergl-jupyter/user-guide.md
map1.add_data(data=df, name='d')
map1