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