From c68b1662bf85de2c924cbecd3ea24cafdb28337f Mon Sep 17 00:00:00 2001 From: Felipe Gonzalez Date: Wed, 13 Sep 2023 08:42:25 -0300 Subject: [PATCH] Release v0.2.1 (#108) * Improve dashboard * Dashborad run in to main * Add check config creat dir func * Increase patch version * Add dashborad run --------- Co-authored-by: Sebastian Anapolsky --- README_en.md | 11 +----- setup.py | 2 +- urbantrips/carto/routes.py | 4 +- urbantrips/dashboard/dashboard.py | 2 +- .../dashboard/pages/1_Datos Generales.py | 2 +- .../pages/2_Indicadores de oferta.py | 2 +- urbantrips/run_all_urbantrips.py | 6 +++ urbantrips/run_dashboard.py | 28 ++++++++------ urbantrips/utils/check_configs.py | 22 ++++++++++- urbantrips/utils/utils.py | 3 ++ urbantrips/viz_ppt_utils/viz_ppt_utils.py | 35 ++++++++++-------- urbantrips_logo.JPG | Bin 14484 -> 0 bytes urbantrips_logo.PNG | Bin 18744 -> 0 bytes 13 files changed, 74 insertions(+), 43 deletions(-) delete mode 100644 urbantrips_logo.JPG delete mode 100644 urbantrips_logo.PNG diff --git a/README_en.md b/README_en.md index 58b31c1..d34d15f 100644 --- a/README_en.md +++ b/README_en.md @@ -165,13 +165,13 @@ according to [Clarification about the concept of lines and branches in urbantrip ``` lineas_contienen_ramales: True ``` + Finally, additional useful tables can be specified for the process. On one hand, metadata can be added for the lines, such as their fantasy name in addition to the corresponding id, or to which company they belong. It can identify a line or a line-branch (with branches being small deviations from a main route). In the latter case, `urbantrips` will create two different tables, one for the metadata of the lines and another for the branches. It also allows the addition of cartographies such as routes, which must be a single 2D Linestring (it does not allow multiline), or different files with spatial units for which data is to be added. For each file, the name of the attribute containing the information must be indicated and, if necessary, an order in which to produce the OD matrices generated by `urbantrips`. ``` nombre_archivo_informacion_lineas: lineas_amba.csv -informacion_lineas_contiene_ramales: True recorridos_geojson: recorridos_amba.geojson zonificaciones: @@ -223,13 +223,7 @@ This is the data schema that `csv` files supplied as inputs to `urbantrips` must | `nombre_ramal` | str | **Mandatory if lines have branches**. Name of the branch. | | `empresa` | str | Optional. Name of the company. | | `descripcion` | str | Optional. Additional description of the line or branch. | -| id_linea | int | **Mandatory**. Integer that identifies the line. | -| nombre_linea | str | **Mandatory**. Name of the line. | -| modo | str | **Mandatory**. Mode of the line. | -| id_ramal | int | Optional. Integer that identifies the branch. | -| nombre_ramal | str | Optional. Name of the branch. | -| empresa | str | Optional. Name of the company. | -| descripcion | str | Optional. Additional description of the line or branch. | + ### Lines geoms @@ -340,7 +334,6 @@ alias_db_insumos: amba lineas_contienen_ramales: True nombre_archivo_informacion_lineas: lineas_amba.csv - imputar_destinos_min_distancia: True #ingresar el nombre de las variables diff --git a/setup.py b/setup.py index a71600d..afb9c15 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setuptools.setup( name='urbantrips', - version='0.2.0', + version='0.2.1', author="Felipe Gonzalez & Sebastian Anapolsky", author_email="", description="A library to process public transit smart card data.", diff --git a/urbantrips/carto/routes.py b/urbantrips/carto/routes.py index 558b922..20ab177 100644 --- a/urbantrips/carto/routes.py +++ b/urbantrips/carto/routes.py @@ -227,8 +227,8 @@ def check_route_geoms_columns(geojson_data, branches_present): "id_ramal vacios en geojson recorridos" assert not geojson_data.id_ramal.duplicated().any(),\ "id_ramal duplicados en geojson recorridos" - assert geojson_data.dtypes['id_ramal'] == int,\ - "id_ramal deben ser int en geojson recorridos" + # assert geojson_data.dtypes['id_ramal'] == int,\ + # "id_ramal deben ser int en geojson recorridos" cols = pd.Series(cols) columns_ok = cols.isin(geojson_data.columns) diff --git a/urbantrips/dashboard/dashboard.py b/urbantrips/dashboard/dashboard.py index da3418d..8669540 100644 --- a/urbantrips/dashboard/dashboard.py +++ b/urbantrips/dashboard/dashboard.py @@ -145,7 +145,7 @@ def get_logo(): "docs", "urbantrips_logo.jpg") if not os.path.isfile(file_logo): # URL of the image file on Github - url = 'https://github.com/EL-BID/UrbanTrips/blob/18be313301c979dae5fd27ac5b83f89c76e2dd5f/docs/urbantrips_logo.jpg' + url = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/docs/urbantrips_logo.jpg' # Send a request to get the content of the image file response = requests.get(url) diff --git a/urbantrips/dashboard/pages/1_Datos Generales.py b/urbantrips/dashboard/pages/1_Datos Generales.py index 18a8b57..d08af63 100644 --- a/urbantrips/dashboard/pages/1_Datos Generales.py +++ b/urbantrips/dashboard/pages/1_Datos Generales.py @@ -145,7 +145,7 @@ def get_logo(): "docs", "urbantrips_logo.jpg") if not os.path.isfile(file_logo): # URL of the image file on Github - url = 'https://github.com/EL-BID/UrbanTrips/blob/18be313301c979dae5fd27ac5b83f89c76e2dd5f/docs/urbantrips_logo.jpg' + url = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/docs/urbantrips_logo.jpg' # Send a request to get the content of the image file response = requests.get(url) diff --git a/urbantrips/dashboard/pages/2_Indicadores de oferta.py b/urbantrips/dashboard/pages/2_Indicadores de oferta.py index ea2a8a3..09e580d 100644 --- a/urbantrips/dashboard/pages/2_Indicadores de oferta.py +++ b/urbantrips/dashboard/pages/2_Indicadores de oferta.py @@ -141,7 +141,7 @@ def get_logo(): "docs", "urbantrips_logo.jpg") if not os.path.isfile(file_logo): # URL of the image file on Github - url = 'https://github.com/EL-BID/UrbanTrips/blob/18be313301c979dae5fd27ac5b83f89c76e2dd5f/docs/urbantrips_logo.jpg' + url = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/docs/urbantrips_logo.jpg' # Send a request to get the content of the image file response = requests.get(url) diff --git a/urbantrips/run_all_urbantrips.py b/urbantrips/run_all_urbantrips.py index 2052c4e..1b31bf8 100644 --- a/urbantrips/run_all_urbantrips.py +++ b/urbantrips/run_all_urbantrips.py @@ -2,7 +2,12 @@ from urbantrips import process_transactions from urbantrips import run_postprocessing from urbantrips import create_viz +from urbantrips import run_dashboard +import warnings + +# Filter and suppress specific warnings +warnings.filterwarnings("ignore") def main(): @@ -10,6 +15,7 @@ def main(): process_transactions.main() run_postprocessing.main() create_viz.main() + run_dashboard.main() if __name__ == "__main__": main() diff --git a/urbantrips/run_dashboard.py b/urbantrips/run_dashboard.py index 999abe7..30266f7 100644 --- a/urbantrips/run_dashboard.py +++ b/urbantrips/run_dashboard.py @@ -13,16 +13,20 @@ def download_githubfile(url_file, file_name): f.write(response.content) print('copiado: ', file_name) +def main(): + + os.makedirs('urbantrips/dashboard/pages', exist_ok=True) + download_githubfile(url_file = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/urbantrips/dashboard/dashboard.py', + file_name = 'urbantrips/dashboard/dashboard.py') + download_githubfile(url_file = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/urbantrips/dashboard/pages/1_Datos Generales.py', + file_name = 'urbantrips/dashboard/pages/1_Datos Generales.py') + download_githubfile(url_file = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/urbantrips/dashboard/pages/2_Indicadores de oferta.py', + file_name = 'urbantrips/dashboard/pages/2_Indicadores de oferta.py') + + print('') + print('Debe correr desde la terminal streamlit run urbantrips/dashboard/dashboard.py') + print('') + # !streamlit run urbantrips/dashboard/dashboard.py -os.makedirs('urbantrips/dashboard/pages', exist_ok=True) -download_githubfile(url_file = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/urbantrips/dashboard/dashboard.py', - file_name = 'urbantrips/dashboard/dashboard.py') -download_githubfile(url_file = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/urbantrips/dashboard/pages/1_Datos Generales.py', - file_name = 'urbantrips/dashboard/pages/1_Datos Generales.py') -download_githubfile(url_file = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/urbantrips/dashboard/pages/2_Indicadores de oferta.py', - file_name = 'urbantrips/dashboard/pages/2_Colectivos.py.py') - -print('') -print('Debe correr desde la terminal streamlit run urbantrips/dashboard/dashboard.py') -print('') -# !streamlit run urbantrips/dashboard/dashboard.py \ No newline at end of file +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/urbantrips/utils/check_configs.py b/urbantrips/utils/check_configs.py index 3d90699..72c8768 100644 --- a/urbantrips/utils/check_configs.py +++ b/urbantrips/utils/check_configs.py @@ -495,6 +495,26 @@ def check_config_errors(config_default): assert error_txt == '\n', error_txt print('Se concluyó el chequeo del archivo de configuración') +def check_configs_file(): + + # Define the directory and file name + directory = 'configs' + file_name = 'configuraciones_generales.yaml' + file_path = os.path.join(directory, file_name) + + # Check if the directory exists, and if not, create it + if not os.path.exists(directory): + os.makedirs(directory) + + # Check if the YAML file exists, and if not, create it + if not os.path.exists(file_path): + # Create an empty YAML file + with open(file_path, 'w') as file: + yaml.dump({}, file) + + print(f"Se creo el archivo '{file_name}' en '{directory}'") + + @ duracion def check_config(): """ @@ -508,7 +528,7 @@ def check_config(): Returns: None """ - + check_configs_file() replace_tabs_with_spaces(os.path.join("configs", "configuraciones_generales.yaml")) configs = leer_configs_generales() config_default = revise_configs(configs) diff --git a/urbantrips/utils/utils.py b/urbantrips/utils/utils.py index 074ee4b..cb29810 100644 --- a/urbantrips/utils/utils.py +++ b/urbantrips/utils/utils.py @@ -53,6 +53,9 @@ def create_directories(): db_path = os.path.join("resultados", "png") os.makedirs(db_path, exist_ok=True) + db_path = os.path.join("docs") + os.makedirs(db_path, exist_ok=True) + db_path = os.path.join("resultados", "pdf") os.makedirs(db_path, exist_ok=True) diff --git a/urbantrips/viz_ppt_utils/viz_ppt_utils.py b/urbantrips/viz_ppt_utils/viz_ppt_utils.py index a71c407..56d9556 100644 --- a/urbantrips/viz_ppt_utils/viz_ppt_utils.py +++ b/urbantrips/viz_ppt_utils/viz_ppt_utils.py @@ -164,22 +164,27 @@ def pptx_addpic(prs, slide, img_path, left=0, top=0, width=0, altura_max=0, anc return slide_return def get_new_slide(prs, desc_dia_titulo): ## Logo Urbantrips - file_logo = os.path.join( - "docs", "urbantrips_logo.jpg") - if not os.path.isfile(file_logo): - # URL of the image file on Github - url = 'https://github.com/EL-BID/UrbanTrips/blob/18be313301c979dae5fd27ac5b83f89c76e2dd5f/docs/urbantrips_logo.jpg' - - # Send a request to get the content of the image file - response = requests.get(url) - - # Save the content to a local file - with open(file_logo, 'wb') as f: - f.write(response.content) - - slide = pptx_addtitle(prs=prs, slide='', title='', left=0, top=0, width=24, new=True, fontsize=48) - pptx_addpic(prs=prs, slide=slide, img_path=file_logo, left=16, top=12.3, width=8) + try: + db_path = os.path.join("docs") + os.makedirs(db_path, exist_ok=True) + file_logo = os.path.join( + "docs", "urbantrips_logo.jpg") + if not os.path.isfile(file_logo): + # URL of the image file on Github + url = 'https://raw.githubusercontent.com/EL-BID/UrbanTrips/dev/docs/urbantrips_logo.jpg' + # Send a request to get the content of the image file + response = requests.get(url) + + # Save the content to a local file + with open(file_logo, 'wb') as f: + f.write(response.content) + + slide = pptx_addtitle(prs=prs, slide='', title='', left=0, top=0, width=24, new=True, fontsize=48) + pptx_addpic(prs=prs, slide=slide, img_path=file_logo, left=16, top=12.3, width=8) + except: + pass + slide = pptx_addtitle(prs=prs, slide=slide, title='Urbantrips', left=0, top=0, width=24, new=False, fontsize=48) slide = pptx_addtitle(prs=prs, slide=slide, title=desc_dia_titulo, left=0, top=1, width=24, new=False, fontsize=38) diff --git a/urbantrips_logo.JPG b/urbantrips_logo.JPG deleted file mode 100644 index 68c4ca3f0f754f7f1f00210bf5e078741e1ecfc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14484 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 diff --git a/urbantrips_logo.PNG b/urbantrips_logo.PNG deleted file mode 100644 index c8f9149c1227f90e66533f1dccf080607e0bf4e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18744 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