From 461d136fe11f54e6e71766040fd2008f0758e6b6 Mon Sep 17 00:00:00 2001 From: Sebastian Anapolsky Date: Wed, 16 Oct 2024 17:34:48 -0300 Subject: [PATCH 1/4] correcciones en main --- .gitignore | 9 + configs/configuraciones_generales.yaml | 182 +++++++++++++----- .../configuraciones_generales_2019_m1.yaml | 26 ++- docs/configuraciones.xlsx | Bin 13665 -> 13664 bytes .../pages/3_L\303\255neas de Deseo.py" | 151 ++++++--------- urbantrips/dashboard/pages/4_Poligonos.py | 135 ++++++------- urbantrips/datamodel/trips.py | 26 ++- urbantrips/lineas_deseo/lineas_deseo.py | 93 +++++++-- 8 files changed, 371 insertions(+), 251 deletions(-) diff --git a/.gitignore b/.gitignore index 271cf0e..4828a33 100644 --- a/.gitignore +++ b/.gitignore @@ -144,3 +144,12 @@ dmypy.json *.ipynb .github/desktop.ini *.ini +colectivos_unicos.csv +configs/configuraciones_generales.yaml +configs/configuraciones_generales_2019_m1.yaml +lineas_todas.geojson +lineas_todas_3.geojson +resultado_macheo_optimizado.csv +configs/configuraciones_generales_2019_m1.yaml +configs/configuraciones_generales.yaml +lineas_todas_4.geojson diff --git a/configs/configuraciones_generales.yaml b/configs/configuraciones_generales.yaml index 5af06b9..607c185 100755 --- a/configs/configuraciones_generales.yaml +++ b/configs/configuraciones_generales.yaml @@ -1,84 +1,90 @@ # Archivo de configuración para urbantrips # Bases de datos -nombre_archivo_trx: "transacciones_amba_test.csv" # Especificar el archivo con las transacciones a consumir -alias_db_data: "amba_test" # nombre del sqlite donde se guardan los datos procesados -alias_db_insumos: "amba_test" # nombre del sqlite donde se guardan los insumos generales +nombre_archivo_trx: "UT_AMBA-2024-5-14-AP.csv" # Especificar el archivo con las transacciones a consumir +alias_db_data: "amba_2024" # nombre del sqlite donde se guardan los datos procesados +alias_db_insumos: "amba_2024" # nombre del sqlite donde se guardan los insumos generales +alias_db_dashboard: "amba_2024" # nombre del sqlite donde se guardan los datos a mostrar en el dashboard # Nombre de columnas en el archivo de transacciones nombres_variables_trx: id_trx: "id" # columna con id único del archivo de transacciones - fecha_trx: "fecha" # columna con fecha de la transacción - id_tarjeta_trx: "id_tarjeta" # columna con id de la tarjeta + fecha_trx: "fecha_trx" # columna con fecha de la transacción + id_tarjeta_trx: "id_tarjeta_trx" # columna con id de la tarjeta modo_trx: "modo" # columna con modo de transporte - hora_trx: "hora" # columna con hora de la transacción + hora_trx: # columna con hora de la transacción id_linea_trx: "id_linea" # columna con el id de la línea id_ramal_trx: "id_ramal" # columna con el ramal de la línea - interno_trx: "interno_bus" # columna con interno de la línea - orden_trx: "etapa_red_sube" # columna con el orden de la transacción (si falta hora/minuto en fecha_trx) - latitud_trx: "lat" # columna con la latitud de la transacción - longitud_trx: "lon" # columna con longitud de la transacción + interno_trx: "interno" # columna con interno de la línea + orden_trx: # columna con el orden de la transacción (si falta hora/minuto en fecha_trx) + genero: "genero" # Indica el género asignado a la tarjeta + tarifa: "ats" # Indica el tipo de tarifa asignado a la transacción + latitud_trx: "latitude" # columna con la latitud de la transacción + longitud_trx: "longitude" # columna con longitud de la transacción factor_expansion: # columna con el factor de expansión # Parámetros de transacciones -ordenamiento_transacciones: "orden_trx" # especifica si ordena transacciones por fecha ("fecha_completa") o por variable orden_trx ("orden_trx") en la tabla nombres_variables_trx +ordenamiento_transacciones: "fecha_completa" # especifica si ordena transacciones por fecha ("fecha_completa") o por variable orden_trx ("orden_trx") en la tabla nombres_variables_trx ventana_viajes: 120 # ventana de tiempo para que una transacción sea de un mismo viaje (ej. 60 minutos) ventana_duplicado: 5 # ventana de tiempo si hay duplicado de transacción (ej. Viaje con acompañante) # Elimina transacciones inválidas de la tabla de transacciones tipo_trx_invalidas: tipo_trx_tren: [ # Lista con el contenido a eliminar de la variable seleccionada - "CHECK OUT SIN CHECKIN", - "CHECK OUT", + "COUT", + "COUTS", ] # Imputación de destino tolerancia_parada_destino: 2200 # Distancia para la validación de los destinos (metros) -imputar_destinos_min_distancia: False # Busca la parada que minimiza la distancia con respecto a la siguiente trancción +imputar_destinos_min_distancia: True # Busca la parada que minimiza la distancia con respecto a la siguiente trancción # Parámetros geográficos resolucion_h3: 8 # Resolución de los hexágonos -epsg_m: 9265 # Parámetros geográficos: crs +epsg_m: 5347 # Parámetros geográficos: crs -formato_fecha: "%d/%m/%Y" # Configuración fecha y hora -columna_hora: True +formato_fecha: "%d/%m/%Y %H:%M:%S" # Configuración fecha y hora +columna_hora: False geolocalizar_trx: False -nombre_archivo_gps: # Especificar el archivo con los datos gps de las líneas +nombre_archivo_gps: "UT_GPS-2024-5.csv" # Especificar el archivo con los datos gps de las líneas # Nombre de columnas en el archivo de GPS nombres_variables_gps: - id_gps: - id_linea_gps: - id_ramal_gps: - interno_gps: - fecha_gps: - latitud_gps: - longitud_gps: - velocity_gps: - servicios_gps: # Indica cuando se abre y cierra un servicio + id_gps: "id" + id_linea_gps: "idlinea_gps" + id_ramal_gps: "idramal_gps" + interno_gps: "interno_gps" + fecha_gps: "fecha_gps" + latitud_gps: "lat_gps" + longitud_gps: "lon_gps" + velocity_gps: "vel_gps" + servicios_gps: "serv_val" # Indica cuando se abre y cierra un servicio # Información para procesamiento de líneas -nombre_archivo_informacion_lineas: "lineas_amba_test.csv" # Archivo .csv con lineas, debe contener ("id_linea", "nombre_linea", "modo") +nombre_archivo_informacion_lineas: "UT_LINEAS-2024.csv" # Archivo .csv con lineas, debe contener ("id_linea", "nombre_linea", "modo") lineas_contienen_ramales: True # Especificar si las líneas de colectivo contienen ramales -nombre_archivo_paradas: "stops.csv" +nombre_archivo_paradas: "stops_amba_2023.csv" imprimir_lineas_principales: 5 # Imprimir las lineas principales - "All" imprime todas las líneas # Servicios GPS -utilizar_servicios_gps: False # Especifica si ve van a utilizar los servicios GPS -valor_inicio_servicio: # Valor de la variable que marca el inicio del servicio -valor_fin_servicio: # Valor de la variable que marca el fin del servicio +utilizar_servicios_gps: True # Especifica si ve van a utilizar los servicios GPS +valor_inicio_servicio: "INI" # Valor de la variable que marca el inicio del servicio +valor_fin_servicio: "FIN" # Valor de la variable que marca el fin del servicio modos: - autobus: "COL" - tren: "TRE" - metro: "SUB" + autobus: "COLE" + tren: "FFCC" + metro: "SUBTE" tranvia: brt: + cable: + lancha: + otros: # Capas geográficas con recorridos de líneas -recorridos_geojson: "recorridos_amba.geojson" # archivo geojson con el trazado de las líneas de transporte público +recorridos_geojson: "recorridos_amba_2023.geojson" # archivo geojson con el trazado de las líneas de transporte público filtro_latlong_bbox: minx: -59.3 @@ -88,15 +94,95 @@ filtro_latlong_bbox: # Zonificaciones zonificaciones: - geo1: - var1: - orden1: - geo2: - var2: - orden2: - geo3: - var3: - orden3: + geo1: "coronas.geojson" + var1: "Corona" + orden1: [ + "CABA", + "Primer cordón", + "Segundo cordón", + "Tercer cordón", + "RMBA", + ] + + geo2: "partidos.geojson" + var2: "Partido" + orden2: [ + "Comuna 1", + "Comuna 2", + "Comuna 3", + "Comuna 4", + "Comuna 5", + "Comuna 6", + "Comuna 7", + "Comuna 8", + "Comuna 9", + "Comuna 10", + "Comuna 11", + "Comuna 12", + "Comuna 13", + "Comuna 14", + "Comuna 15", + "Almirante Brown", + "Avellaneda", + "Berazategui", + "Berisso", + "Brandsen", + "Campana", + "Carmen de Areco", + "Cañuelas", + "Ensenada", + "Escobar", + "Esteban Echeverría", + "Exaltación de la Cruz", + "Ezeiza", + "Florencio Varela", + "General Las Heras", + "General Rodríguez", + "General San Martín", + "Hurlingham", + "Ituzaingó", + "José C. Paz", + "La Matanza", + "La Plata", + "Lanús", + "Lobos", + "Lomas de Zamora", + "Luján", + "Magdalena", + "Malvinas Argentinas", + "Marcos Paz", + "Mercedes", + "Merlo", + "Moreno", + "Morón", + "Navarro", + "Pilar", + "Presidente Perón", + "Punta Indio", + "Quilmes", + "San Andrés de Giles", + "San Antonio de Areco", + "San Fernando", + "San Isidro", + "San Miguel", + "San Vicente", + "Tigre", + "Tres de Febrero", + "Vicente López", + "Zárate", + ] + + geo3: "partidos.geojson" + var3: "Zona" + orden3: [ + "CABA", + "Sur", + "Oeste", + "Norte", + "Zarate - Campana", + "Gran La Plata", + ] + geo4: var4: orden4: @@ -104,5 +190,7 @@ zonificaciones: var5: orden5: -poligonos: # Especificar una capa geográfica de polígonos en formato .geojson. El archivo requiere las siguientes columnas: ['id', 'tipo', 'geometry']. 'id' es el id o nombre del polígono, tipo puede ser 'poligono' o 'cuenca'. -tiempos_viaje_estaciones: +poligonos: "poligonos.geojson" # Especificar una capa geográfica de polígonos en formato .geojson. El archivo requiere las siguientes columnas: ['id', 'tipo', 'geometry']. 'id' es el id o nombre del polígono, tipo puede ser 'poligono' o 'cuenca'. + +tiempos_viaje_estaciones: "travel_time_stations.csv" # Especificar una tabla de tiempo de viaje en minutos entre estaciones para modos sin gps + diff --git a/configs/configuraciones_generales_2019_m1.yaml b/configs/configuraciones_generales_2019_m1.yaml index 3188544..af63c62 100644 --- a/configs/configuraciones_generales_2019_m1.yaml +++ b/configs/configuraciones_generales_2019_m1.yaml @@ -1,9 +1,10 @@ # Archivo de configuración para urbantrips # Bases de datos -nombre_archivo_trx: "transacciones_amba_2019_muestra1.csv" # Especificar el archivo con las transacciones a consumir -alias_db_data: "amba_2019_muestra1" # nombre del sqlite donde se guardan los datos procesados -alias_db_insumos: "amba" # nombre del sqlite donde se guardan los insumos generales +nombre_archivo_trx: "transacciones_amba_2019_muestra1.csv" # Especificar el archivo con las transacciones a consumir +alias_db_data: "amba_2019_muestra1" # nombre del sqlite donde se guardan los datos procesados +alias_db_insumos: "amba_2019_muestra1" # nombre del sqlite donde se guardan los insumos generales +alias_db_dashboard: "amba_2019_muestra1" # nombre del sqlite donde se guardan los datos a mostrar en el dashboard # Nombre de columnas en el archivo de transacciones nombres_variables_trx: @@ -16,17 +17,20 @@ nombres_variables_trx: id_ramal_trx: # columna con el ramal de la línea interno_trx: "interno_bus" # columna con interno de la línea orden_trx: "etapa_red_sube" # columna con el orden de la transacción (si falta hora/minuto en fecha_trx) + genero: # Indica el género asignado a la tarjeta + tarifa: # Indica el tipo de tarifa asignado a la transacción latitud_trx: "lat" # columna con la latitud de la transacción longitud_trx: "lon" # columna con longitud de la transacción factor_expansion: "fex_linea" # columna con el factor de expansión # Parámetros de transacciones -ordenamiento_transacciones: "orden_trx" # especifica si ordena transacciones por fecha o por variable orden_trx +ordenamiento_transacciones: "orden_trx" # especifica si ordena transacciones por fecha ("fecha_completa") o por variable orden_trx ("orden_trx") en la tabla nombres_variables_trx ventana_viajes: 120 # ventana de tiempo para que una transacción sea de un mismo viaje (ej. 60 minutos) ventana_duplicado: 5 # ventana de tiempo si hay duplicado de transacción (ej. Viaje con acompañante) +# Elimina transacciones inválidas de la tabla de transacciones tipo_trx_invalidas: - tipo_trx_tren: [ # lista con el contenido a eliminar de la variable seleccionada + tipo_trx_tren: [ # Lista con el contenido a eliminar de la variable seleccionada "CHECK OUT SIN CHECKIN", "CHECK OUT", ] @@ -55,12 +59,11 @@ nombres_variables_gps: fecha_gps: latitud_gps: longitud_gps: - id_gps: velocity_gps: servicios_gps: # Indica cuando se abre y cierra un servicio # Información para procesamiento de líneas -nombre_archivo_informacion_lineas: "lineas.csv" +nombre_archivo_informacion_lineas: "lineas.csv" # Archivo .csv con lineas, debe contener ("id_linea", "nombre_linea", "modo") lineas_contienen_ramales: False # Especificar si las líneas de colectivo contienen ramales nombre_archivo_paradas: imprimir_lineas_principales: 5 # Imprimir las lineas principales - "All" imprime todas las líneas @@ -76,7 +79,12 @@ modos: metro: "SUB" tranvia: brt: + cable: + lancha: + otros: +# Capas geográficas con recorridos de líneas +recorridos_geojson: # archivo geojson con el trazado de las líneas de transporte público filtro_latlong_bbox: minx: -59.3 @@ -182,5 +190,7 @@ zonificaciones: var5: orden5: +poligonos: # Especificar una capa geográfica de polígonos en formato .geojson. El archivo requiere las siguientes columnas: ['id', 'tipo', 'geometry']. 'id' es el id o nombre del polígono, tipo puede ser 'poligono' o 'cuenca'. + +tiempos_viaje_estaciones: # Especificar una tabla de tiempo de viaje en minutos entre estaciones para modos sin gps -tiempos_viaje_estaciones: \ No newline at end of file diff --git a/docs/configuraciones.xlsx b/docs/configuraciones.xlsx index 37b7a75ab285ec4c5ac86114d4a42c12024c2475..832fb1bd1cd9460bff2d62ba77151c81c4130f86 100644 GIT binary patch delta 1270 zcmVi?1==#DSYVA1ZeEII~yYtznT`AE6H&$qsVtPU_;wsa*P@5G0 zxLE{4jI3iSXHqMk;yt(c)A`2_XIpLVS6bgA08lo?g>zLBhBhmB$?S=)xB|<6TAPwN zSei{}E5liC3(j3B!-$YLESXTaMM%tRF!XvYGCtE;U2^4G5W^*NK;IUkvK?BPy#}si z=Dx0iOqUfvtb`P9-+*FNX351yX~R|$+}_av+8Ox8@TUZZsQVI_jy_e2%xJ6E?gXI2 zmh_STl!TNXgkX0ZgV!PTL&G0`gwNp9%NIgs$5rzmQf8TtPY3~OooMg>4Ho!fl1{Fd&LFtIn0 z;d0v;Z$<73P}hj`VN3h$3m2OL7}LSfKXhz$<@;NT2OvP-c|6g76dw?rwFDP%1%5an z7`|ZGv|nJ_%t$pQbM0F)g+A}+CgvEK#DBwFjiY!vjH4hL(_TR7d=N}}{XwvpFBU^On$D)9h0mTpO%kaA z;HXDPu`;}Erpy$= zYSo)}XFQsn-E6ooi(m`dh)NDn+>1~El2u&D6Zvna%tYm~Go#;Q*$A+Df-T zS2%!!VOl8bHq?R_4Y!AXf*Lz^D_aQQk99tQxoe2;FBv>Ys;a`Q>kR+qH7nGx70v4N z)HAx$+4pI+u7C$_e$u9OMBdV;=jjOLNtC2vbQ>n=G`=HILi+JXGxNp&CXcpJ9*q94 zcoW7^826`1N|J;`>6zkDz(-tAx!kxz%0Y&+iI2K#`H3!XH2(pUkpmR7129qp1n|0$ gv$I(#$)&Kwi delta 1272 zcmVF!wo2PnwcYv> zsdB&xR*lVU(if3w3RO1%vE+i=T?dL$U8EOlsWe>*aC=K4wAJv7;ZFh>!r@C`I`~x03$2V=*&~4V zd(sE~lfWlrF9h4e7`zT?>}&Raz+DcXSn2qUtl}rE_!*1@??xjatxhW`1n-S#(G#~2 zpPsC^U_X25BHA?HY3(v4FcQ?*yyTXZ89s)k+OWL`x^2!|F2EWlK^S5G^hwT_8kKBC zTVZcN$OAlV48lIGIO($GMk`C&U}a`MH-&lH41G`FL`ihi6ef`UB4BI4u-yZS|-P z2c6+D2;so=jcx}E3DTCA&oq7qkC*4>e}=*K$2sh};7`sr=2=B~mTHq>kA&dV zZhyJyjJLeB6{u?xjA2Xv>rAyBW!@WUgIHCeY{I+{GLtow{%6i;{FX9bPM_D4;~#4b*angusQJSQcKR2S zkpmR7APO2I1tv58f|9d8EiwUr#|fpC6@vN@ry^B?s#R~sUce=BEZY?LoPJAxtd2ti zs8w&?o$+XPcJtA$Dx(iDR@Q2WNH0MVC|(PxmP7PB8^<>&vW_Xi%38q??ZKi^ae0w* zO?hqL$|}hVtN|HWhQeG)t@*U$Z5D;511FxB|xn za|}0vvF;SnK~nHeQg2Kd1O&%WLIuiMOnL+#xeiQa|NIb;6J{mdUi+C2c2BhhZ^4ee zv$7*@x7*$}3pTuef?p?((=ci*Rg)D5ROEtFCtV3ej*n0OvYYukaM!lG!UNm@bG2!K zuJC{W%Z=2|Z>R;&8h#IdC9`hgSGJHK?)JqL=Ds1nK2>z9n668^-sku?uUVmi5814~ z$O5A)z5S3@>k35V=cjF2KgdgV|1cY)B2CgPP6lzB&B!%PQhG(+nwii3H+i&;>R|ML z#ePhZn2;IC=+%HG{S(C>fe>-Y)N - .big-font { - font-size:30px !important; - font-weight:bold; - } - -
- No hay datos para mostrar -
- """ - col2.markdown(texto_html, unsafe_allow_html=True) - texto_html = """ - -
- Verifique que los procesos se corrieron correctamente -
- """ - col2.markdown(texto_html, unsafe_allow_html=True) + col2.text('No hay datos para mostrar') + col2.text('Verifique que los procesos se corrieron correctamente') + else: matriz = pd.DataFrame([]) - # Usar HTML para personalizar el estilo del texto - texto_html = """ - -
- No hay datos para mostrar -
- """ - col2.markdown(texto_html, unsafe_allow_html=True) - texto_html = """ - -
- Verifique que los procesos se corrieron correctamente -
- """ - col2.markdown(texto_html, unsafe_allow_html=True) + col2.text('No hay datos para mostrar') with st.expander('Indicadores'): col1, col2, col3 = st.columns([2, 2, 2]) @@ -503,55 +457,58 @@ def traigo_socio_indicadores(socio_indicadores): with st.expander('Matrices'): col1, col2 = st.columns([1, 4]) - - # col2.table(matriz) - - tipo_matriz = col1.selectbox( - 'Variable', options=['Viajes', 'Distancia promedio (kms)', 'Tiempo promedio (min)', 'Velocidad promedio (km/h)']) - - normalize = False - if tipo_matriz == 'Viajes': - var_matriz = 'factor_expansion_linea' - normalize = col1.checkbox('Normalizar', value=True) - if tipo_matriz == 'Distancia promedio (kms)': - var_matriz = 'distance_osm_drive' - if tipo_matriz == 'Tiempo promedio (min)': - var_matriz = 'travel_time_min' - if tipo_matriz == 'Velocidad promedio (km/h)': - var_matriz = 'travel_speed' - if len(matriz) > 0: - od_heatmap = pd.crosstab( - index=matriz['Origen'], - columns=matriz['Destino'], - values=matriz[var_matriz], - aggfunc="sum", - normalize=normalize, - ) - - if normalize: - od_heatmap = (od_heatmap * 100).round(2) - else: - od_heatmap = od_heatmap.round(0) - - od_heatmap = od_heatmap.reset_index() - od_heatmap['Origen'] = od_heatmap['Origen'].str[4:] - od_heatmap = od_heatmap.set_index('Origen') - od_heatmap.columns = [i[4:] for i in od_heatmap.columns] - - fig = px.imshow(od_heatmap, text_auto=True, - color_continuous_scale='Blues',) - - fig.update_coloraxes(showscale=False) - - if len(od_heatmap) <= 20: - fig.update_layout(width=800, height=800) - elif (len(od_heatmap) > 20) & (len(od_heatmap) <= 40): - fig.update_layout(width=1100, height=1100) - elif len(od_heatmap) > 40: - fig.update_layout(width=1400, height=1400) - col2.plotly_chart(fig) + # col2.table(matriz) + + tipo_matriz = col1.selectbox( + 'Variable', options=['Viajes', 'Distancia promedio (kms)', 'Tiempo promedio (min)', 'Velocidad promedio (km/h)']) + + normalize = False + if tipo_matriz == 'Viajes': + var_matriz = 'factor_expansion_linea' + normalize = col1.checkbox('Normalizar', value=True) + if tipo_matriz == 'Distancia promedio (kms)': + var_matriz = 'distance_osm_drive' + if tipo_matriz == 'Tiempo promedio (min)': + var_matriz = 'travel_time_min' + if tipo_matriz == 'Velocidad promedio (km/h)': + var_matriz = 'travel_speed' + + if len(matriz) > 0: + od_heatmap = pd.crosstab( + index=matriz['Origen'], + columns=matriz['Destino'], + values=matriz[var_matriz], + aggfunc="sum", + normalize=normalize, + ) + + if normalize: + od_heatmap = (od_heatmap * 100).round(2) + else: + od_heatmap = od_heatmap.round(0) + + od_heatmap = od_heatmap.reset_index() + od_heatmap['Origen'] = od_heatmap['Origen'].str[4:] + od_heatmap = od_heatmap.set_index('Origen') + od_heatmap.columns = [i[4:] for i in od_heatmap.columns] + + fig = px.imshow(od_heatmap, text_auto=True, + color_continuous_scale='Blues',) + + fig.update_coloraxes(showscale=False) + + if len(od_heatmap) <= 20: + fig.update_layout(width=800, height=800) + elif (len(od_heatmap) > 20) & (len(od_heatmap) <= 40): + fig.update_layout(width=1100, height=1100) + elif len(od_heatmap) > 40: + fig.update_layout(width=1400, height=1400) + + col2.plotly_chart(fig) + else: + col2.text('No hay datos para mostrar') with st.expander('Género y tarifas'): col1, col2, col3, col4 = st.columns([1, 2, 2, 2]) diff --git a/urbantrips/dashboard/pages/4_Poligonos.py b/urbantrips/dashboard/pages/4_Poligonos.py index 5918f69..3b344e6 100644 --- a/urbantrips/dashboard/pages/4_Poligonos.py +++ b/urbantrips/dashboard/pages/4_Poligonos.py @@ -214,7 +214,7 @@ def crear_mapa_poligonos(df_viajes, etapas_all = levanto_tabla_sql('poly_etapas') matrices_all = levanto_tabla_sql('poly_matrices') zonificaciones = levanto_tabla_sql('zonificaciones') - +general_ = '' with st.expander('Polígonos', expanded=True): col1, col2 = st.columns([1, 4]) @@ -394,101 +394,74 @@ def crear_mapa_poligonos(df_viajes, else: matriz = pd.DataFrame([]) - col2.markdown(""" - - """, unsafe_allow_html=True) - - col2.markdown( - '

¡¡ No hay datos para mostrar !!

', unsafe_allow_html=True) + col2.text('No hay datos para mostrar') else: matriz = pd.DataFrame([]) - # Usar HTML para personalizar el estilo del texto - texto_html = """ - -
- No hay datos para mostrar -
- """ - col2.markdown(texto_html, unsafe_allow_html=True) - texto_html = """ - -
- Verifique que existan alguna capa de polígonos o que los procesos se corrieron correctamente -
- """ - col2.markdown(texto_html, unsafe_allow_html=True) + col2.text('No hay datos para mostrar') with st.expander('Indicadores'): col1, col2, col3 = st.columns([2, 2, 2]) - if len(etapas_all) > 0: + if len(general_) > 0: col1.table(general_) col2.table(modal_) col3.table(distancias_) + else: + col2.text('No hay datos para mostrar') with st.expander('Matrices'): col1, col2 = st.columns([1, 4]) - tipo_matriz = col1.selectbox( - 'Variable', options=['Viajes', 'Distancia promedio (kms)', 'Tiempo promedio (min)', 'Velocidad promedio (km/h)']) - - normalize = False - if tipo_matriz == 'Viajes': - var_matriz = 'factor_expansion_linea' - normalize = col1.checkbox('Normalizar', value=True) - if tipo_matriz == 'Distancia promedio (kms)': - var_matriz = 'distance_osm_drive' - if tipo_matriz == 'Tiempo promedio (min)': - var_matriz = 'travel_time_min' - if tipo_matriz == 'Velocidad promedio (km/h)': - var_matriz = 'travel_speed' - - if len(matriz) > 0: - od_heatmap = pd.crosstab( - index=matriz['Origen'], - columns=matriz['Destino'], - values=matriz['factor_expansion_linea'], - aggfunc="sum", - normalize=normalize, - ) - if normalize: - od_heatmap = (od_heatmap * 100).round(1) - else: - od_heatmap = od_heatmap.round(0) - od_heatmap = od_heatmap.reset_index() - od_heatmap['Origen'] = od_heatmap['Origen'].str[4:] - od_heatmap = od_heatmap.set_index('Origen') - od_heatmap.columns = [i[4:] for i in od_heatmap.columns] - - fig = px.imshow(od_heatmap, text_auto=True, - color_continuous_scale='Blues',) - - fig.update_coloraxes(showscale=False) - - if len(matriz) <= 20: - fig.update_layout(width=800, height=800) - elif (len(matriz) > 20) & (len(od_heatmap) <= 40): - fig.update_layout(width=1000, height=1000) - elif len(matriz) > 40: - fig.update_layout(width=1400, height=800) - - col2.plotly_chart(fig) + tipo_matriz = col1.selectbox( + 'Variable', options=['Viajes', 'Distancia promedio (kms)', 'Tiempo promedio (min)', 'Velocidad promedio (km/h)']) + + normalize = False + if tipo_matriz == 'Viajes': + var_matriz = 'factor_expansion_linea' + normalize = col1.checkbox('Normalizar', value=True) + if tipo_matriz == 'Distancia promedio (kms)': + var_matriz = 'distance_osm_drive' + if tipo_matriz == 'Tiempo promedio (min)': + var_matriz = 'travel_time_min' + if tipo_matriz == 'Velocidad promedio (km/h)': + var_matriz = 'travel_speed' + + + if len(matriz) > 0: + od_heatmap = pd.crosstab( + index=matriz['Origen'], + columns=matriz['Destino'], + values=matriz['factor_expansion_linea'], + aggfunc="sum", + normalize=normalize, + ) + if normalize: + od_heatmap = (od_heatmap * 100).round(1) + else: + od_heatmap = od_heatmap.round(0) + + od_heatmap = od_heatmap.reset_index() + od_heatmap['Origen'] = od_heatmap['Origen'].str[4:] + od_heatmap = od_heatmap.set_index('Origen') + od_heatmap.columns = [i[4:] for i in od_heatmap.columns] + + fig = px.imshow(od_heatmap, text_auto=True, + color_continuous_scale='Blues',) + + fig.update_coloraxes(showscale=False) + + if len(matriz) <= 20: + fig.update_layout(width=800, height=800) + elif (len(matriz) > 20) & (len(od_heatmap) <= 40): + fig.update_layout(width=1000, height=1000) + elif len(matriz) > 40: + fig.update_layout(width=1400, height=800) + + col2.plotly_chart(fig) + else: + col2.text('No hay datos para mostrar') diff --git a/urbantrips/datamodel/trips.py b/urbantrips/datamodel/trips.py index 85e3efc..5574c85 100644 --- a/urbantrips/datamodel/trips.py +++ b/urbantrips/datamodel/trips.py @@ -263,7 +263,13 @@ def create_trips_from_legs(): conn.execute(query) conn.commit() - etapas.to_sql("etapas", conn, if_exists="append", index=False) + # etapas.to_sql("etapas", conn, if_exists="append", index=False) + chunk_size = 400000 # Número de registros por chunk + + # Subir los datos por partes + for i in range(0, len(etapas), chunk_size): + etapas_chunk = etapas.iloc[i:i + chunk_size] + etapas_chunk.to_sql("etapas", conn, if_exists="append", index=False) print(f'Creando tabla de viajes de {len(etapas)} etapas') # Crear tabla viajes @@ -355,8 +361,15 @@ def create_trips_from_legs(): conn.execute(query) conn.commit() - viajes.to_sql("viajes", conn, if_exists="append", index=False) + # viajes.to_sql("viajes", conn, if_exists="append", index=False) + + chunk_size = 400000 # Número de registros por chunk + # Subir los datos por partes + for i in range(0, len(viajes), chunk_size): + viajes_chunk = viajes.iloc[i:i + chunk_size] + viajes_chunk.to_sql("viajes", conn, if_exists="append", index=False) + print('Creando tabla de usuarios...') usuarios = viajes.groupby(["dia", "id_tarjeta"], as_index=False).agg( {"od_validado": "min", @@ -438,10 +451,15 @@ def rearrange_trip_id_same_od(): conn_data.execute(query) conn_data.commit() - etapas.to_sql("etapas", conn_data, - if_exists="append", index=False) + # etapas.to_sql("etapas", conn_data, + # if_exists="append", index=False) + chunk_size = 400000 # Número de registros por chunk + # Subir los datos por partes + for i in range(0, len(etapas), chunk_size): + etapas_chunk = etapas.iloc[i:i + chunk_size] + etapas_chunk.to_sql("etapas", conn_data, if_exists="append", index=False) conn_data.close() diff --git a/urbantrips/lineas_deseo/lineas_deseo.py b/urbantrips/lineas_deseo/lineas_deseo.py index aacfef6..abd2b31 100644 --- a/urbantrips/lineas_deseo/lineas_deseo.py +++ b/urbantrips/lineas_deseo/lineas_deseo.py @@ -1107,21 +1107,46 @@ def preparo_lineas_deseo(etapas_selec, viajes_selec, polygons_h3='', poligonos=' n += 1 - if id_polygon == 'NONE': - etapas_agrupadas_all = etapas_agrupadas_all.drop(['id_polygon', - 'poly_inicio_norm', - 'poly_transfer1_norm', - 'poly_transfer2_norm', - 'poly_fin_norm'], axis=1) - viajes_matrices = viajes_matrices.drop( - ['poly_inicio', 'poly_fin'], axis=1) # # Agrupar a nivel de mes y corregir factor de expansión - sum_viajes = etapas_agrupadas_all.groupby(['dia', 'mes', 'tipo_dia', 'zona'], as_index=False).factor_expansion_linea.sum().groupby(['mes', 'tipo_dia', 'zona'], as_index=False).factor_expansion_linea.mean().round() + sum_viajes = etapas_agrupadas_all.groupby(['dia', + 'mes', + 'tipo_dia', + 'zona'], as_index=False).factor_expansion_linea.sum().groupby(['mes', + 'tipo_dia', + 'zona'], as_index=False).factor_expansion_linea.mean().round() - aggregate_cols = ['mes', 'tipo_dia', 'zona', 'inicio_norm', 'transfer1_norm','transfer2_norm', 'fin_norm', 'transferencia', 'modo_agregado', 'rango_hora', 'genero', 'tarifa', 'distancia', ] - weighted_mean_cols=['distance_osm_drive', 'distance_osm_drive_etapas', 'travel_time_min', 'travel_speed', 'lat1_norm', 'lon1_norm', 'lat2_norm', 'lon2_norm', 'lat3_norm', 'lon3_norm', 'lat4_norm', 'lon4_norm'] + aggregate_cols = ['mes', + 'tipo_dia', + 'id_polygon', + 'poly_inicio_norm', + 'poly_transfer1_norm', + 'poly_transfer2_norm', + 'poly_fin_norm', + 'zona', + 'inicio_norm', + 'transfer1_norm', + 'transfer2_norm', + 'fin_norm', + 'transferencia', + 'modo_agregado', + 'rango_hora', + 'genero', + 'tarifa', + 'distancia', ] + weighted_mean_cols=['distance_osm_drive', + 'distance_osm_drive_etapas', + 'travel_time_min', + 'travel_speed', + 'lat1_norm', + 'lon1_norm', + 'lat2_norm', + 'lon2_norm', + 'lat3_norm', + 'lon3_norm', + 'lat4_norm', + 'lon4_norm'] etapas_agrupadas_all = calculate_weighted_means(etapas_agrupadas_all, aggregate_cols=aggregate_cols, @@ -1130,6 +1155,7 @@ def preparo_lineas_deseo(etapas_selec, viajes_selec, polygons_h3='', poligonos=' zero_to_nan=zero_to_nan, var_fex_summed=False) + sum_viajes['factor_expansion_linea'] = 1 - (sum_viajes['factor_expansion_linea'] / etapas_agrupadas_all.groupby(['mes', 'tipo_dia', 'zona'], as_index=False).factor_expansion_linea.sum().factor_expansion_linea ) sum_viajes = sum_viajes.rename(columns={'factor_expansion_linea':'factor_correccion'}) @@ -1142,9 +1168,35 @@ def preparo_lineas_deseo(etapas_selec, viajes_selec, polygons_h3='', poligonos=' # # Agrupar a nivel de mes y corregir factor de expansión sum_viajes = viajes_matrices.groupby(['dia', 'mes', 'tipo_dia', 'zona'], as_index=False).factor_expansion_linea.sum().groupby(['mes', 'tipo_dia', 'zona'], as_index=False).factor_expansion_linea.mean() - aggregate_cols = ['id_polygon', 'mes', 'tipo_dia', 'zona', 'inicio', 'fin', 'transferencia', 'modo_agregado', 'rango_hora', 'genero', 'tarifa', 'distancia', 'orden_origen', 'orden_destino', 'Origen', 'Destino'] - weighted_mean_cols = ['lat1', 'lon1', 'lat4', 'lon4', 'distance_osm_drive', 'travel_time_min', 'travel_speed',] - zero_to_nan = ['lat1', 'lon1', 'lat4', 'lon4'] + aggregate_cols = ['id_polygon', + 'poly_inicio', + 'poly_fin', + 'mes', + 'tipo_dia', + 'zona', + 'inicio', + 'fin', + 'transferencia', + 'modo_agregado', + 'rango_hora', + 'genero', + 'tarifa', + 'distancia', + 'orden_origen', + 'orden_destino', + 'Origen', + 'Destino'] + weighted_mean_cols = ['lat1', + 'lon1', + 'lat4', + 'lon4', + 'distance_osm_drive', + 'travel_time_min', + 'travel_speed',] + zero_to_nan = ['lat1', + 'lon1', + 'lat4', + 'lon4'] viajes_matrices = calculate_weighted_means(viajes_matrices, aggregate_cols=aggregate_cols, @@ -1162,6 +1214,18 @@ def preparo_lineas_deseo(etapas_selec, viajes_selec, polygons_h3='', poligonos=' viajes_matrices = viajes_matrices.drop(['factor_correccion', 'factor_expansion_linea'], axis=1) viajes_matrices = viajes_matrices.rename(columns={'factor_expansion_linea2':'factor_expansion_linea'}) + if id_polygon == 'NONE': + etapas_agrupadas_all = etapas_agrupadas_all.drop(['id_polygon', + 'poly_inicio_norm', + 'poly_transfer1_norm', + 'poly_transfer2_norm', + 'poly_fin_norm'], axis=1) + + viajes_matrices = viajes_matrices.drop( + ['poly_inicio', + 'poly_fin'], axis=1) + + return etapas_agrupadas_all, etapas_sin_agrupar, viajes_matrices, zonificaciones @@ -1221,6 +1285,7 @@ def proceso_lineas_deseo(): socio_indicadores = crea_socio_indicadores(etapas, viajes) + print('Guardo datos para dashboard') conn_dash = iniciar_conexion_db(tipo='dash') etapas_agrupadas = etapas_agrupadas.fillna(0) From 29d8c50cd90060e90d906eab5b77497a8311b4b2 Mon Sep 17 00:00:00 2001 From: Sebastian Anapolsky Date: Thu, 17 Oct 2024 10:35:35 -0300 Subject: [PATCH 2/4] . --- urbantrips/viz/viz.py | 1 + 1 file changed, 1 insertion(+) diff --git a/urbantrips/viz/viz.py b/urbantrips/viz/viz.py index 4b3bcc4..a058c6b 100755 --- a/urbantrips/viz/viz.py +++ b/urbantrips/viz/viz.py @@ -38,6 +38,7 @@ ) import warnings + warnings.filterwarnings("ignore") From 68b6b059a462f9e948bfa1a4a0f8a05c6c721dc1 Mon Sep 17 00:00:00 2001 From: Sebastian Anapolsky Date: Thu, 17 Oct 2024 13:03:59 -0300 Subject: [PATCH 3/4] filtro_latlong_bbox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolve tema de filtro_latlong_bbox para que tome la geometría de todas las zonas y no solo la primera --- urbantrips/datamodel/transactions.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/urbantrips/datamodel/transactions.py b/urbantrips/datamodel/transactions.py index 8bdd309..af7b8f6 100644 --- a/urbantrips/datamodel/transactions.py +++ b/urbantrips/datamodel/transactions.py @@ -448,9 +448,11 @@ def eliminar_trx_fuera_bbox(trx): ) trx = gpd.GeoDataFrame(trx, geometry="geometry", crs=4326) - zona = zonificaciones.zona.head().values[0] - zonificaciones = zonificaciones[zonificaciones.zona == zona] - zonificaciones = zonificaciones.dissolve(by="zona") + # zona = zonificaciones.zona.head().values[0] + # zonificaciones = zonificaciones[zonificaciones.zona == zona] + # zonificaciones = zonificaciones.dissolve(by="zona") + zonificaciones['dissolve_column'] = 1 + zonificaciones = zonificaciones.dissolve(by='dissolve_column') trx = ( gpd.sjoin(zonificaciones[["geometry"]], trx) From 8abd8f63498130ac939d4648642a12fd6be4fdb8 Mon Sep 17 00:00:00 2001 From: alephcero Date: Fri, 18 Oct 2024 12:17:37 -0300 Subject: [PATCH 4/4] Update config --- configs/configuraciones_generales.yaml | 183 +++++++------------------ 1 file changed, 48 insertions(+), 135 deletions(-) diff --git a/configs/configuraciones_generales.yaml b/configs/configuraciones_generales.yaml index 607c185..8721c0d 100755 --- a/configs/configuraciones_generales.yaml +++ b/configs/configuraciones_generales.yaml @@ -1,90 +1,85 @@ # Archivo de configuración para urbantrips # Bases de datos -nombre_archivo_trx: "UT_AMBA-2024-5-14-AP.csv" # Especificar el archivo con las transacciones a consumir -alias_db_data: "amba_2024" # nombre del sqlite donde se guardan los datos procesados -alias_db_insumos: "amba_2024" # nombre del sqlite donde se guardan los insumos generales -alias_db_dashboard: "amba_2024" # nombre del sqlite donde se guardan los datos a mostrar en el dashboard +nombre_archivo_trx: "transacciones_amba_test.csv" # Especificar el archivo con las transacciones a consumir +alias_db_data: "amba_test" # nombre del sqlite donde se guardan los datos procesados +alias_db_insumos: "amba_test" # nombre del sqlite donde se guardan los insumos generales +alias_db_dashboard: "amba_test" # nombre del sqlite donde se guardan los datos a mostrar en el dashboard # Nombre de columnas en el archivo de transacciones nombres_variables_trx: id_trx: "id" # columna con id único del archivo de transacciones - fecha_trx: "fecha_trx" # columna con fecha de la transacción - id_tarjeta_trx: "id_tarjeta_trx" # columna con id de la tarjeta + fecha_trx: "fecha" # columna con fecha de la transacción + id_tarjeta_trx: "id_tarjeta" # columna con id de la tarjeta modo_trx: "modo" # columna con modo de transporte - hora_trx: # columna con hora de la transacción + hora_trx: "hora" # columna con hora de la transacción id_linea_trx: "id_linea" # columna con el id de la línea id_ramal_trx: "id_ramal" # columna con el ramal de la línea - interno_trx: "interno" # columna con interno de la línea - orden_trx: # columna con el orden de la transacción (si falta hora/minuto en fecha_trx) - genero: "genero" # Indica el género asignado a la tarjeta - tarifa: "ats" # Indica el tipo de tarifa asignado a la transacción - latitud_trx: "latitude" # columna con la latitud de la transacción - longitud_trx: "longitude" # columna con longitud de la transacción + interno_trx: "interno_bus" # columna con interno de la línea + orden_trx: "etapa_red_sube" # columna con el orden de la transacción (si falta hora/minuto en fecha_trx) + latitud_trx: "lat" # columna con la latitud de la transacción + longitud_trx: "lon" # columna con longitud de la transacción factor_expansion: # columna con el factor de expansión # Parámetros de transacciones -ordenamiento_transacciones: "fecha_completa" # especifica si ordena transacciones por fecha ("fecha_completa") o por variable orden_trx ("orden_trx") en la tabla nombres_variables_trx +ordenamiento_transacciones: "orden_trx" # especifica si ordena transacciones por fecha ("fecha_completa") o por variable orden_trx ("orden_trx") en la tabla nombres_variables_trx ventana_viajes: 120 # ventana de tiempo para que una transacción sea de un mismo viaje (ej. 60 minutos) ventana_duplicado: 5 # ventana de tiempo si hay duplicado de transacción (ej. Viaje con acompañante) # Elimina transacciones inválidas de la tabla de transacciones tipo_trx_invalidas: tipo_trx_tren: [ # Lista con el contenido a eliminar de la variable seleccionada - "COUT", - "COUTS", + "CHECK OUT SIN CHECKIN", + "CHECK OUT", ] # Imputación de destino tolerancia_parada_destino: 2200 # Distancia para la validación de los destinos (metros) -imputar_destinos_min_distancia: True # Busca la parada que minimiza la distancia con respecto a la siguiente trancción +imputar_destinos_min_distancia: False # Busca la parada que minimiza la distancia con respecto a la siguiente trancción # Parámetros geográficos resolucion_h3: 8 # Resolución de los hexágonos -epsg_m: 5347 # Parámetros geográficos: crs +epsg_m: 9265 # Parámetros geográficos: crs -formato_fecha: "%d/%m/%Y %H:%M:%S" # Configuración fecha y hora -columna_hora: False +formato_fecha: "%d/%m/%Y" # Configuración fecha y hora +columna_hora: True geolocalizar_trx: False -nombre_archivo_gps: "UT_GPS-2024-5.csv" # Especificar el archivo con los datos gps de las líneas +nombre_archivo_gps: # Especificar el archivo con los datos gps de las líneas # Nombre de columnas en el archivo de GPS nombres_variables_gps: - id_gps: "id" - id_linea_gps: "idlinea_gps" - id_ramal_gps: "idramal_gps" - interno_gps: "interno_gps" - fecha_gps: "fecha_gps" - latitud_gps: "lat_gps" - longitud_gps: "lon_gps" - velocity_gps: "vel_gps" - servicios_gps: "serv_val" # Indica cuando se abre y cierra un servicio + id_gps: + id_linea_gps: + id_ramal_gps: + interno_gps: + fecha_gps: + latitud_gps: + longitud_gps: + velocity_gps: + servicios_gps: # Indica cuando se abre y cierra un servicio # Información para procesamiento de líneas -nombre_archivo_informacion_lineas: "UT_LINEAS-2024.csv" # Archivo .csv con lineas, debe contener ("id_linea", "nombre_linea", "modo") +nombre_archivo_informacion_lineas: "lineas_amba_test.csv" # Archivo .csv con lineas, debe contener ("id_linea", "nombre_linea", "modo") lineas_contienen_ramales: True # Especificar si las líneas de colectivo contienen ramales -nombre_archivo_paradas: "stops_amba_2023.csv" +nombre_archivo_paradas: "stops.csv" imprimir_lineas_principales: 5 # Imprimir las lineas principales - "All" imprime todas las líneas # Servicios GPS -utilizar_servicios_gps: True # Especifica si ve van a utilizar los servicios GPS -valor_inicio_servicio: "INI" # Valor de la variable que marca el inicio del servicio -valor_fin_servicio: "FIN" # Valor de la variable que marca el fin del servicio +utilizar_servicios_gps: False # Especifica si ve van a utilizar los servicios GPS +valor_inicio_servicio: # Valor de la variable que marca el inicio del servicio +valor_fin_servicio: # Valor de la variable que marca el fin del servicio modos: - autobus: "COLE" - tren: "FFCC" - metro: "SUBTE" + autobus: "COL" + tren: "TRE" + metro: "SUB" tranvia: brt: - cable: - lancha: - otros: # Capas geográficas con recorridos de líneas -recorridos_geojson: "recorridos_amba_2023.geojson" # archivo geojson con el trazado de las líneas de transporte público +recorridos_geojson: "recorridos_amba.geojson" # archivo geojson con el trazado de las líneas de transporte público filtro_latlong_bbox: minx: -59.3 @@ -94,95 +89,15 @@ filtro_latlong_bbox: # Zonificaciones zonificaciones: - geo1: "coronas.geojson" - var1: "Corona" - orden1: [ - "CABA", - "Primer cordón", - "Segundo cordón", - "Tercer cordón", - "RMBA", - ] - - geo2: "partidos.geojson" - var2: "Partido" - orden2: [ - "Comuna 1", - "Comuna 2", - "Comuna 3", - "Comuna 4", - "Comuna 5", - "Comuna 6", - "Comuna 7", - "Comuna 8", - "Comuna 9", - "Comuna 10", - "Comuna 11", - "Comuna 12", - "Comuna 13", - "Comuna 14", - "Comuna 15", - "Almirante Brown", - "Avellaneda", - "Berazategui", - "Berisso", - "Brandsen", - "Campana", - "Carmen de Areco", - "Cañuelas", - "Ensenada", - "Escobar", - "Esteban Echeverría", - "Exaltación de la Cruz", - "Ezeiza", - "Florencio Varela", - "General Las Heras", - "General Rodríguez", - "General San Martín", - "Hurlingham", - "Ituzaingó", - "José C. Paz", - "La Matanza", - "La Plata", - "Lanús", - "Lobos", - "Lomas de Zamora", - "Luján", - "Magdalena", - "Malvinas Argentinas", - "Marcos Paz", - "Mercedes", - "Merlo", - "Moreno", - "Morón", - "Navarro", - "Pilar", - "Presidente Perón", - "Punta Indio", - "Quilmes", - "San Andrés de Giles", - "San Antonio de Areco", - "San Fernando", - "San Isidro", - "San Miguel", - "San Vicente", - "Tigre", - "Tres de Febrero", - "Vicente López", - "Zárate", - ] - - geo3: "partidos.geojson" - var3: "Zona" - orden3: [ - "CABA", - "Sur", - "Oeste", - "Norte", - "Zarate - Campana", - "Gran La Plata", - ] - + geo1: + var1: + orden1: + geo2: + var2: + orden2: + geo3: + var3: + orden3: geo4: var4: orden4: @@ -190,7 +105,5 @@ zonificaciones: var5: orden5: -poligonos: "poligonos.geojson" # Especificar una capa geográfica de polígonos en formato .geojson. El archivo requiere las siguientes columnas: ['id', 'tipo', 'geometry']. 'id' es el id o nombre del polígono, tipo puede ser 'poligono' o 'cuenca'. - -tiempos_viaje_estaciones: "travel_time_stations.csv" # Especificar una tabla de tiempo de viaje en minutos entre estaciones para modos sin gps - +poligonos: # Especificar una capa geográfica de polígonos en formato .geojson. El archivo requiere las siguientes columnas: ['id', 'tipo', 'geometry']. 'id' es el id o nombre del polígono, tipo puede ser 'poligono' o 'cuenca'. +tiempos_viaje_estaciones: