dicc_dias = {0: 'Lu', 1: 'Ma', 2: "Mi", 3: "Ju", 4: "Vi", 5:"Sa" , 6: "Do"}
meses = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic']
fecha_inicio = '20190101'
fecha_fin = '20190630'
def crea_grafica_evolucion(ageb_origen):
fig = plt.figure()
gs = plt.GridSpec(20, 30)
ax1 = fig.add_subplot(gs[0:9, 0:9])
ax2 = fig.add_subplot(gs[11:20, 0:9])
ax3 = fig.add_subplot(gs[0:20, 10:20])
ax4 = fig.add_subplot(gs[0:9, 20:30])
ax5 = fig.add_subplot(gs[11:20, 20:30])
fig.subplots_adjust(wspace=110)
fig.set_size_inches(20, 10)
df_origen = df.xs(ageb_origen, axis=0, level='sourceid')
# Diario
agrup_fecha = df_origen.groupby('fecha')[['tiempo']].mean()
agrup_fecha.unstack()['tiempo'].plot(ax=ax1)
agrup_fecha.rolling(7).mean().plot(ax=ax1)
ax1.legend(['Diario', 'promedio semanal'])
ax1.set_ylabel('minutos')
ax1.set_ylim(0, 40)
ax1.set_title('Tiempo promedio a todos los destinos', fontsize=14)
ax1.set_xlabel('')
# Dia de la semana
agrup_dia = df_origen.groupby(['n_dia_sem', 'dia'])[['tiempo']].mean()
agrup_dia.reset_index('n_dia_sem').plot.bar(y='tiempo', ax=ax2, legend=False)
ax2.set_ylim(0, 40)
ax2.set_ylabel('minutos')
ax2.set_xlabel('')
ax2.set_title('Tiempo promedio por día de la semana', fontsize=14)
# Calendario
rango_meses = pd.date_range(start=fecha_inicio, end=fecha_fin, freq='m')
n_meses = len(rango_meses)
heat_data = df_origen.groupby(['n_semana', 'n_dia_sem'])[['tiempo']].mean().unstack('n_semana')['tiempo'].T\
.rename(columns=dicc_dias)
ax = sns.heatmap(heat_data, linewidths=.5, cmap='viridis_r', vmin=20, vmax=35, ax=ax3)
ax.set_yticklabels(ax.get_yticklabels(), rotation=0)
semanas = []
for date in rango_meses:
isocal = date.isocalendar()
ax = linea_division_meses(ax, no_semana=isocal[1], no_dia=isocal[2])
semanas.append(isocal[1])
ax.set_title('Tiempo promedio a todos los destinos (minutos)', fontsize=14, y=1.03)
ax.xaxis.set_ticks_position('top')
ax.set_ylabel('')
ax.set_xlabel('')
ax_twin = ax.twinx()
ax_twin.yaxis.grid(False)
ax_twin.set_ylim(0, max(semanas))
ax_twin.set_yticks(pd.np.arange(2, max(semanas), 4.5))
ax_twin.set_yticklabels(reversed(meses[0:n_meses]))
ax_twin.yaxis.set_ticks_position('left')
ax_twin.yaxis.set_label_position('left')
ax_twin.spines['left'].set_position(('outward', 25))
# Tiempo diario por zona
df_origen.groupby(['fecha', 'zona'])['tiempo'].mean().unstack('zona').rolling(7).mean().plot(ax=ax4)
ax4.set_ylim(0, 60)
ax4.set_title('Tiempo promedio, por zona de destino', fontsize=14)
ax4.set_xlabel('')
ax4.legend(ncol=3, loc=(0, 0.05))
ax4.set_ylabel('minutos (media movil 7 días)', fontsize=12)
# Mapa de zonas
colonias.boundary.plot(color='k', ax=ax5, lw=0.2)
norte.boundary.plot(color='C1', ax=ax5, label='Norte', lw=0.2, zorder=-1)
sur.boundary.plot(color='C4', ax=ax5, label='Sur', lw=0.2, zorder=-1)
poniente.boundary.plot(color='C3', ax=ax5, label='Poniente', lw=0.2, zorder=-1)
oriente.boundary.plot(color='C2', ax=ax5, label='Oriente', lw=0.2, zorder=-1)
centro.boundary.plot(color='C0', ax=ax5, label='Centro', lw=0.2, zorder=-1)
agebs.loc[[str(ageb_origen)]].plot(color='red', ax=ax5, zorder=10)
ax5.legend(bbox_to_anchor=(1.4, 0.7))
ax5.set_axis_off()
#Titulo y guardado
zona_origen = ageb_to_nombre[ageb_origen]
fig.text(x=0, y=-0.1, s='Elaborado por @jjsantoso con datos de Uber Movements', fontdict={'size': 9}, transform=ax.transAxes)
fig.suptitle(f'Todos los viajes de UBER con origen en {zona_origen} (Movement ID {ageb_origen}), 2019-1T y 2T', fontsize=18)
figname = f'graficas/evolucion_diaria_{zona_origen}_2019T1T2.png'
fig.savefig(figname, dpi=300, bbox_inches='tight')
print('Guardada en:', figname)