Skip to content

Commit debd955

Browse files
committed
fxd
1 parent 4d180c4 commit debd955

11 files changed

+172
-123
lines changed

README.md

+14
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,20 @@ git clone [email protected]:arup-group/elara.git
3737

3838
Once available locally, navigate to the folder to install Elara and its dependencies. Using a virtual environment is highly recommended.
3939

40+
### Mamba
41+
42+
Using [mamba](https://mamba.readthedocs.io/en/latest/index.html).
43+
44+
```{sh}
45+
git clone [email protected]:arup-group/elara.git
46+
cd elara
47+
mamba install -n elara --file requirements.txt python=3.13
48+
mamba activate elara
49+
pip install --no-deps -e .
50+
pytest
51+
elara --help
52+
```
53+
4054
### OSX
4155

4256
```{sh}

elara/benchmarking.py

+26-15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from pandas.core import groupby
21
import pandas as pd
32
import os
43
import numpy as np
@@ -95,7 +94,7 @@ def build(self, resources: dict, write_path: Optional[str] = None) -> dict:
9594
bm_df = pd.concat([benchmarks_df[self.value_field],
9695
simulation_df[self.value_field]], axis=1)
9796
bm_df.columns = self.output_value_fields
98-
bm_df.dropna(0, inplace=True)
97+
bm_df.dropna(axis=0, inplace=True)
9998

10099
self.plot_comparisons(bm_df)
101100

@@ -314,7 +313,7 @@ def __init__(
314313
**kwargs
315314
)
316315
self.groupby_person_attribute = groupby_person_attribute
317-
self.simulation_name = f"trip_modes_all"
316+
self.simulation_name = "trip_modes_all"
318317
if groupby_person_attribute is not None:
319318
self.logger.debug(
320319
f"Found 'groupby_person_attribute': {groupby_person_attribute}")
@@ -348,7 +347,7 @@ def __init__(
348347
**kwargs
349348
)
350349
self.groupby_person_attribute = groupby_person_attribute
351-
self.simulation_name = f"trip_modes_all"
350+
self.simulation_name = "trip_modes_all"
352351
if groupby_person_attribute is not None:
353352
self.logger.debug(
354353
f"Found 'groupby_person_attribute': {groupby_person_attribute}")
@@ -372,7 +371,7 @@ def __init__(self, config, mode, **kwargs):
372371
super().__init__(config, mode=mode, **kwargs)
373372
destination_activities = kwargs.get("destination_activity_filters", [])
374373
groupby_person_attribute = kwargs.get("groupby_person_attribute")
375-
self.simulation_name = f"trip_activity_modes_all"
374+
self.simulation_name = "trip_activity_modes_all"
376375
for act in destination_activities:
377376
self.simulation_name += f"_{act}"
378377
if groupby_person_attribute is not None:
@@ -398,7 +397,7 @@ def __init__(self, config, mode, **kwargs):
398397
super().__init__(config, mode=mode, **kwargs)
399398
destination_activities = kwargs.get("destination_activity_filters", [])
400399
groupby_person_attribute = kwargs.get("groupby_person_attribute")
401-
self.simulation_name = f"trip_activity_modes_all"
400+
self.simulation_name = "trip_activity_modes_all"
402401
for act in destination_activities:
403402
self.simulation_name += f"_{act}"
404403
if groupby_person_attribute is not None:
@@ -434,7 +433,7 @@ def __init__(
434433
**kwargs
435434
)
436435
self.groupby_person_attribute = groupby_person_attribute
437-
self.simulation_name = f"plan_modes_all"
436+
self.simulation_name = "plan_modes_all"
438437
if groupby_person_attribute is not None:
439438
self.logger.debug(
440439
f"Found 'groupby_person_attribute': {groupby_person_attribute}")
@@ -468,7 +467,7 @@ def __init__(
468467
**kwargs
469468
)
470469
self.groupby_person_attribute = groupby_person_attribute
471-
self.simulation_name = f"plan_modes_all"
470+
self.simulation_name = "plan_modes_all"
472471
if groupby_person_attribute is not None:
473472
self.logger.debug(
474473
f"Found 'groupby_person_attribute': {groupby_person_attribute}")
@@ -492,7 +491,7 @@ def __init__(self, config, mode, **kwargs):
492491
super().__init__(config, mode=mode, **kwargs)
493492
destination_activities = kwargs.get("destination_activity_filters", [])
494493
groupby_person_attribute = kwargs.get("groupby_person_attribute")
495-
self.simulation_name = f"plan_activity_modes_all"
494+
self.simulation_name = "plan_activity_modes_all"
496495
for act in destination_activities:
497496
self.simulation_name += f"_{act}"
498497
if groupby_person_attribute is not None:
@@ -518,7 +517,7 @@ def __init__(self, config, mode, **kwargs):
518517
super().__init__(config, mode=mode, **kwargs)
519518
destination_activities = kwargs.get("destination_activity_filters", [])
520519
groupby_person_attribute = kwargs.get("groupby_person_attribute")
521-
self.simulation_name = f"plan_activity_modes_all"
520+
self.simulation_name = "plan_activity_modes_all"
522521
for act in destination_activities:
523522
self.simulation_name += f"_{act}"
524523
if groupby_person_attribute is not None:
@@ -653,7 +652,7 @@ def __init__(self, config, mode, benchmark_data_path=None, **kwargs) -> None:
653652
if not links:
654653
missing_counters += 1
655654
self.logger.warning(
656-
f"Benchmark data has no links - suggests error with Bench (i.e. MATSIM network has not matched to BM)."
655+
"Benchmark data has no links - suggests error with Bench (i.e. MATSIM network has not matched to BM)."
657656
)
658657

659658
# Check for number of missing BM links. Note this is a fault with the BM (ie missing links)
@@ -919,7 +918,7 @@ def __init__(self, config, mode, benchmark_data_path=None, **kwargs) -> None:
919918
if not stops:
920919
missing_counters += 1
921920
self.logger.debug(
922-
f"Benchmark data has no stop/s - suggests error with Bench (i.e. MATSIM network has not matched to BM)."
921+
"Benchmark data has no stop/s - suggests error with Bench (i.e. MATSIM network has not matched to BM)."
923922
)
924923

925924
# Check for number of missing BM stops. Note this is a fault with the BM (ie missing stops)
@@ -994,7 +993,7 @@ def build(self, resource: dict, write_path: Optional[str] = None) -> dict:
994993
sim_result = np.array([0.0 for _ in range(len(bm_hours))])
995994

996995
# check if direction available
997-
if not direction in model_results:
996+
if direction not in model_results:
998997
raise UserWarning(
999998
f"Direction: {direction} not available in model results"
1000999
)
@@ -2308,11 +2307,23 @@ def merge_summary_stats(bm_results_summary):
23082307

23092308
results = []
23102309

2310+
print(data)
2311+
23112312
for record in data:
23122313
record_type = record['source']
23132314

2314-
record.pop("score")
2315-
record.pop("source")
2315+
record.pop("score", None)
2316+
record.pop("source", None)
2317+
record.pop("mode", None)
2318+
record.pop("counter_id", None)
2319+
record.pop("line", None)
2320+
record.pop("o", None)
2321+
record.pop("d", None)
2322+
record.pop("direction", None)
2323+
record.pop("link_id", None)
2324+
# absolute trash, but it works
2325+
2326+
print(record)
23162327

23172328
if record_type != "difference":
23182329
for measurement in list(record):

elara/event_handlers.py

+24-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import os
3+
import pickle
34
from math import floor
45
from typing import Optional, Tuple, Union
56

@@ -231,7 +232,10 @@ def finalise(self):
231232
del self.veh_occupancy
232233
name = f"{str(self)}.pkl"
233234
path = os.path.join(self.config.output_path, name)
234-
nx.write_gpickle(self.graph, path)
235+
236+
with open(path, 'wb') as f:
237+
pickle.dump(self.graph, f, pickle.HIGHEST_PROTOCOL)
238+
235239
del self.graph
236240

237241

@@ -435,7 +439,7 @@ def build(self, resources: dict, write_path: Optional[str] = None) -> None:
435439
)
436440
else:
437441
self.logger.debug(f'Selecting links for mode:{self.mode}.')
438-
self.elem_gdf = self.elem_gdf.loc[links, :]
442+
self.elem_gdf = self.elem_gdf.loc[list(links), :]
439443

440444
self.elem_ids, self.elem_indices = self.generate_elem_ids(self.elem_gdf)
441445

@@ -492,7 +496,7 @@ def finalise(self) -> None:
492496
counts_df = pd.DataFrame(self.counts.flatten(), index=index)[0]
493497
counts_df = counts_df.unstack(level='hour').sort_index()
494498

495-
counts_df['total'] = counts_df.sum(1)
499+
counts_df['total'] = counts_df.sum(1, numeric_only=True)
496500
counts_df = counts_df.reset_index().set_index('elem')
497501

498502
key = f"{self.name}_{self.groupby_person_attribute}"
@@ -510,7 +514,7 @@ def finalise(self) -> None:
510514
totals_df = pd.DataFrame(
511515
data=self.counts, index=self.elem_ids, columns=range(0, self.config.time_periods)
512516
).sort_index()
513-
totals_df['total'] = totals_df.sum(1)
517+
totals_df['total'] = totals_df.sum(1, numeric_only=True)
514518

515519
del self.counts
516520

@@ -590,7 +594,7 @@ def build(self, resources: dict, write_path: Optional[str] = None) -> None:
590594
)
591595
else:
592596
self.logger.debug(f'Selecting links for mode:{self.mode}.')
593-
self.elem_gdf = self.elem_gdf.loc[links, :]
597+
self.elem_gdf = self.elem_gdf.loc[list(links), :]
594598

595599
self.elem_ids, self.elem_indices = self.generate_elem_ids(self.elem_gdf)
596600

@@ -649,7 +653,7 @@ def finalise(self) -> None:
649653
counts_df = counts_df.unstack(level='hour').sort_index()
650654
# counts_df = counts_df.reset_index().set_index(['elem', self.groupby_person_attribute])
651655

652-
counts_df['total'] = counts_df.sum(1)
656+
counts_df['total'] = counts_df.sum(1, numeric_only=True)
653657
counts_df = counts_df.reset_index().set_index('elem')
654658

655659
key = f"{self.name}_{self.groupby_person_attribute}"
@@ -667,7 +671,7 @@ def finalise(self) -> None:
667671
totals_df = pd.DataFrame(
668672
data=self.counts, index=self.elem_ids, columns=range(0, self.config.time_periods)
669673
).sort_index()
670-
totals_df['total'] = totals_df.sum(1)
674+
totals_df['total'] = totals_df.sum(1, numeric_only=True)
671675

672676
del self.counts
673677

@@ -740,7 +744,7 @@ def build(self, resources: dict, write_path: Optional[str] = None) -> None:
740744
)
741745
else:
742746
self.logger.debug(f'Selecting links for mode:{self.mode}.')
743-
self.elem_gdf = self.elem_gdf.loc[links, :]
747+
self.elem_gdf = self.elem_gdf.loc[list(links), :]
744748

745749
self.elem_ids, self.elem_indices = self.generate_elem_ids(self.elem_gdf)
746750

@@ -1038,7 +1042,7 @@ def build(self, resources: dict, write_path: Optional[str] = None) -> None:
10381042
)
10391043
else:
10401044
self.logger.debug(f'Selecting links for mode:{self.mode}.')
1041-
self.elem_gdf = self.elem_gdf.loc[links, :]
1045+
self.elem_gdf = self.elem_gdf.loc[list(links), :]
10421046

10431047
self.elem_ids, self.elem_indices = self.generate_elem_ids(self.elem_gdf)
10441048

@@ -1150,7 +1154,7 @@ def finalise(self):
11501154
counts_df = pd.DataFrame(self.counts.flatten(), index=index)[0]
11511155
counts_df = counts_df.unstack(level='hour').sort_index()
11521156
counts_df = counts_df.reset_index().set_index(['elem', self.groupby_person_attribute])
1153-
counts_df['total'] = counts_df.sum(1)
1157+
counts_df['total'] = counts_df.sum(1, numeric_only=True)
11541158
counts_df = counts_df.reset_index().set_index('elem')
11551159
key = f"{self.name}_{self.groupby_person_attribute}"
11561160
counts_df = self.elem_gdf.join(
@@ -1168,7 +1172,7 @@ def finalise(self):
11681172
totals_df = pd.DataFrame(
11691173
data=self.counts, index=self.elem_ids, columns=range(0, self.config.time_periods)
11701174
).sort_index()
1171-
totals_df['total'] = totals_df.sum(1)
1175+
totals_df['total'] = totals_df.sum(1, numeric_only=True)
11721176

11731177
del self.counts
11741178

@@ -1435,7 +1439,7 @@ def build(self, resources: dict, write_path: Optional[str] = None) -> None:
14351439
)
14361440
else:
14371441
self.logger.debug(f'Filtering stops for mode:{self.mode}.')
1438-
self.elem_gdf = self.elem_gdf.loc[viable_stops, :]
1442+
self.elem_gdf = self.elem_gdf.loc[list(viable_stops), :]
14391443

14401444
self.elem_ids, self.elem_indices = self.generate_elem_ids(self.elem_gdf)
14411445

@@ -1527,7 +1531,7 @@ def finalise(self):
15271531
counts_df = pd.DataFrame(data.flatten(), index=index)[0]
15281532
counts_df = counts_df.unstack(level='hour').sort_index()
15291533
counts_df = counts_df.reset_index().set_index(['elem', self.groupby_person_attribute])
1530-
counts_df['total'] = counts_df.sum(1)
1534+
counts_df['total'] = counts_df.sum(1, numeric_only=True)
15311535
counts_df = counts_df.reset_index().set_index('elem')
15321536

15331537
# Create volume counts output
@@ -1544,7 +1548,7 @@ def finalise(self):
15441548
totals_df = pd.DataFrame(
15451549
data=data, index=self.elem_ids, columns=range(0, self.config.time_periods)
15461550
).sort_index()
1547-
totals_df['total'] = totals_df.sum(1)
1551+
totals_df['total'] = totals_df.sum(1, numeric_only=True)
15481552

15491553
del data
15501554

@@ -1621,7 +1625,7 @@ def build(self, resources: dict, write_path: Optional[str] = None) -> None:
16211625
)
16221626
else:
16231627
self.logger.debug(f'Filtering stops for mode:{self.mode}.')
1624-
self.elem_gdf = self.elem_gdf.loc[viable_stops, :]
1628+
self.elem_gdf = self.elem_gdf.loc[list(viable_stops), :]
16251629

16261630
self.elem_ids, self.elem_indices = self.generate_elem_ids(self.elem_gdf)
16271631

@@ -1751,7 +1755,7 @@ def finalise(self):
17511755
counts_df.index.name = n
17521756

17531757
counts_df = counts_df.reset_index().set_index(['origin', 'destination', str(self.groupby_person_attribute)])
1754-
counts_df['total'] = counts_df.sum(1)
1758+
counts_df['total'] = counts_df.sum(1, numeric_only=True)
17551759

17561760
counts_df['geometry'] = [
17571761
LineString([o, d]) for o, d in zip(counts_df.origin_geometry, counts_df.destination_geometry)
@@ -1769,7 +1773,7 @@ def finalise(self):
17691773
# calc sum across all recorded attribute classes
17701774
totals_df = counts_df.reset_index().groupby(
17711775
['origin', 'destination']
1772-
).sum().reset_index().set_index(['origin', 'destination'])
1776+
).sum(numeric_only=True).reset_index().set_index(['origin', 'destination'])
17731777

17741778
# Join stop data and build geometry
17751779
for n in ("origin", "destination"):
@@ -1867,7 +1871,7 @@ def build(self, resources: dict, write_path: Optional[str] = None) -> None:
18671871
)
18681872
else:
18691873
self.logger.debug(f'Filtering stops for mode:{self.mode}.')
1870-
self.elem_gdf = self.elem_gdf.loc[viable_stops, :]
1874+
self.elem_gdf = self.elem_gdf.loc[list(viable_stops), :]
18711875

18721876
self.elem_ids, self.elem_indices = self.generate_elem_ids(self.elem_gdf)
18731877

@@ -2001,7 +2005,7 @@ def finalise(self):
20012005

20022006
counts_df = counts_df.reset_index().set_index(names+['veh_counts'])
20032007
counts_df['route'] = counts_df.index.get_level_values('veh_id').map(self.veh_route)
2004-
counts_df['total'] = counts_df.sum(1)
2008+
counts_df['total'] = counts_df.sum(1, numeric_only=True)
20052009

20062010
counts_df['geometry'] = [LineString([o, d]) for o, d in zip(
20072011
counts_df.from_stop_geometry, counts_df.to_stop_geometry)]
@@ -2022,7 +2026,7 @@ def finalise(self):
20222026
self.result_dfs[key] = counts_df
20232027

20242028
# calc sum across all recorded attribute classes
2025-
totals_df = counts_df.reset_index().groupby(['from_stop', 'to_stop', 'veh_id', 'route', 'veh_counts']).sum()
2029+
totals_df = counts_df.reset_index().groupby(['from_stop', 'to_stop', 'veh_id', 'route', 'veh_counts']).sum(numeric_only=True)
20262030

20272031
# Join stop data and build geometry
20282032
for n in ("from_stop", "to_stop"):

0 commit comments

Comments
 (0)