In [1]:
# magic function para hacer que los graficos de matplotlib se renderizen en el notebook.
%matplotlib inline

import datetime as datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.style.use('default') # Make the graphs a bit prettier
plt.rcParams['figure.figsize'] = (15, 5)

In [2]:
#Cargo los datos pero parseando las fechas a DataTime
trip = pd.read_csv('trip.csv', parse_dates=['start_date','end_date'])

In [3]:
#Observacion de los datos
trip.head(10)


Out[3]:
id duration start_date start_station_name start_station_id end_date end_station_name end_station_id bike_id subscription_type zip_code
0 4576 63 2013-08-29 14:13:00 South Van Ness at Market 66 2013-08-29 14:14:00 South Van Ness at Market 66 520 Subscriber 94127
1 4607 70 2013-08-29 14:42:00 San Jose City Hall 10 2013-08-29 14:43:00 San Jose City Hall 10 661 Subscriber 95138
2 4130 71 2013-08-29 10:16:00 Mountain View City Hall 27 2013-08-29 10:17:00 Mountain View City Hall 27 48 Subscriber 97214
3 4251 77 2013-08-29 11:29:00 San Jose City Hall 10 2013-08-29 11:30:00 San Jose City Hall 10 26 Subscriber 95060
4 4299 83 2013-08-29 12:02:00 South Van Ness at Market 66 2013-08-29 12:04:00 Market at 10th 67 319 Subscriber 94103
5 4927 103 2013-08-29 18:54:00 Golden Gate at Polk 59 2013-08-29 18:56:00 Golden Gate at Polk 59 527 Subscriber 94109
6 4500 109 2013-08-29 13:25:00 Santa Clara at Almaden 4 2013-08-29 13:27:00 Adobe on Almaden 5 679 Subscriber 95112
7 4563 111 2013-08-29 14:02:00 San Salvador at 1st 8 2013-08-29 14:04:00 San Salvador at 1st 8 687 Subscriber 95112
8 4760 113 2013-08-29 17:01:00 South Van Ness at Market 66 2013-08-29 17:03:00 South Van Ness at Market 66 553 Subscriber 94103
9 4258 114 2013-08-29 11:33:00 San Jose City Hall 10 2013-08-29 11:35:00 MLK Library 11 107 Subscriber 95060

In [4]:
#A cada dato de la columna de comienzo del viaje (start_date) le aplico una funcion para saber en que dia de la semana fueron
#realizados los viajes
#Aclaracion: dayofweek nos da los dias ordenados desde 0(lunes) hasta 6(domingo)
#Realizo un plot de barras para visualizar lo calculado en el paso anterior
plt = trip['start_date'].apply(lambda x: x.dayofweek).value_counts().plot('bar')
plt.set_xlabel('Dias de la semana')
plt.set_ylabel('Cantidad')
plt.set_title('Cantidad de viajes por dia de la semana')
plt.set_xticklabels(['Martes','Miercoles','Jueves','Lunes','Viernes','Sabado','Domingo'], fontdict=None, minor=False)


Out[4]:
[<matplotlib.text.Text at 0xafd32f0>,
 <matplotlib.text.Text at 0xafd3b30>,
 <matplotlib.text.Text at 0xafc9390>,
 <matplotlib.text.Text at 0xafbc8b0>,
 <matplotlib.text.Text at 0x7c05630>,
 <matplotlib.text.Text at 0x7c05b10>,
 <matplotlib.text.Text at 0x7c05e90>]

In [5]:
#A cada dato de la columna de comienzo del viaje (start_date) le aplico una funcion para saber en que mes fueron
#realizados los viajes
#Realizo un plot en el cual observamos la cantidad de viajes segun el mes del año
plt = trip['start_date'].apply(lambda x: x.month).value_counts().plot('bar')
plt.set_xlabel('meses')
plt.set_ylabel('Cantidad de viajes')
plt.set_title('Cantidad de viajes por mes');



In [6]:
#Ahora para hacer un visualizacion de todos los viajes a traves del tiempo creamos una nueva columa en la cual tendremos
#la fecha pero sin la hora ni los minutos
trip['start_date_without_time']=trip.start_date.dt.date
trip.head(10)


Out[6]:
id duration start_date start_station_name start_station_id end_date end_station_name end_station_id bike_id subscription_type zip_code start_date_without_time
0 4576 63 2013-08-29 14:13:00 South Van Ness at Market 66 2013-08-29 14:14:00 South Van Ness at Market 66 520 Subscriber 94127 2013-08-29
1 4607 70 2013-08-29 14:42:00 San Jose City Hall 10 2013-08-29 14:43:00 San Jose City Hall 10 661 Subscriber 95138 2013-08-29
2 4130 71 2013-08-29 10:16:00 Mountain View City Hall 27 2013-08-29 10:17:00 Mountain View City Hall 27 48 Subscriber 97214 2013-08-29
3 4251 77 2013-08-29 11:29:00 San Jose City Hall 10 2013-08-29 11:30:00 San Jose City Hall 10 26 Subscriber 95060 2013-08-29
4 4299 83 2013-08-29 12:02:00 South Van Ness at Market 66 2013-08-29 12:04:00 Market at 10th 67 319 Subscriber 94103 2013-08-29
5 4927 103 2013-08-29 18:54:00 Golden Gate at Polk 59 2013-08-29 18:56:00 Golden Gate at Polk 59 527 Subscriber 94109 2013-08-29
6 4500 109 2013-08-29 13:25:00 Santa Clara at Almaden 4 2013-08-29 13:27:00 Adobe on Almaden 5 679 Subscriber 95112 2013-08-29
7 4563 111 2013-08-29 14:02:00 San Salvador at 1st 8 2013-08-29 14:04:00 San Salvador at 1st 8 687 Subscriber 95112 2013-08-29
8 4760 113 2013-08-29 17:01:00 South Van Ness at Market 66 2013-08-29 17:03:00 South Van Ness at Market 66 553 Subscriber 94103 2013-08-29
9 4258 114 2013-08-29 11:33:00 San Jose City Hall 10 2013-08-29 11:35:00 MLK Library 11 107 Subscriber 95060 2013-08-29

In [7]:
#Realizamos una visualizacion de los viajes a traves del tiempo
#Quiero aclarar que se realizo una agrupacion dia a dia para realizar este plot
plt = trip.groupby('start_date_without_time').count()['id'].plot(figsize=(14,4));
plt.set_xlabel('Fecha')
plt.set_ylabel('Cantidad de viajes')
plt.set_title('Cantidad de viajes a traves del tiempo');



In [8]:
#Ahora añadiremos otra columna la cual tendra solo la hora en la que se realiza el viaje
trip['hora'] = trip['start_date'].apply(lambda x: x.hour)
#Realizo una visualizacion en base a la hora en que se realiza el viaje
plt = trip.groupby('hora').count()['id'].plot('bar');
plt.set_xlabel('Hora del dia')
plt.set_ylabel('Cantidad de viajes')
plt.set_title('Cantidad de viajes dependiendo de la hora');



In [9]:
#Cambiamos la duracion a minutos
trip['duration'] = trip['duration'].apply(lambda x: x/60)
#Cantidad de viajes segun la duracion (en minutos). Visualizacion de la cantidad de viajes segun la duracion del viaje 
plt = trip['duration'].value_counts()[:20].plot('bar')
plt.set_xlabel('Cantidad de minutos del viajes')
plt.set_ylabel('Cantidad de viajes')
plt.set_title('Cantidad de viajes dependiendo de su duracion');



In [10]:
#Cargamos los datos de station.csv y le cambiamos el nombre a una de sus columnas para un posterior procesamiento
station = pd.read_csv('station.csv', low_memory=False)
station.rename(columns={'id': 'start_station_id'}, inplace=True)
station.head(10)


Out[10]:
start_station_id name lat long dock_count city installation_date
0 2 San Jose Diridon Caltrain Station 37.329732 -121.901782 27 San Jose 8/6/2013
1 3 San Jose Civic Center 37.330698 -121.888979 15 San Jose 8/5/2013
2 4 Santa Clara at Almaden 37.333988 -121.894902 11 San Jose 8/6/2013
3 5 Adobe on Almaden 37.331415 -121.893200 19 San Jose 8/5/2013
4 6 San Pedro Square 37.336721 -121.894074 15 San Jose 8/7/2013
5 7 Paseo de San Antonio 37.333798 -121.886943 15 San Jose 8/7/2013
6 8 San Salvador at 1st 37.330165 -121.885831 15 San Jose 8/5/2013
7 9 Japantown 37.348742 -121.894715 15 San Jose 8/5/2013
8 10 San Jose City Hall 37.337391 -121.886995 15 San Jose 8/6/2013
9 11 MLK Library 37.335885 -121.885660 19 San Jose 8/6/2013

In [11]:
#Realizamos un join entre trip y station en base a la columna start_station_id
arch_unidos = pd.merge(trip, station, on='start_station_id', how='inner')
arch_unidos.head(10)


Out[11]:
id duration start_date start_station_name start_station_id end_date end_station_name end_station_id bike_id subscription_type zip_code start_date_without_time hora name lat long dock_count city installation_date
0 4576 1 2013-08-29 14:13:00 South Van Ness at Market 66 2013-08-29 14:14:00 South Van Ness at Market 66 520 Subscriber 94127 2013-08-29 14 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013
1 4299 1 2013-08-29 12:02:00 South Van Ness at Market 66 2013-08-29 12:04:00 Market at 10th 67 319 Subscriber 94103 2013-08-29 12 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013
2 4760 1 2013-08-29 17:01:00 South Van Ness at Market 66 2013-08-29 17:03:00 South Van Ness at Market 66 553 Subscriber 94103 2013-08-29 17 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013
3 5070 2 2013-08-29 21:43:00 South Van Ness at Market 66 2013-08-29 21:46:00 South Van Ness at Market 66 598 Subscriber 94115 2013-08-29 21 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013
4 4765 3 2013-08-29 17:05:00 South Van Ness at Market 66 2013-08-29 17:08:00 Market at 10th 67 553 Subscriber 94103 2013-08-29 17 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013
5 4560 3 2013-08-29 13:58:00 South Van Ness at Market 66 2013-08-29 14:02:00 San Francisco City Hall 58 438 Subscriber 94124 2013-08-29 13 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013
6 4559 4 2013-08-29 13:58:00 South Van Ness at Market 66 2013-08-29 14:02:00 San Francisco City Hall 58 554 Subscriber 94115 2013-08-29 13 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013
7 4584 4 2013-08-29 14:17:00 South Van Ness at Market 66 2013-08-29 14:21:00 South Van Ness at Market 66 587 Subscriber 94612 2013-08-29 14 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013
8 5075 5 2013-08-29 21:47:00 South Van Ness at Market 66 2013-08-29 21:52:00 Civic Center BART (7th at Market) 72 598 Subscriber 94115 2013-08-29 21 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013
9 4981 6 2013-08-29 19:41:00 South Van Ness at Market 66 2013-08-29 19:47:00 Market at 10th 67 632 Subscriber 94110 2013-08-29 19 South Van Ness at Market 37.774814 -122.418954 19 San Francisco 8/23/2013

In [12]:
#Visulizacion de la cantidad de viajes segun la ciudad
plt = arch_unidos['city'].value_counts().plot('bar')
plt.set_xlabel('Ciudad')
plt.set_ylabel('Cantidad de viajes')
plt.set_title('Cantidad de viajes dependiendo de la ciudad');



In [16]:
#Visulizacion de la cantidad de viajes segun la estacion
#Solo mostramos las 20 ciudades con mas cantidad de viajes
plt = arch_unidos['start_station_name'].value_counts().tail(20).plot('bar')
plt.set_xlabel('Estacion de bicicleta')
plt.set_ylabel('Cantidad de viajes')
plt.set_title('Top20 de estaciones con menos cantidad de viajes');



In [17]:
#Visulizacion de la cantidad de viajes segun la estacion
#Solo mostramos las 20 ciudades con mas menos de viajes
plt = arch_unidos['start_station_name'].value_counts().head(20).plot('bar')
plt.set_xlabel('Estacion de bicicleta')
plt.set_ylabel('Cantidad de viajes')
plt.set_title('Top20 de estaciones con mas cantidad de viajes');



In [18]:
#ACLARO QUE ESTE GRAFICO SOLO NOS MUESRTA DATOS INCORRECTOS, HABRIA QUE DECIDIR SI PONERLO O NO
# Duracion de viajes por bicicleta.
plt = trip.groupby('bike_id').sum()['duration'].plot(figsize=(14,4));
plt.set_xlabel('ID de Bicicleta')
plt.set_ylabel('Duracion')
plt.set_title('Cantidad de viajes por bicicleta');



In [19]:
#Filtramos los viajes para que solo queden los de duracion menor a 5000
trip_con_duracion_filtrada = trip[trip['duration'] < 5000 ]
# Duracion de viajes por bicicleta.
plt = trip_con_duracion_filtrada.groupby('bike_id').sum()['duration'].plot(figsize=(14,4));
plt.set_xlabel('ID de Bicicleta')
plt.set_ylabel('Duracion')
plt.set_title('Cantidad de viajes por bicicleta');



In [ ]: