From df8d0e6d2b8e9b9b079c43b3ca5f97da81486371 Mon Sep 17 00:00:00 2001 From: paco-barreras Date: Wed, 6 May 2026 22:04:40 -0400 Subject: [PATCH 1/3] Fix packaged data imports in examples --- ...marking_of_stop_detection_algorithms.ipynb | 2 +- ...nchmarking_of_stop_detection_algorithms.py | 2 +- examples/dbstop_demo.ipynb | 2 +- .../generate_synthetic_trajectories.ipynb | 192 ++---------------- examples/generate_synthetic_trajectories.py | 7 +- examples/grid_based_demo.ipynb | 2 +- examples/grid_based_demo.py | 2 +- examples/hdbscan_demo.ipynb | 2 +- examples/hdbscan_demo.py | 2 +- examples/lachesis_demo.ipynb | 49 +++++ examples/lachesis_demo.py | 2 +- examples/seqscan_demo.ipynb | 2 +- examples/sequential_demo.ipynb | 2 +- examples/tadbscan_demo.ipynb | 2 +- examples/tadbscan_demo.py | 2 +- examples/test_anim.ipynb | 3 +- .../date=2024-01-01/part-0.parquet | Bin .../date=2024-01-02/part-0.parquet | Bin .../date=2024-01-03/part-0.parquet | Bin 19 files changed, 80 insertions(+), 195 deletions(-) create mode 100644 examples/lachesis_demo.ipynb rename {examples => nomad/data}/gc_data_long/date=2024-01-01/part-0.parquet (100%) rename {examples => nomad/data}/gc_data_long/date=2024-01-02/part-0.parquet (100%) rename {examples => nomad/data}/gc_data_long/date=2024-01-03/part-0.parquet (100%) diff --git a/examples/benchmarking_of_stop_detection_algorithms.ipynb b/examples/benchmarking_of_stop_detection_algorithms.ipynb index 0d3ea257..02740864 100644 --- a/examples/benchmarking_of_stop_detection_algorithms.ipynb +++ b/examples/benchmarking_of_stop_detection_algorithms.ipynb @@ -50,7 +50,7 @@ "city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet')\n", "outer_box = box(*city.total_bounds).buffer(15, join_style='mitre')\n", "\n", - "filepath_root = 'gc_data_long/'\n", + "filepath_root = data_dir / \"gc_data_long\"\n", "tc = {\n", " \"user_id\": \"gc_identifier\",\n", " \"timestamp\": \"unix_ts\",\n", diff --git a/examples/benchmarking_of_stop_detection_algorithms.py b/examples/benchmarking_of_stop_detection_algorithms.py index cc3dcd79..6e2d504f 100644 --- a/examples/benchmarking_of_stop_detection_algorithms.py +++ b/examples/benchmarking_of_stop_detection_algorithms.py @@ -46,7 +46,7 @@ city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet') outer_box = box(*city.total_bounds).buffer(15, join_style='mitre') -filepath_root = 'gc_data_long/' +filepath_root = data_dir / "gc_data_long" tc = { "user_id": "gc_identifier", "timestamp": "unix_ts", diff --git a/examples/dbstop_demo.ipynb b/examples/dbstop_demo.ipynb index 2c798aff..4e10585c 100644 --- a/examples/dbstop_demo.ipynb +++ b/examples/dbstop_demo.ipynb @@ -47,7 +47,7 @@ "city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet')\n", "outer_box = box(*city.total_bounds)\n", "\n", - "filepath_root = 'gc_data_long/'\n", + "filepath_root = data_dir / \"gc_data_long\"\n", "tc = {\"user_id\": \"gc_identifier\", \"x\": \"dev_x\", \"y\": \"dev_y\", \"timestamp\": \"unix_ts\"}\n", "\n", "# Density based stop detection (Temporal DBSCAN)\n", diff --git a/examples/generate_synthetic_trajectories.ipynb b/examples/generate_synthetic_trajectories.ipynb index 72bff19f..0a4931cd 100644 --- a/examples/generate_synthetic_trajectories.ipynb +++ b/examples/generate_synthetic_trajectories.ipynb @@ -2,243 +2,77 @@ "cells": [ { "cell_type": "markdown", - "id": "10e2517a", "metadata": {}, - "source": [ - "# Synthetic Trajectory Generation with Nomad\n", - "\n", - "This notebook demonstrates how to generate realistic synthetic human mobility trajectories." - ] + "source": "# Synthetic Trajectory Generation with Nomad\n\nThis notebook demonstrates how to generate realistic synthetic human mobility trajectories." }, { "cell_type": "code", "execution_count": null, - "id": "58d68e64", "metadata": {}, "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import time\n", - "from pathlib import Path\n", - "from joblib import Parallel, delayed\n", - "\n", - "from nomad.city_gen import City\n", - "from nomad.traj_gen import Agent, Population\n", - "from nomad.stop_detection.viz import plot_pings, plot_time_barcode" - ] + "source": "import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport time\nfrom pathlib import Path\nfrom joblib import Parallel, delayed\n\nimport nomad.data as data_folder\nfrom nomad.city_gen import City\nfrom nomad.traj_gen import Agent, Population\nfrom nomad.stop_detection.viz import plot_pings, plot_time_barcode" }, { "cell_type": "code", "execution_count": null, - "id": "9860e901", "metadata": {}, "outputs": [], - "source": [ - "city = City.from_geopackage('garden-city.gpkg')\n", - "city._build_hub_network(hub_size=16)\n", - "city.compute_gravity(exponent=2.0)\n", - "city.compute_shortest_paths(callable_only=True)\n", - "\n", - "print(f\"City: {city.name}\")\n", - "print(f\"Dimensions: {city.dimensions}\")\n", - "print(f\"Buildings: {len(city.buildings_gdf)}\")" - ] + "source": "data_dir = Path(data_folder.__file__).parent\ncity = City.from_geopackage(data_dir / \"garden-city.gpkg\")\ncity._build_hub_network(hub_size=16)\ncity.compute_gravity(exponent=2.0)\ncity.compute_shortest_paths(callable_only=True)\n\nprint(f\"City: {city.name}\")\nprint(f\"Dimensions: {city.dimensions}\")\nprint(f\"Buildings: {len(city.buildings_gdf)}\")" }, { "cell_type": "markdown", - "id": "9ff8ddec", "metadata": {}, - "source": [ - "## Part 1: Effect of Sampling Parameters on Sparsity\n", - "\n", - "Generate 3 agents with 2-day trajectories, varying beta_duration and beta_start \n", - "to show their effect on sparsity (q = observed points / ground truth points)." - ] + "source": "## Part 1: Effect of Sampling Parameters on Sparsity\n\nGenerate 3 agents with 2-day trajectories, varying beta_duration and beta_start \nto show their effect on sparsity (q = observed points / ground truth points)." }, { "cell_type": "code", "execution_count": null, - "id": "b6336cc1", "metadata": {}, "outputs": [], - "source": [ - "population = Population(city)\n", - "population.generate_agents(N=3, seed=42, name_count=2)\n", - "\n", - "# Vary beta_duration and beta_start to target different sparsity levels\n", - "sampling_params = [\n", - " {'beta_ping': 5, 'beta_start': 100, 'beta_durations': 60}, \n", - " {'beta_ping': 5, 'beta_start': 250, 'beta_durations': 150}, \n", - " {'beta_ping': 5, 'beta_start': 400, 'beta_durations': 240} \n", - "]\n", - "\n", - "# Generate 2-day trajectories for quick visualization\n", - "for i, (agent_id, agent) in enumerate(population.roster.items()):\n", - " agent.generate_trajectory(\n", - " datetime=pd.Timestamp(\"2024-01-01T07:00-04:00\"),\n", - " end_time=pd.Timestamp(\"2024-01-03T07:00-04:00\"),\n", - " seed=i\n", - " )\n", - "\n", - " agent.sample_trajectory(\n", - " **sampling_params[i],\n", - " replace_sparse_traj=True,\n", - " seed=i\n", - " )\n", - " \n", - " q = len(agent.sparse_traj) / len(agent.trajectory)\n", - " print(f\"Agent {i}: q={q:.3f}, beta_start={sampling_params[i]['beta_start']}, \"\n", - " f\"beta_dur={sampling_params[i]['beta_durations']}\")" - ] + "source": "population = Population(city)\npopulation.generate_agents(N=3, seed=42, name_count=2)\n\n# Vary beta_duration and beta_start to target different sparsity levels\nsampling_params = [\n {'beta_ping': 5, 'beta_start': 100, 'beta_durations': 60}, \n {'beta_ping': 5, 'beta_start': 250, 'beta_durations': 150}, \n {'beta_ping': 5, 'beta_start': 400, 'beta_durations': 240} \n]\n\n# Generate 2-day trajectories for quick visualization\nfor i, (agent_id, agent) in enumerate(population.roster.items()):\n agent.generate_trajectory(\n datetime=pd.Timestamp(\"2024-01-01T07:00-04:00\"),\n end_time=pd.Timestamp(\"2024-01-03T07:00-04:00\"),\n seed=i\n )\n\n agent.sample_trajectory(\n **sampling_params[i],\n replace_sparse_traj=True,\n seed=i\n )\n \n q = len(agent.sparse_traj) / len(agent.trajectory)\n print(f\"Agent {i}: q={q:.3f}, beta_start={sampling_params[i]['beta_start']}, \"\n f\"beta_dur={sampling_params[i]['beta_durations']}\")" }, { "cell_type": "code", "execution_count": null, - "id": "0e4b20fa", - "metadata": { - "lines_to_next_cell": 1 - }, + "metadata": {}, "outputs": [], - "source": [ - "fig, axes = plt.subplots(2, 3, figsize=(15, 10), \n", - " gridspec_kw={'height_ratios': [10, 1]})\n", - "\n", - "for i, (agent_id, agent) in enumerate(population.roster.items()):\n", - " ax_map = axes[0, i]\n", - " ax_barcode = axes[1, i]\n", - " \n", - " city.plot_city(ax=ax_map, doors=False, address=False)\n", - " \n", - " traj = agent.sparse_traj\n", - " plot_pings(traj, ax=ax_map, s=15, point_color='red', \n", - " x='x', y='y', timestamp='timestamp')\n", - " \n", - " plot_time_barcode(traj['timestamp'], ax=ax_barcode, set_xlim=True)\n", - " \n", - " q = len(traj) / len(agent.trajectory)\n", - " ax_map.set_title(f\"Agent {i}: {len(traj)} obs (q={q:.2f})\\n\"\n", - " f\"beta_start={sampling_params[i]['beta_start']}, \"\n", - " f\"beta_dur={sampling_params[i]['beta_durations']}\")\n", - " ax_map.set_axis_off()\n", - "\n", - "plt.tight_layout()\n", - "plt.savefig('data/trajectories_visualization.png', dpi=150, bbox_inches='tight')\n", - "plt.show()" - ] + "source": "fig, axes = plt.subplots(2, 3, figsize=(15, 10), \n gridspec_kw={'height_ratios': [10, 1]})\n\nfor i, (agent_id, agent) in enumerate(population.roster.items()):\n ax_map = axes[0, i]\n ax_barcode = axes[1, i]\n \n city.plot_city(ax=ax_map, doors=False, address=False)\n \n traj = agent.sparse_traj\n plot_pings(traj, ax=ax_map, s=15, point_color='red', \n x='x', y='y', timestamp='timestamp')\n \n plot_time_barcode(traj['timestamp'], ax=ax_barcode, set_xlim=True)\n \n q = len(traj) / len(agent.trajectory)\n ax_map.set_title(f\"Agent {i}: {len(traj)} obs (q={q:.2f})\\n\"\n f\"beta_start={sampling_params[i]['beta_start']}, \"\n f\"beta_dur={sampling_params[i]['beta_durations']}\")\n ax_map.set_axis_off()\n\nplt.tight_layout()\nplt.savefig('data/trajectories_visualization.png', dpi=150, bbox_inches='tight')\nplt.show()" }, { "cell_type": "markdown", - "id": "dc7b266a", "metadata": {}, - "source": [ - "## Part 2: Parallel Generation at Scale\n", - "\n", - "Generate trajectories for 15 users using parallelization." - ] + "source": "## Part 2: Parallel Generation at Scale\n\nGenerate trajectories for 15 users using parallelization." }, { "cell_type": "code", "execution_count": null, - "id": "5238c745", - "metadata": { - "lines_to_next_cell": 1 - }, + "metadata": {}, "outputs": [], - "source": [ - "def generate_agent_trajectory(args):\n", - " \"\"\"Worker function for parallel generation.\"\"\"\n", - " identifier, home, work, seed = args\n", - " city = City.from_geopackage('garden-city.gpkg')\n", - " city._build_hub_network(hub_size=16)\n", - " city.compute_gravity(exponent=2.0)\n", - " city.compute_shortest_paths(callable_only=True)\n", - " agent = Agent(identifier=identifier, city=city, home=home, workplace=work)\n", - " \n", - " agent.generate_trajectory(\n", - " datetime=pd.Timestamp(\"2024-01-01T07:00-04:00\"),\n", - " end_time=pd.Timestamp(\"2024-01-08T07:00-04:00\"),\n", - " seed=seed\n", - " )\n", - " agent.sample_trajectory(\n", - " beta_ping=5,\n", - " replace_sparse_traj=True,\n", - " seed=seed\n", - " )\n", - " sparse_df = agent.sparse_traj.copy()\n", - " sparse_df['user_id'] = identifier\n", - " sparse_df['home'] = home\n", - " sparse_df['workplace'] = work\n", - " return sparse_df" - ] + "source": "def generate_agent_trajectory(args):\n \"\"\"Worker function for parallel generation.\"\"\"\n identifier, home, work, seed = args\n data_dir = Path(data_folder.__file__).parent\n city = City.from_geopackage(data_dir / \"garden-city.gpkg\")\n city._build_hub_network(hub_size=16)\n city.compute_gravity(exponent=2.0)\n city.compute_shortest_paths(callable_only=True)\n agent = Agent(identifier=identifier, city=city, home=home, workplace=work)\n \n agent.generate_trajectory(\n datetime=pd.Timestamp(\"2024-01-01T07:00-04:00\"),\n end_time=pd.Timestamp(\"2024-01-08T07:00-04:00\"),\n seed=seed\n )\n agent.sample_trajectory(\n beta_ping=5,\n replace_sparse_traj=True,\n seed=seed\n )\n sparse_df = agent.sparse_traj.copy()\n sparse_df['user_id'] = identifier\n sparse_df['home'] = home\n sparse_df['workplace'] = work\n return sparse_df" }, { "cell_type": "code", "execution_count": null, - "id": "aa1b6112", "metadata": {}, "outputs": [], - "source": [ - "n_agents = 15\n", - "rng = np.random.default_rng(100)\n", - "homes = city.buildings_gdf[city.buildings_gdf['building_type'] == 'home']['id'].to_numpy()\n", - "workplaces = city.buildings_gdf[city.buildings_gdf['building_type'] == 'workplace']['id'].to_numpy()\n", - "\n", - "agent_params = [\n", - " (f'agent_{i:04d}',\n", - " rng.choice(homes),\n", - " rng.choice(workplaces),\n", - " i)\n", - " for i in range(n_agents)\n", - "]" - ] + "source": "n_agents = 15\nrng = np.random.default_rng(100)\nhomes = city.buildings_gdf[city.buildings_gdf['building_type'] == 'home']['id'].to_numpy()\nworkplaces = city.buildings_gdf[city.buildings_gdf['building_type'] == 'workplace']['id'].to_numpy()\n\nagent_params = [\n (f'agent_{i:04d}',\n rng.choice(homes),\n rng.choice(workplaces),\n i)\n for i in range(n_agents)\n]" }, { "cell_type": "code", "execution_count": null, - "id": "a0364bc9", "metadata": {}, "outputs": [], - "source": [ - "print(f\"Generating {n_agents} agents in parallel...\")\n", - "start_time = time.time()\n", - "\n", - "results = Parallel(n_jobs=-1, verbose=10)(\n", - " delayed(generate_agent_trajectory)(params) for params in agent_params\n", - ")\n", - "\n", - "generation_time = time.time() - start_time\n", - "print(f\"Generated {n_agents} agents in {generation_time:.2f}s ({generation_time/n_agents:.2f}s per agent)\")" - ] + "source": "print(f\"Generating {n_agents} agents in parallel...\")\nstart_time = time.time()\n\nresults = Parallel(n_jobs=-1, verbose=10)(\n delayed(generate_agent_trajectory)(params) for params in agent_params\n)\n\ngeneration_time = time.time() - start_time\nprint(f\"Generated {n_agents} agents in {generation_time:.2f}s ({generation_time/n_agents:.2f}s per agent)\")" }, { "cell_type": "code", "execution_count": null, - "id": "e8a48448", "metadata": {}, "outputs": [], - "source": [ - "parallel_population = Population(city)\n", - "for df, params in zip(results, agent_params):\n", - " identifier, home, work, seed = params\n", - " agent = Agent(identifier=identifier, city=city, home=home, workplace=work, seed=seed)\n", - " agent.sparse_traj = df.drop(columns=['home', 'workplace'])\n", - " parallel_population.add_agent(agent, verbose=False)\n", - "\n", - "output_path = 'data/trajectories_15_users'\n", - "parallel_population.save_pop(\n", - " sparse_path=str(output_path),\n", - " fmt='parquet'\n", - ")\n", - "print(f\"Saved sparse trajectories to {output_path}\")" - ] + "source": "parallel_population = Population(city)\nfor df, params in zip(results, agent_params):\n identifier, home, work, seed = params\n agent = Agent(identifier=identifier, city=city, home=home, workplace=work, seed=seed)\n agent.sparse_traj = df.drop(columns=['home', 'workplace'])\n parallel_population.add_agent(agent, verbose=False)\n\noutput_path = 'data/trajectories_15_users'\nparallel_population.save_pop(\n sparse_path=str(output_path),\n fmt='parquet'\n)\nprint(f\"Saved sparse trajectories to {output_path}\")" } ], "metadata": { - "jupytext": { - "formats": "ipynb,py:percent" - }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", diff --git a/examples/generate_synthetic_trajectories.py b/examples/generate_synthetic_trajectories.py index 86daec55..0093abd9 100644 --- a/examples/generate_synthetic_trajectories.py +++ b/examples/generate_synthetic_trajectories.py @@ -26,12 +26,14 @@ from pathlib import Path from joblib import Parallel, delayed +import nomad.data as data_folder from nomad.city_gen import City from nomad.traj_gen import Agent, Population from nomad.stop_detection.viz import plot_pings, plot_time_barcode # %% -city = City.from_geopackage('garden-city.gpkg') +data_dir = Path(data_folder.__file__).parent +city = City.from_geopackage(data_dir / "garden-city.gpkg") city._build_hub_network(hub_size=16) city.compute_gravity(exponent=2.0) city.compute_shortest_paths(callable_only=True) @@ -110,7 +112,8 @@ def generate_agent_trajectory(args): """Worker function for parallel generation.""" identifier, home, work, seed = args - city = City.from_geopackage('garden-city.gpkg') + data_dir = Path(data_folder.__file__).parent + city = City.from_geopackage(data_dir / "garden-city.gpkg") city._build_hub_network(hub_size=16) city.compute_gravity(exponent=2.0) city.compute_shortest_paths(callable_only=True) diff --git a/examples/grid_based_demo.ipynb b/examples/grid_based_demo.ipynb index afa912ef..37594608 100644 --- a/examples/grid_based_demo.ipynb +++ b/examples/grid_based_demo.ipynb @@ -48,7 +48,7 @@ "city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet')\n", "outer_box = box(*city.total_bounds)\n", "\n", - "filepath_root = 'gc_data_long/'\n", + "filepath_root = data_dir / \"gc_data_long\"\n", "tc = {\"user_id\": \"gc_identifier\", \"x\": \"dev_x\", \"y\": \"dev_y\", \"timestamp\": \"unix_ts\"}\n", "\n", "users = ['admiring_brattain']\n", diff --git a/examples/grid_based_demo.py b/examples/grid_based_demo.py index 4d667bbd..d4f74ad3 100644 --- a/examples/grid_based_demo.py +++ b/examples/grid_based_demo.py @@ -45,7 +45,7 @@ city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet') outer_box = box(*city.total_bounds) -filepath_root = 'gc_data_long/' +filepath_root = data_dir / "gc_data_long" tc = {"user_id": "gc_identifier", "x": "dev_x", "y": "dev_y", "timestamp": "unix_ts"} users = ['admiring_brattain'] diff --git a/examples/hdbscan_demo.ipynb b/examples/hdbscan_demo.ipynb index ea22abcd..aed3e3c2 100644 --- a/examples/hdbscan_demo.ipynb +++ b/examples/hdbscan_demo.ipynb @@ -41,7 +41,7 @@ "city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet')\n", "outer_box = box(*city.total_bounds)\n", "\n", - "filepath_root = 'gc_data_long/'\n", + "filepath_root = data_dir / \"gc_data_long\"\n", "tc = {\"user_id\": \"gc_identifier\", \"x\": \"dev_x\", \"y\": \"dev_y\", \"timestamp\": \"unix_ts\"}\n", "\n", "users = ['admiring_brattain']\n", diff --git a/examples/hdbscan_demo.py b/examples/hdbscan_demo.py index fcef411f..1f3ec6e1 100644 --- a/examples/hdbscan_demo.py +++ b/examples/hdbscan_demo.py @@ -39,7 +39,7 @@ city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet') outer_box = box(*city.total_bounds) -filepath_root = 'gc_data_long/' +filepath_root = data_dir / "gc_data_long" tc = {"user_id": "gc_identifier", "x": "dev_x", "y": "dev_y", "timestamp": "unix_ts"} users = ['admiring_brattain'] diff --git a/examples/lachesis_demo.ipynb b/examples/lachesis_demo.ipynb new file mode 100644 index 00000000..cf2b76c6 --- /dev/null +++ b/examples/lachesis_demo.ipynb @@ -0,0 +1,49 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": "# Lachesis Stop Detection" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "The first stop detection algorithm implemented in ```nomad``` is a sequential algorithm insipired by the one in _Project Lachesis: Parsing and Modeling Location Histories_ (Hariharan & Toyama). This algorithm for extracting stays is dependent on two parameters: the roaming distance and the stay duration. \n\n* Roaming distance represents the maximum distance an object can move away from a point location and still be considered to be staying at that location.\n* Stop duration is the minimum amount of time an object must spend within the roaming distance of a location to qualify as a stop.\n\nThe algorithm identifies stops as contiguous sequences of pings that stay within the roaming distance for at least the duration of the stop duration.\n\nThis algorithm has the following parameters, which determine the size of the resulting stops:\n* ```dur_min```: Minimum duration for a stay in minutes.\n* ```dt_max```: Maximum time gap permitted between consecutive pings in a stay in minutes (dt_max should be greater than dur_min).\n* ```delta_roam```: Maximum roaming distance for a stay in meters." + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": "# %matplotlib inline\nimport matplotlib\nimport matplotlib.pyplot as plt\n\n# Imports\nimport nomad.io.base as loader\nimport geopandas as gpd\nfrom shapely.geometry import box\nfrom nomad.stop_detection.viz import plot_stops_barcode, plot_time_barcode, plot_stops, plot_pings\nimport nomad.stop_detection.lachesis as LACHESIS\nimport nomad.data as data_folder\nfrom pathlib import Path\n\n# Load data\ndata_dir = Path(data_folder.__file__).parent\ncity = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet')\nouter_box = box(*city.total_bounds)\n\nfilepath_root = data_dir / \"gc_data_long\"\ntc = {\"user_id\": \"gc_identifier\", \"x\": \"dev_x\", \"y\": \"dev_y\", \"timestamp\": \"unix_ts\"}\n\nusers = ['admiring_brattain']\ntraj = loader.sample_from_file(filepath_root, format='parquet', users=users, filters=('date','==', '2024-01-01'), traj_cols=tc)\n\n# Lachesis (sequential stop detection)\nstops = LACHESIS.lachesis(traj, delta_roam=20, dt_max = 60, dur_min=5, complete_output=True, keep_col_names=True, traj_cols=tc)" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": "fig, (ax_map, ax_barcode) = plt.subplots(2, 1, figsize=(6,6.5),\n gridspec_kw={'height_ratios':[10,1]})\n\ngpd.GeoDataFrame(geometry=[outer_box], crs='EPSG:3857').plot(ax=ax_map, color='#d3d3d3')\ncity.plot(ax=ax_map, edgecolor='white', linewidth=1, color='#8c8c8c')\n\nplot_stops(stops, ax=ax_map, cmap='Blues')\nplot_pings(traj, ax=ax_map, s=6, color='black', alpha=0.5, traj_cols=tc)\nax_map.set_axis_off()\n\nplot_time_barcode(traj['unix_ts'], ax=ax_barcode, set_xlim=True)\nplot_stops_barcode(stops, ax=ax_barcode, cmap='Blues', set_xlim=False, timestamp='unix_ts')\n\nplt.tight_layout(pad=0.1)\nplt.show()" + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/lachesis_demo.py b/examples/lachesis_demo.py index 133cf364..44e6b8e2 100644 --- a/examples/lachesis_demo.py +++ b/examples/lachesis_demo.py @@ -47,7 +47,7 @@ city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet') outer_box = box(*city.total_bounds) -filepath_root = 'gc_data_long/' +filepath_root = data_dir / "gc_data_long" tc = {"user_id": "gc_identifier", "x": "dev_x", "y": "dev_y", "timestamp": "unix_ts"} users = ['admiring_brattain'] diff --git a/examples/seqscan_demo.ipynb b/examples/seqscan_demo.ipynb index 01df55bf..37881506 100644 --- a/examples/seqscan_demo.ipynb +++ b/examples/seqscan_demo.ipynb @@ -44,7 +44,7 @@ "city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet')\n", "outer_box = box(*city.total_bounds)\n", "\n", - "filepath_root = 'gc_data_long/'\n", + "filepath_root = data_dir / \"gc_data_long\"\n", "tc = {\"user_id\": \"gc_identifier\", \"x\": \"dev_x\", \"y\": \"dev_y\", \"timestamp\": \"unix_ts\"}\n", "\n", "users = ['admiring_brattain']\n", diff --git a/examples/sequential_demo.ipynb b/examples/sequential_demo.ipynb index cb4c6aa0..2ce39489 100644 --- a/examples/sequential_demo.ipynb +++ b/examples/sequential_demo.ipynb @@ -51,7 +51,7 @@ "city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet')\n", "outer_box = box(*city.total_bounds)\n", "\n", - "filepath_root = 'gc_data_long/'\n", + "filepath_root = data_dir / \"gc_data_long\"\n", "tc = {\"user_id\": \"gc_identifier\", \"x\": \"dev_x\", \"y\": \"dev_y\", \"timestamp\": \"unix_ts\"}\n", "\n", "users = ['admiring_brattain']\n", diff --git a/examples/tadbscan_demo.ipynb b/examples/tadbscan_demo.ipynb index 3a2d5ea3..122a8819 100644 --- a/examples/tadbscan_demo.ipynb +++ b/examples/tadbscan_demo.ipynb @@ -47,7 +47,7 @@ "city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet')\n", "outer_box = box(*city.total_bounds)\n", "\n", - "filepath_root = 'gc_data_long/'\n", + "filepath_root = data_dir / \"gc_data_long\"\n", "tc = {\"user_id\": \"gc_identifier\", \"x\": \"dev_x\", \"y\": \"dev_y\", \"timestamp\": \"unix_ts\"}\n", "\n", "# Density based stop detection (Temporal DBSCAN)\n", diff --git a/examples/tadbscan_demo.py b/examples/tadbscan_demo.py index 7b6eb0d3..5ba575e7 100644 --- a/examples/tadbscan_demo.py +++ b/examples/tadbscan_demo.py @@ -45,7 +45,7 @@ city = gpd.read_parquet(data_dir / 'garden-city-buildings-mercator.parquet') outer_box = box(*city.total_bounds) -filepath_root = 'gc_data_long/' +filepath_root = data_dir / "gc_data_long" tc = {"user_id": "gc_identifier", "x": "dev_x", "y": "dev_y", "timestamp": "unix_ts"} # Density based stop detection (Temporal DBSCAN) diff --git a/examples/test_anim.ipynb b/examples/test_anim.ipynb index 7195c3d6..8dac5ad4 100644 --- a/examples/test_anim.ipynb +++ b/examples/test_anim.ipynb @@ -46,10 +46,9 @@ "}\n", "\n", "data_dir = Path(data_folder.__file__).parent\n", - "repo_root = Path(data_folder.__file__).resolve().parents[2]\n", "\n", "traj = loader.sample_from_file(\n", - " repo_root / \"examples\" / \"gc_data_long\",\n", + " data_dir / \"gc_data_long\",\n", " format=\"parquet\",\n", " users=[\"admiring_brattain\"],\n", " filters=(\"date\", \"==\", \"2024-01-01\"),\n", diff --git a/examples/gc_data_long/date=2024-01-01/part-0.parquet b/nomad/data/gc_data_long/date=2024-01-01/part-0.parquet similarity index 100% rename from examples/gc_data_long/date=2024-01-01/part-0.parquet rename to nomad/data/gc_data_long/date=2024-01-01/part-0.parquet diff --git a/examples/gc_data_long/date=2024-01-02/part-0.parquet b/nomad/data/gc_data_long/date=2024-01-02/part-0.parquet similarity index 100% rename from examples/gc_data_long/date=2024-01-02/part-0.parquet rename to nomad/data/gc_data_long/date=2024-01-02/part-0.parquet diff --git a/examples/gc_data_long/date=2024-01-03/part-0.parquet b/nomad/data/gc_data_long/date=2024-01-03/part-0.parquet similarity index 100% rename from examples/gc_data_long/date=2024-01-03/part-0.parquet rename to nomad/data/gc_data_long/date=2024-01-03/part-0.parquet From be5ca5f3a85423ca1cb6de633375a4c445f4be65 Mon Sep 17 00:00:00 2001 From: paco-barreras Date: Wed, 6 May 2026 22:07:39 -0400 Subject: [PATCH 2/3] Remove stale Lachesis example image --- examples/lachesis_colored_pings.png | Bin 312227 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/lachesis_colored_pings.png diff --git a/examples/lachesis_colored_pings.png b/examples/lachesis_colored_pings.png deleted file mode 100644 index 7eefc0178219d0af0e1f3e055ae075c64bb7bebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312227 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° 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 z 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