Steps to Reproduce
if __name__ == "__main__":
import logging
import os
import time
import warnings
from pathlib import Path
from nrel.routee.transit import GTFSEnergyPredictor
# Suppress GDAL/PROJ warnings
os.environ["PROJ_DEBUG"] = "0"
# Suppress pandas FutureWarning from RouteE-Powertrain
warnings.filterwarnings("ignore", category=FutureWarning, message=".*swapaxes.*")
# Configure logging
logging.getLogger().handlers.clear()
logging.basicConfig(
level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s - %(message)s"
)
logger = logging.getLogger("single_agency_analysis")
HERE = Path(__file__).parent.resolve()
# Configuration
n_proc = 8
routee_vehicle_models = [
"Transit_Bus_Battery_Electric",
"Transit_Bus_Diesel",
]
input_directory = HERE / "../sample-inputs/chicago/gtfs"
output_directory = HERE / "../reports/chicago"
start_time = time.time()
predictor = GTFSEnergyPredictor(
gtfs_path=input_directory,
n_processes=n_proc,
)
# Run entire pipeline with one method call
results = predictor.run(
vehicle_models=routee_vehicle_models,
date="2025/12/03",
routes=["20"],
add_mid_block_deadhead=True,
add_depot_deadhead=True,
add_grade=True,
add_hvac=True,
output_dir=output_directory,
save_results=True,
)
print(results.head())
logger.info(f"Predicted energy for {len(results)} trips")
Output:
2026-01-06 15:51:24,075 [INFO] nrel.routee.transit.predictor - Initialized GTFSEnergyPredictor for /Users/dmccabe/repos/public/routee-transit/scripts/../sample-inputs/chicago/gtfs
2026-01-06 15:51:24,075 [INFO] nrel.routee.transit.predictor - Loading GTFS data...
2026-01-06 15:51:31,500 [INFO] nrel.routee.transit.predictor - Feed includes 1 agencies: ['Chicago Transit Authority']. Total trips: 89536, shapes: 1570
2026-01-06 15:51:31,557 [INFO] nrel.routee.transit.predictor - Loaded 89536 trips and 1544 shapes
2026-01-06 15:51:31,557 [INFO] nrel.routee.transit.predictor - Filtering trips (date=2025/12/03, routes=['20'])...
2026-01-06 15:51:31,668 [INFO] nrel.routee.transit.predictor - Filtered to 359 trips and 13 shapes
2026-01-06 15:51:31,668 [INFO] nrel.routee.transit.predictor - Adding between-trip deadhead trips...
2026-01-06 15:51:35,953 [INFO] nrel.routee.transit.predictor - Added 63 between-trip deadhead trips
2026-01-06 15:51:35,960 [INFO] nrel.routee.transit.predictor - Adding depot deadhead trips...
2026-01-06 15:51:45,427 [INFO] nrel.routee.transit.predictor - Added 76 depot deadhead trips
2026-01-06 15:51:45,446 [INFO] nrel.routee.transit.predictor - Matching shapes to road network...
2026-01-06 15:52:05,802 [INFO] nrel.routee.transit.predictor - Finished map matching
2026-01-06 15:52:10,739 [INFO] gtfs_processing - Finished attaching timestamps
2026-01-06 15:52:10,929 [INFO] nrel.routee.transit.predictor - Adding road grade information...
2026-01-06 15:52:10,935 [INFO] /Users/dmccabe/repos/public/routee-transit/nrel/routee/transit/grade/add_grade.py - Running gradeit on 438 trips with 8 processes.
2026-01-06 15:52:11,548 [INFO] nrel.routee.transit.grade.download - Downloading 1 USGS tiles at ONE_THIRD_ARC_SECOND resolution.
2026-01-06 15:52:11,548 [INFO] nrel.routee.transit.grade.download - cache/n42w088/USGS_13_n42w088.tif already exists, skipping
2026-01-06 15:54:13,091 [INFO] nrel.routee.transit.predictor - Generated 34857 link-level features for RouteE
2026-01-06 15:54:13,094 [INFO] nrel.routee.transit.predictor - Predicting energy for 2 vehicle model(s)...
2026-01-06 15:54:13,094 [INFO] nrel.routee.transit.predictor - Processing model: Transit_Bus_Battery_Electric
2026-01-06 15:54:27,411 [INFO] nrel.routee.transit.predictor - Adding HVAC energy impacts...
Failed to download nan.csv: An error occurred (404) when calling the HeadObject operation: Not Found
Traceback (most recent call last):
File "/Users/dmccabe/repos/public/routee-transit/scripts/single_agency_full_analysis.py", line 58, in <module>
results = predictor.run(
^^^^^^^^^^^^^^
File "/Users/dmccabe/repos/public/routee-transit/nrel/routee/transit/predictor.py", line 243, in run
self.predict_energy(vehicle_models=vehicle_models, add_hvac=add_hvac)
File "/Users/dmccabe/repos/public/routee-transit/nrel/routee/transit/predictor.py", line 691, in predict_energy
hvac_energy = add_HVAC_energy(self.feed, self.trips)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dmccabe/repos/public/routee-transit/nrel/routee/transit/thermal_energy.py", line 129, in add_HVAC_energy
df_temp = pd.read_csv(local_file, parse_dates=["date_time"])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1026, in read_csv
return _read(filepath_or_buffer, kwds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 620, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1620, in __init__
self._engine = self._make_engine(f, self.engine)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1880, in _make_engine
self.handles = get_handle(
^^^^^^^^^^^
File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/common.py", line 873, in get_handle
handle = open(
^^^^^
FileNotFoundError: [Errno 2] No such file or directory: './TMY/nan.csv'
There is evidently an issue in how the GTFS data is matched to the TMY files in this case, where a location gets mapped to NaN and the code then expects a nan.csv file to exist instead of failing more sensibly.
Steps to Reproduce
sample-inputs/chicago/gtfsOutput:
There is evidently an issue in how the GTFS data is matched to the TMY files in this case, where a location gets mapped to NaN and the code then expects a
nan.csvfile to exist instead of failing more sensibly.