Skip to content

Commit

Permalink
Adds overlapping feature #159 (#169)
Browse files Browse the repository at this point in the history
  • Loading branch information
alephcero authored Oct 24, 2024
1 parent 07a91c5 commit 8980b1a
Show file tree
Hide file tree
Showing 9 changed files with 1,559 additions and 314 deletions.
136 changes: 136 additions & 0 deletions notebooks/KPI.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import pandas as pd\n",
"from urbantrips.utils import utils\n",
"from urbantrips.kpi.kpi import compute_route_section_load\n",
"from urbantrips.viz.viz import visualize_route_section_load\n",
"from urbantrips.kpi.line_od_matrix import compute_lines_od_matrix\n",
"from urbantrips.viz.line_od_matrix import visualize_lines_od_matrix\n",
"\n",
"# Completar con el directorio donde se encuentra clonado e instalado el repositorio de UrbanTrips\n",
"URBANTRIPS_PATH = \"RUTA/DE/URBANTRIPS\"\n",
"os.chdir(URBANTRIPS_PATH)\n",
"\n",
"# Leer archivos de configuración y conexiones a las db\n",
"configs = utils.leer_configs_generales()\n",
"conn_insumos = utils.iniciar_conexion_db(tipo='insumos')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Se leen los datos de las lineas\n",
"metadata_lineas = pd.read_sql(\"select id_linea,nombre_linea, modo from metadata_lineas;\", conn_insumos)\n",
"# Se puede buscar por nombre de linea que contenga alguna palabra o numero\n",
"metadata_lineas[metadata_lineas.nombre_linea.str.contains(\"50\") #reemplazar 50 por lo que se desee\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"rango = [7,10] # Se establece un rango horario, en este caso de 7 a 10 \n",
"line_ids = [1,2] # Se establecen los ids de las lineas a analizar\n",
"day_type = 'weekday' # Se establece el tipo de día a analizar puede ser weekday, weekend o una fecha 1/2/2024\n",
"section_meters = 500 # Se establece el parámetro de metros de sección\n",
"n_sections = None # Se establece el número de secciones a analizar, si se usan metro no se necesita"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Se calculan los estadisticos de carga de las secciones de las lineas\n",
"compute_route_section_load(\n",
" line_ids=line_ids, hour_range=rango,\n",
" section_meters = section_meters,day_type=day_type)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Se visualizan los estadisticos de carga de las secciones de las lineas\n",
"visualize_route_section_load(\n",
" line_ids=line_ids, hour_range=rango,\n",
" day_type=day_type, section_meters=section_meters,\n",
" save_gdf=True, stat='totals', \n",
" factor=500, factor_min=10)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Se computa la matriz OD de las lineas\n",
"compute_lines_od_matrix(\n",
" line_ids=line_ids, hour_range=rango,n_sections=n_sections,\n",
" section_meters=section_meters, day_type=day_type, save_csv=True\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Se visualiza la matriz OD de las lineas\n",
"visualize_lines_od_matrix(\n",
" line_ids=line_ids, hour_range=rango,\n",
" day_type=day_type, n_sections=n_sections,section_meters=section_meters,\n",
" stat='totals')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# con este codigo se puede consultar la ayuda de las funciones\n",
"visualize_lines_od_matrix?"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.15"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
217 changes: 217 additions & 0 deletions notebooks/Overlapping.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import pandas as pd\n",
"import geopandas as gpd\n",
"import folium\n",
"import itertools\n",
"\n",
"from urbantrips.utils import utils\n",
"from urbantrips.kpi import overlapping as ovl\n",
"from urbantrips.viz import overlapping as ovl_viz\n",
"\n",
"# Completar con el directorio donde se encuentra clonado e instalado el repositorio de UrbanTrips\n",
"URBANTRIPS_PATH = \"RUTA/DE/URBANTRIPS\"\n",
"os.chdir(URBANTRIPS_PATH)\n",
"\n",
"# Leer archivos de configuración y conexiones a las db\n",
"configs = utils.leer_configs_generales()\n",
"alias = configs['alias_db_data']\n",
"conn_data = utils.iniciar_conexion_db(tipo='data')\n",
"conn_insumos = utils.iniciar_conexion_db(tipo='insumos')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Se leen los datos de las lineas\n",
"metadata_lineas = pd.read_sql(\"select id_linea,nombre_linea, modo from metadata_lineas;\", conn_insumos)\n",
"# Se puede buscar por nombre de linea que contenga alguna palabra o numero\n",
"metadata_lineas[metadata_lineas.nombre_linea.str.contains(\"50\") #reemplazar 50 por lo que se desee buscar en el nombre de la linea\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Configurar el día a procesar \n",
"day = \"weekday\"\n",
"\n",
"# La resolucion h3 (no puede ser mayor a la que aparece en las configuraciones)\n",
"h3_res_comp = 8\n",
"\n",
"# Los id de las lineas a comparar\n",
"comp_line_id = 1\n",
"base_line_id = 2"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Obtiene del archivo de configuración si se deben usar ramales o lineas\n",
"use_branches = configs['lineas_contienen_ramales']\n",
"if use_branches:\n",
" # Lee los datos de los ramales\n",
" metadata = pd.read_sql(f\"select id_linea,id_ramal from metadata_ramales where id_linea in ({base_line_id},{comp_line_id})\",\n",
" conn_insumos,dtype={'id_linea': int, 'id_ramal': int})\n",
" route_type = 'branches'\n",
"\n",
" # Computa todas las posibles combinaciones de ramales entre esas dos lineas\n",
" route_id_combinations = list(itertools.combinations(metadata['id_ramal'], 2))\n",
" base_route_id_combinations = list(itertools.combinations(metadata.loc[metadata.id_linea == base_line_id,'id_ramal'], 2))\n",
" comp_line_id_combinations = list(itertools.combinations(metadata.loc[metadata.id_linea == comp_line_id,'id_ramal'], 2))\n",
" route_id_combinations = [combination for combination in route_id_combinations if ((combination not in base_route_id_combinations) and (combination not in comp_line_id_combinations))]\n",
" \n",
" metadata_branches = pd.read_sql(f\"select * from metadata_ramales where id_linea in ({base_line_id},{comp_line_id})\",\n",
" conn_insumos,dtype={'id_linea': int, 'id_ramal': int})\n",
"\n",
"else:\n",
" route_type = 'lines'\n",
" route_id_combinations = [(base_line_id, comp_line_id)]\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Aca se pueden ver todos los ramales de las lineas a comparar\n",
"metadata_branches "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Selecciona un par de las posibles combinaciones de ramales\n",
"route_id_combination = route_id_combinations[0] \n",
"route_id_combination"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# crea un id de ruta unico de ramal o linea en funcion de si esta configurado para usar ramales o lineas\n",
"if use_branches:\n",
" if route_id_combination[0] in metadata.loc[metadata.id_linea == base_line_id,'id_ramal'].values:\n",
" base_route_id = route_id_combination[0]\n",
" comp_route_id = route_id_combination[1]\n",
"\n",
" else:\n",
" base_route_id = route_id_combination[1]\n",
" comp_route_id = route_id_combination[0]\n",
" \n",
" nombre_ramal_base = metadata_branches.loc[metadata_branches.id_ramal == base_route_id,'nombre_ramal'].item()\n",
" nombre_ramal_comp = metadata_branches.loc[metadata_branches.id_ramal == comp_route_id,'nombre_ramal'].item()\n",
"\n",
" base_route_str = f\"ramal {nombre_ramal_base} (id {base_route_id})\"\n",
" comp_route_str = f\"ramal {nombre_ramal_comp} (id {comp_route_id})\"\n",
"\n",
"else:\n",
" base_route_id,comp_route_id = route_id_combination\n",
" base_route_str = \"\"\n",
" comp_route_str = \"\"\n",
"\n",
"nombre_linea_base = metadata_lineas.loc[metadata_lineas.id_linea == base_line_id,'nombre_linea'].item()\n",
"nombre_linea_comp = metadata_lineas.loc[metadata_lineas.id_linea == comp_line_id,'nombre_linea'].item()\n",
"\n",
"print(f\"Tomando como linea base la linea {nombre_linea_base} (id {base_line_id}) \" + base_route_str)\n",
"print(f\"Tomando como linea comparacion la linea {nombre_linea_comp} (id {comp_line_id}) \" + comp_route_str)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Calcula la superposicion de la oferta de la linea base con la de la linea de comparacion\n",
"overlapping_dict = ovl.compute_supply_overlapping(day, base_route_id,comp_route_id,route_type,h3_res_comp) \n",
"base_gdf = overlapping_dict[\"base\"][\"h3\"]\n",
"base_route_gdf = overlapping_dict[\"base\"][\"line\"]\n",
"comp_gdf = overlapping_dict[\"comp\"][\"h3\"]\n",
"comp_route_gdf = overlapping_dict[\"comp\"][\"line\"]\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Se visualiza la superposicion de la oferta de la linea base con la de la linea de comparacion\n",
"f = ovl_viz.plot_interactive_supply_overlapping(overlapping_dict)\n",
"f.save(f\"resultados/html/{alias}_supply_overlapping_base_{base_route_id}_comp_{comp_route_id}_h3_{h3_res_comp}.html\")\n",
"f"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Calcula la demanda de la linea base y la de comparacion\n",
"base_demand,comp_demand = ovl.compute_demand_overlapping(base_line_id,comp_line_id,day,\n",
" base_route_id,comp_route_id,\n",
" base_gdf,comp_gdf)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Se visualiza la superposicion de la demanda de la linea base con la de la linea de comparacion\n",
"fig = ovl_viz.plot_interactive_demand_overlapping(base_demand, comp_demand, overlapping_dict)\n",
"fig.save(f\"resultados/html/{alias}_demand_overlapping_base_{base_route_id}_comp_{comp_route_id}_h3_{h3_res_comp}.html\")\n",
"fig"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.15"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Loading

0 comments on commit 8980b1a

Please sign in to comment.