Skip to content

Commit 272a465

Browse files
committed
fix: split private modes in car, sustainable and general
1 parent bec14ba commit 272a465

2 files changed

Lines changed: 31 additions & 29 deletions

File tree

src/sum_impact_assessment/utils/modal_split.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
# Value: one or more transport mode types used as filter
1313
MODAL_SPLIT_TRANSPORT_MODE_GROUPS: Dict[str, List[str]] = {
1414
"NSM": ["NSM"],
15-
"Private": ["PRIVATE"],
15+
"All private modes": ["PRIVATE", "PRIVATE_SUSTAINABLE", "PRIVATE_CAR"],
16+
"Sustainable private modes": ["PRIVATE_SUSTAINABLE"],
17+
"Private car": ["PRIVATE_CAR"],
1618
"Public transport": ["PUBLIC_TRANSPORT"],
17-
"PT+NSM": ["NSM", "PUBLIC_TRANSPORT"],
19+
"Public Transport with NSM": ["NSM", "PUBLIC_TRANSPORT"],
1820
}
1921

2022

tests/test_jobs/test_kpi_measures_analysis_job.py

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from src.sum_impact_assessment.schemas.job import JobStatusEnum
1010
from src.sum_impact_assessment.schemas.impact_analysis import KPIGroupImpactOutput, MeasureImpactCoefficient
1111
from src.sum_impact_assessment.schemas.core import KPIGroup, KPI, LivingLab, Measure, KPILivingLabResult
12-
from src.sum_impact_assessment.utils.modal_split import MODAL_SPLIT_TRANSPORT_MODE_GROUPS
1312

1413

1514
class TestKpiMeasuresAnalysisJob:
@@ -458,12 +457,12 @@ def test_job_handles_partial_failures(
458457

459458
@patch("src.sum_impact_assessment.services.kpi_measures_analysis_job.KPIImpactAnalyzer")
460459
@patch("src.sum_impact_assessment.services.kpi_measures_analysis_job.AnalysisDataService")
461-
def test_run_kpi_impact_analysis_expands_modal_split_into_three_modes(
460+
def test_run_kpi_impact_analysis_expands_modal_split_into_available_modes(
462461
self,
463462
mock_data_service_class,
464463
mock_analyzer_class,
465464
):
466-
"""Modal Split group should be expanded according to configured transport-mode sub-groups."""
465+
"""Modal Split group should be expanded into eligible configured transport-mode sub-groups."""
467466
mock_db = Mock()
468467

469468
modal_group = KPIGroup(
@@ -540,39 +539,40 @@ def test_run_kpi_impact_analysis_expands_modal_split_into_three_modes(
540539
KPIGroupImpactOutput(
541540
id="3__nsm", name="Modal Split - NSM", kpi_ids=["15"]),
542541
KPIGroupImpactOutput(
543-
id="3__private", name="Modal Split - Private", kpi_ids=["15"]),
542+
id="3__all_private_modes", name="Modal Split - All private modes", kpi_ids=["15"]),
544543
KPIGroupImpactOutput(
545544
id="3__public_transport", name="Modal Split - Public transport", kpi_ids=["15"]),
546545
KPIGroupImpactOutput(
547-
id="3__sustainable_modes", name="Modal Split - PT+NSM", kpi_ids=["15"]),
546+
id="3__public_transport_with_nsm", name="Modal Split - Public Transport with NSM", kpi_ids=["15"]),
548547
]
549548

550549
input_snapshot, successful_results, error_results = KpiMeasuresAnalysisJob.run_kpi_impact_analysis(
551550
db=mock_db,
552551
kpi_group_filter=None,
553552
)
554553

555-
assert len(input_snapshot["kpi_groups"]) == len(
556-
MODAL_SPLIT_TRANSPORT_MODE_GROUPS)
557-
assert len(successful_results) == len(
558-
MODAL_SPLIT_TRANSPORT_MODE_GROUPS)
554+
expected_modal_split_group_names = {
555+
"Modal Split - NSM",
556+
"Modal Split - All private modes",
557+
"Modal Split - Public transport",
558+
"Modal Split - Public Transport with NSM",
559+
}
560+
561+
assert len(input_snapshot["kpi_groups"]) == len(expected_modal_split_group_names)
562+
assert len(successful_results) == len(expected_modal_split_group_names)
559563
assert len(error_results) == 0
560-
assert mock_analyzer.run_analysis_group.call_count == len(
561-
MODAL_SPLIT_TRANSPORT_MODE_GROUPS)
564+
assert mock_analyzer.run_analysis_group.call_count == len(expected_modal_split_group_names)
562565

563566
analyzed_names = [
564567
call.args[0].name for call in mock_analyzer.run_analysis_group.call_args_list]
565-
assert "Modal Split - NSM" in analyzed_names
566-
assert "Modal Split - Private" in analyzed_names
567-
assert "Modal Split - Public transport" in analyzed_names
568-
assert "Modal Split - PT+NSM" in analyzed_names
568+
assert set(analyzed_names) == expected_modal_split_group_names
569569

570570
analyzed_groups = [call.args[0]
571571
for call in mock_analyzer.run_analysis_group.call_args_list]
572-
sustainable_group = next(
573-
g for g in analyzed_groups if g.name == "Modal Split - PT+NSM"
572+
public_transport_with_nsm_group = next(
573+
g for g in analyzed_groups if g.name == "Modal Split - Public Transport with NSM"
574574
)
575-
assert sorted(sustainable_group.transport_mode_type_filter) == [
575+
assert sorted(public_transport_with_nsm_group.transport_mode_type_filter) == [
576576
"nsm", "public_transport"]
577577

578578
@patch("src.sum_impact_assessment.services.kpi_measures_analysis_job.KPIImpactAnalyzer")
@@ -637,7 +637,7 @@ def test_run_kpi_impact_analysis_modal_split_only_nsm_keeps_nsm_and_sustainable_
637637
):
638638
"""
639639
Given Modal Split analysis and only NSM KPI data in living labs,
640-
then only NSM and PT+NSM sub-groups are analyzed.
640+
then only NSM and Public Transport with NSM sub-groups are analyzed.
641641
"""
642642
mock_db = Mock()
643643

@@ -691,7 +691,7 @@ def test_run_kpi_impact_analysis_modal_split_only_nsm_keeps_nsm_and_sustainable_
691691
KPIGroupImpactOutput(
692692
id="3__nsm", name="Modal Split - NSM", kpi_ids=["15"]),
693693
KPIGroupImpactOutput(
694-
id="3__sustainable_modes", name="Modal Split - PT+NSM", kpi_ids=["15"]),
694+
id="3__public_transport_with_nsm", name="Modal Split - Public Transport with NSM", kpi_ids=["15"]),
695695
]
696696

697697
input_snapshot, successful_results, error_results = KpiMeasuresAnalysisJob.run_kpi_impact_analysis(
@@ -707,8 +707,8 @@ def test_run_kpi_impact_analysis_modal_split_only_nsm_keeps_nsm_and_sustainable_
707707
assert len(error_results) == 0
708708
assert mock_analyzer.run_analysis_group.call_count == 2
709709
assert "Modal Split - NSM" in analyzed_names
710-
assert "Modal Split - PT+NSM" in analyzed_names
711-
assert "Modal Split - Private" not in analyzed_names
710+
assert "Modal Split - Public Transport with NSM" in analyzed_names
711+
assert "Modal Split - All private modes" not in analyzed_names
712712
assert "Modal Split - Public transport" not in analyzed_names
713713

714714
@patch("src.sum_impact_assessment.services.kpi_measures_analysis_job.AnalysisDataService")
@@ -830,25 +830,25 @@ def _make_living_lab(lab_id: str) -> LivingLab:
830830
result["group_name"]: result["results"] for result in successful_results
831831
}
832832
assert "Modal Split - NSM" in result_by_group_name
833-
assert "Modal Split - Private" in result_by_group_name
833+
assert "Modal Split - All private modes" in result_by_group_name
834834
assert "Modal Split - Public transport" in result_by_group_name
835-
assert "Modal Split - PT+NSM" in result_by_group_name
835+
assert "Modal Split - Public Transport with NSM" in result_by_group_name
836836

837837
nsm_modes = {
838838
kpi["transport_mode_type"]
839839
for kpi in result_by_group_name["Modal Split - NSM"]["living_labs_analysis"][0]["kpis"]
840840
}
841841
private_modes = {
842842
kpi["transport_mode_type"]
843-
for kpi in result_by_group_name["Modal Split - Private"]["living_labs_analysis"][0]["kpis"]
843+
for kpi in result_by_group_name["Modal Split - All private modes"]["living_labs_analysis"][0]["kpis"]
844844
}
845845
public_modes = {
846846
kpi["transport_mode_type"]
847847
for kpi in result_by_group_name["Modal Split - Public transport"]["living_labs_analysis"][0]["kpis"]
848848
}
849849
sustainable_modes = {
850850
kpi["transport_mode_type"]
851-
for kpi in result_by_group_name["Modal Split - PT+NSM"]["living_labs_analysis"][0]["kpis"]
851+
for kpi in result_by_group_name["Modal Split - Public Transport with NSM"]["living_labs_analysis"][0]["kpis"]
852852
}
853853

854854
assert nsm_modes == {"NSM"}
@@ -859,7 +859,7 @@ def _make_living_lab(lab_id: str) -> LivingLab:
859859
assert mock_run_ridge_regression.call_count == 4
860860

861861
# Call order follows modal split subgroup constant order:
862-
# NSM[0], Private[1], Public transport[2], PT+NSM[3].
862+
# NSM[0], All private modes[1], Public transport[2], Public Transport with NSM[3].
863863
# With autospec on an instance method, call args are: (self, X, y, ...)
864864
_, nsm_call_X, nsm_call_y = mock_run_ridge_regression.call_args_list[0].args[:3]
865865

0 commit comments

Comments
 (0)