diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..f6009d97 --- /dev/null +++ b/.env.example @@ -0,0 +1,10 @@ +# EIA Open Data API key (required for zipcode-based fuel price lookups) +# Register at https://www.eia.gov/opendata/register.php +# When a US zipcode is set in the Config region column, T3CO auto-discovers +# the latest AEO publication year and fetches region-specific fuel prices. +T3CO_EIA_API_KEY=your_api_key_here + +# SSL verification for EIA API requests. +# Set to "false" to disable (e.g. behind a corporate proxy with SSL inspection), +# or set to a path to a custom CA bundle file. +# T3CO_SSL_VERIFY=false diff --git a/.gitignore b/.gitignore index b6d074c3..bf1b7b36 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ *.Rhistory *venv* *.DS_Store +.env t3co/resources/T3CO_Config_Local.csv /site /tco_results diff --git a/README.md b/README.md index 56e83434..f2d0af5e 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,35 @@ Point the `--config` argument to the `T3COConfig.csv` file path (either the src/ Additional information on the inputs, the Batch Mode feature, other CLI arguments, and description of T3CO results are mentioned in the [Quick Start Guide](./docs/quick_start.md) +### EIA Fuel Price Projections + +T3CO can fetch fuel price projections directly from the [EIA Annual Energy Outlook (AEO)](https://www.eia.gov/outlooks/aeo/) API instead of relying on the static `FuelPrices.csv` file. When a US zipcode is provided in the `region` column of the Config file (or in the Scenario file), T3CO automatically: + +1. Discovers the **latest** AEO publication year available from the EIA API (e.g. AEO 2025) +2. Identifies the **reference case** scenario for that year +3. Resolves the zipcode to the corresponding **US Census division** (e.g. `90210` → Pacific) +4. Fetches region-specific fuel price projections for diesel, gasoline, electricity, and CNG +5. Falls back to `FuelPrices.csv` for hydrogen (not available in AEO) + +To enable this feature: + +1. Register for a free API key at [eia.gov/opendata/register.php](https://www.eia.gov/opendata/register.php) +2. Create a `.env` file in your project root (see `.env.example`): + ``` + T3CO_EIA_API_KEY=your_api_key_here + ``` +3. Set the `region` column in `T3COConfig.csv` to a US zipcode (e.g. `90210`) +4. Ensure the `eia_fuel_prices` toggle is enabled in `cost_toggles.json` (default: `true`) + +To pin a specific AEO year instead of using the latest, set `eia_aeo_year` and `eia_aeo_case` in the Config CSV or via CLI: +```bash +python -m t3co.cli.sweep --analysis-id=5 --eia-aeo-year=2023 --eia-aeo-case=aeo2022ref +``` + +If no zipcode is provided or the toggle is disabled, T3CO uses the static `FuelPrices.csv` as before. + +Fuel price override workflows that use `--fuel-prices-json` and `--fuel-prices-zipcode` resolve the source fuel-price region from the installed `zipcodes` dependency instead of repository-maintained ZIP range tables. + ## Acknowledgements This tool was developed with funding support from the US Department of Energy's Office of Energy Efficiency and Renewable Energy (EERE)'s Vehicle Technology Office. @@ -128,4 +157,4 @@ DOE NREL Software Record: [SWR-21-54](https://doi.org/10.11578/dc.20240806.4) ## Contact Us To reach out to the NREL developer team with feedback, feature requests, or to explore partnership opportunities, please email at [T3CO@nrel.gov](mailto:T3CO@nrel.gov) -This tool is developed and maintained by the Commercial Vehicle Technologies (CVT) team in NREL's Center for Integrated Mobility Sciences. \ No newline at end of file +This tool is developed and maintained by the Commercial Vehicle Technologies (CVT) team in NREL's Center for Integrated Mobility Sciences. diff --git a/docs/T3CO_Overview.md b/docs/T3CO_Overview.md index 8aec80de..397107ee 100644 --- a/docs/T3CO_Overview.md +++ b/docs/T3CO_Overview.md @@ -16,7 +16,8 @@ Generally speaking, T3CO can be used in two ways: There are a few main components of a vehicle's total cost of ownership: MSRP (the cost of the vehicle at time of purchase), fuel costs (based on $ per gallon of gasoline equivalent for every operational year's fuel used, other operating costs maintenance [\$/mile\]), fueling dwell time labor [\$/hr], opportunity cost for payload loss and downtime, and resale value at end of ownership. -Fuel costs are computed after determining the vehicle energy efficiency (e.g. miles per gallon of fuel) and factoring in the annual miles driven and the fuel price for each year and region where the vehicle operates. +Fuel costs are computed after determining the vehicle energy efficiency (e.g. miles per gallon of fuel) and factoring in the annual miles driven and the fuel price for each year and region where the vehicle operates. Fuel prices can be sourced from a static CSV file or fetched dynamically from the [EIA Annual Energy Outlook (AEO)](https://www.eia.gov/outlooks/aeo/) API when a US zipcode is provided in the Config or Scenario `region` field. When using the EIA API, T3CO auto-discovers the latest AEO publication year and retrieves region-specific price projections for diesel, gasoline, electricity, and CNG. + The performance metrics estimated for the vehicle are: miles of range, acceleration time, and gradeability. More details on performance metrics are included below under [optimization flow](#optimization-flow). If the analysis does not include optimization, these metrics are simply reported in the results. diff --git a/docs/pages/config_inputs_descriptions.md b/docs/pages/config_inputs_descriptions.md index 2dfcffba..d008ae3e 100644 --- a/docs/pages/config_inputs_descriptions.md +++ b/docs/pages/config_inputs_descriptions.md @@ -224,6 +224,34 @@ Override boolean switch for maintenance and repair downtime opportunity cost calculations- if left blank, T3CO uses selection specific switch bool + + fuel_prices_file + Fuel Prices Filepath + + Filepath to auxiliary fuel prices CSV file, either absolute or relative to /resources/ folder + string + + + region + Fuel Price Region or Zipcode + + Region identifier for fuel prices. If set to a 5-digit US zipcode (e.g. 90210) and the eia_fuel_prices toggle is enabled, T3CO fetches fuel price projections from the EIA AEO API for the corresponding census division. If left blank, T3CO uses the scenario-level region to look up prices from the static FuelPrices.csv file. + string/int + + + eia_aeo_year + EIA AEO Publication Year + + AEO publication year to query from the EIA API (e.g. "2023", "2025"). If left blank, T3CO auto-discovers the latest available AEO year. + string + + + eia_aeo_case + EIA AEO Scenario Case + + AEO scenario case ID to query (e.g. "aeo2023ref"). If left blank, T3CO auto-discovers the reference case for the resolved AEO year. + string + \ No newline at end of file diff --git a/docs/pages/cost_and_tool_features.md b/docs/pages/cost_and_tool_features.md index c889d2c6..61e19b86 100644 --- a/docs/pages/cost_and_tool_features.md +++ b/docs/pages/cost_and_tool_features.md @@ -18,6 +18,10 @@ - *Fueling Dwell Labor cost* - All operating costs are discounted year over year to account for time value of money +#### EIA Fuel Price Projections + +When a US zipcode is provided in the Config or Scenario `region` field, T3CO can fetch fuel price projections from the EIA Annual Energy Outlook (AEO) API. The system auto-discovers the latest AEO publication year and reference scenario, resolves the zipcode to a US Census division, and retrieves region-specific nominal prices for diesel, gasoline, electricity, and CNG. Hydrogen prices fall back to the static `FuelPrices.csv`. This feature requires a free EIA API key and is controlled by the `eia_fuel_prices` toggle in `cost_toggles.json`. + ### Opportunity Cost Components - *Lost Payload Capacity Cost*: Cost of fractionally additional advanced powertrain vehicles needed to carry the same payload as a conventional one (only for Class 8) @@ -48,5 +52,5 @@ - Labor Cost as an operating cost component - Grants incentives, registration, title, and recurring fees added as Capital and Operating Cost components - Battery replacement and battery degradation accounted for in Operating Costs and Energy calculations -- Regionalized fuel, registration, and labor cost inputs +- ~~Regionalized fuel, registration, and labor cost inputs~~ (fuel prices: available via EIA API integration) - Option to run RouteE for Energy calculations diff --git a/docs/quick_start.md b/docs/quick_start.md index 75cbdf62..9a0b822c 100644 --- a/docs/quick_start.md +++ b/docs/quick_start.md @@ -58,73 +58,58 @@ Use the command below to get a list of all CLI arguments: python -m t3co.cli.sweep --help ``` +### EIA Fuel Price Projections + +T3CO can fetch fuel price projections directly from the EIA Annual Energy Outlook (AEO) API. This replaces the static `FuelPrices.csv` data with the latest AEO projections for a region matching the provided US zipcode. + +**Setup:** +1. Get a free EIA API key from [eia.gov/opendata/register.php](https://www.eia.gov/opendata/register.php) +2. Add it to a `.env` file in your project root: + ``` + T3CO_EIA_API_KEY=your_api_key_here + ``` + +**Usage:** Set the `region` column in `T3COConfig.csv` to a 5-digit US zipcode. T3CO will auto-discover the latest AEO year, resolve the zipcode to a US Census division, and fetch fuel prices for that region. + +```bash +python -m t3co.cli.sweep --analysis-id=5 +``` + +The same zipcode-based resolution also works at the Scenario level — if a scenario's `region` field contains a zipcode and the config didn't already resolve one, T3CO fetches EIA data for that scenario. + +To override the AEO year or scenario (instead of using the latest): +```bash +python -m t3co.cli.sweep --analysis-id=5 --eia-aeo-year=2023 --eia-aeo-case=aeo2022ref +``` + +The `eia_fuel_prices` toggle in `cost_toggles.json` controls whether EIA lookups are enabled (default: `true`). If the toggle is `false` or no zipcode is provided, T3CO falls back to the static `FuelPrices.csv`. + +### Fuel Price Overrides + +For fuel-price sensitivity work, `--fuel-prices-json` accepts a JSON string or file path with `zipcode` and `fuel_prices` keys. T3CO uses the installed `zipcodes` package to resolve that ZIP code into the base fuel-price region before cloning and overriding the matching rows in `FuelPrices.csv`. + +```bash +python -m t3co.cli.sweep \ + --analysis-id=0 \ + --fuel-prices-json='{"zipcode":"80302","fuel_prices":{"diesel_dol_per_gal":{"2025":4.25}}}' ``` -$ python -m t3co.cli.sweep --help -usage: SWEEP [-h] [--config CONFIG] [--analysis-id ANALYSIS_ID] [--vehicles VEHICLES] [--scenarios SCENARIOS] [--selections [SELECTIONS ...]] [--drive-cycle [DRIVE_CYCLE ...]] - [--eng-curves ENG_CURVES] [--lw-curves LW_CURVES] [--aero-curves AERO_CURVES] [--look-for LOOK_FOR] [--skip-all-opt] [--skip-input-validation] [--exclude [EXCLUDE ...]] - [--algorithms [ALGORITHMS ...]] [--dst-dir DST_DIR] [--dir-mark DIR_MARK] [--file-mark FILE_MARK] [--skip-save-veh] [--x-tol X_TOL] [--f-tol F_TOL] [--n-max-gen N_MAX_GEN] - [--pop-size POP_SIZE] [--nth-gen NTH_GEN] [--n-last N_LAST] [--range-overshoot-tol RANGE_OVERSHOOT_TOL] [---missed-trace-correction] [--max-time-dilation MAX_TIME_DILATION] - [--min-time-dilation MIN_TIME_DILATION] [--time-dilation-tol TIME_DILATION_TOL] [--write-tsv WRITE_TSV] [--run-multi] [--n-processors N_PROCESSORS] - -The sweep.py module is the main script to run T3CO - -options: - -h, --help show this help message and exit - --config CONFIG Input Config file (default: ./src/t3co/resources/T3COConfig.csv) - --analysis-id ANALYSIS_ID - Analysis key from input Config file - 'config.analysis_id' (default: 0) - --vehicles VEHICLES Input file for Vehicle models (default: ./src/t3co/resources/inputs/Demo_FY22_vehicle_model_assumptions.csv) - --scenarios SCENARIOS - Input file for Scenario models (default: ./src/t3co/resources/inputs/Demo_FY22_scenario_assumptions.csv) - --selections [SELECTIONS ...] - Selections desired to run. Selections can be an int, or list of ints, or range expression. Ex: --selections 234 or --selections "[234,236,238]" or --selections - "range(234, 150, 2)" (default: None) - --drive-cycle [DRIVE_CYCLE ...] - Override drive_cycle from scenario with a composite cycle, or an individual cycle, or a folder of cycles. File paths should be relative to the resources folder (default: - None) - --eng-curves ENG_CURVES - Input file for engine efficiency improvement cost curves (default: ./src/t3co/resources/auxiliary/EngineEffImprovementCostCurve.csv) - --lw-curves LW_CURVES - Input file for lightweighting improvement cost curves (default: ./src/t3co/resources/auxiliary/LightweightImprovementCostCurve.csv) - --aero-curves AERO_CURVES - Input file for aerodynamics improvement curves (default: ./src/t3co/resources/auxiliary/AeroDragImprovementCostCurve.csv) - --look-for LOOK_FOR A string for string matching, example --look_for 'FCEV' or -look_for '["FCEV", "HEV"]' (default: ) - --skip-all-opt, --skopt - If --skip_all_opt used, all runs skip optimization (default: False) - --skip-input-validation, --skiv - If --skip_input_validation used, no pre-validation of inputs is run before sweep commences (default: True) - --exclude [EXCLUDE ...] - Overrides -look_for. a string for string matching to exclude runs, example -exclude 'FCEV' or -look_for '["FCEV", "HEV"]' (default: >{-<>-}<) - --algorithms [ALGORITHMS ...], --algos [ALGORITHMS ...], --algo [ALGORITHMS ...] - Enter algorithm or list of algorithms, or "ensemble" to use all, to use for optimization: ex: -algos PatternSearch | -algos '["PatternSearch", "NSGA2"]' | -algos - "ensemble" (default: NSGA2) - --dst-dir DST_DIR Directory to store T3CO results (default: ./src/results) - --dir-mark DIR_MARK Name for results directory in addition to timestamp (default: ) - --file-mark FILE_MARK - Prefix to add to the result file names (default: ) - --skip-save-veh Toggle result vehicle model YAML file saving off (default: False) - --x-tol X_TOL Parameter space tolerance for optimization (default: 0.001) - --f-tol F_TOL Objective space tolerance for optimization (default: 0.001) - --n-max-gen N_MAX_GEN - Max number of optimizer iterations regardless of algorithm (default: 1000) - --pop-size POP_SIZE population of each generation (default: 25) - --nth-gen NTH_GEN Period of generations in which to evaluate if convergence happens during optimization (default: 1) - --n-last N_LAST Number of generations to look back for establishing convergence during optimization (default: 5) - --range-overshoot-tol RANGE_OVERSHOOT_TOL - Range overshoot tolerance, example '0.20' allows 20% range overshoot. Default of 'None' does not constrain overshoot. (default: None) - ---missed-trace-correction - Activate FASTSim time-dilation to correct missed trace (default: False) - --max-time-dilation MAX_TIME_DILATION - Maximum time dilation factor to 'catch up' with trace (default: 10) - --min-time-dilation MIN_TIME_DILATION - Minimum time dilation to let trace 'catch up' (default: 0.1) - --time-dilation-tol TIME_DILATION_TOL - Convergence criteria for time dilation (default: 0.001) - --write-tsv WRITE_TSV - Boolean toggle to save intermediary .TSV cost results files (default: False) - --run-multi Boolean switch to select multiprocessing version (default: False) - --n-processors N_PROCESSORS - Number of processors to use for multiprocessing (default: 9) + +Selected CLI arguments related to EIA fuel price data fetching: + +``` + --eia-api-key EIA_API_KEY + EIA API key (prefer setting T3CO_EIA_API_KEY in .env file instead). + --eia-aeo-year EIA_AEO_YEAR + AEO publication year to query (e.g. '2023', '2025'). + Default: auto-discover latest. + --eia-aeo-case EIA_AEO_CASE + AEO scenario case ID (e.g. 'aeo2023ref'). + Default: auto-discover reference case. +``` + +For the full list of CLI arguments, run: +```bash +python -m t3co.cli.sweep --help ``` ## T3CO Results @@ -149,4 +134,4 @@ The [`t3co.visualization.charts`](https://github.com/NREL/T3CO/tree/main/t3co/vi violinplot -The user can provide other input parameters specific to each visualization method to further customize the plots. \ No newline at end of file +The user can provide other input parameters specific to each visualization method to further customize the plots. diff --git a/poetry.lock b/poetry.lock index cf7c6edb..26688550 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "about-time" @@ -7,7 +7,7 @@ description = "Easily measure timing and throughput of code blocks, with beautif optional = true python-versions = ">=3.7, <4" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "about-time-4.2.1.tar.gz", hash = "sha256:6a538862d33ce67d997429d14998310e1dbfda6cb7d9bbfbf799c4709847fece"}, {file = "about_time-4.2.1-py3-none-any.whl", hash = "sha256:8bbf4c75fe13cbd3d72f49a03b02c5c7dca32169b6d49117c257e7eb3eaee341"}, @@ -20,7 +20,7 @@ description = "A new kind of Progress Bar, with real-time throughput, ETA, and v optional = true python-versions = "<4,>=3.9" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "alive-progress-3.2.0.tar.gz", hash = "sha256:ede29d046ff454fe56b941f686f89dd9389430c4a5b7658e445cb0b80e0e4deb"}, {file = "alive_progress-3.2.0-py3-none-any.whl", hash = "sha256:0677929f8d3202572e9d142f08170b34dbbe256cc6d2afbf75ef187c7da964a8"}, @@ -37,7 +37,7 @@ description = "Efficiently computes derivatives of NumPy code." optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "autograd-1.7.0-py3-none-any.whl", hash = "sha256:49680300f842f3a8722b060ac0d3ed7aca071d1ad4d3d38c9fdadafdcc73c30b"}, {file = "autograd-1.7.0.tar.gz", hash = "sha256:de743fd368d6df523cd37305dcd171861a9752a144493677d2c9f5a56983ff2f"}, @@ -56,7 +56,7 @@ description = "CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-l optional = true python-versions = "*" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "cma-3.2.2-py2.py3-none-any.whl", hash = "sha256:0e3994b1f93c065b3eb2e68dbc589d9e694e191698d0aa58cb70cbdb803ade4e"}, {file = "cma-3.2.2.tar.gz", hash = "sha256:47ac71ddd2b9a922daa601516064a585a1a3dbbae7802bca935db25e525547eb"}, @@ -76,7 +76,7 @@ description = "Cross-platform colored terminal text." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (python_version < \"3.11\" or extra == \"dev\") and sys_platform == \"win32\" and (extra == \"fastsim\" or extra == \"dev\")" +markers = "sys_platform == \"win32\" and (extra == \"fastsim\" or extra == \"dev\") and (python_version < \"3.11\" or extra == \"dev\")" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -89,7 +89,7 @@ description = "Python library for calculating contours of 2D quadrilateral grids optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, @@ -175,7 +175,7 @@ description = "Composable style cycles" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -192,7 +192,7 @@ description = "Python @deprecated decorator to deprecate old python classes, fun optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, @@ -202,7 +202,7 @@ files = [ wrapt = ">=1.10,<2" [package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools ; python_version >= \"3.12\"", "tox"] [[package]] name = "dill" @@ -211,7 +211,7 @@ description = "serialize all of Python" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -228,7 +228,7 @@ description = "An implementation of lxml.xmlfile for the standard library" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"fastsim\" or python_version < \"3.11\" and extra == \"dev\"" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, @@ -241,7 +241,7 @@ description = "Backport of PEP 654 (exception groups)" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "python_version < \"3.11\" and (extra == \"fastsim\" or extra == \"dev\")" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -257,7 +257,7 @@ description = "Tool for modeling vehicle powertrains" optional = true python-versions = ">=3.8, <3.11" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"fastsim\" or python_version < \"3.11\" and extra == \"dev\"" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "fastsim-2.1.2-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:37264477d1ed7ba75bbc04062e74c8f259a4b73ba0c813c07a98d46b712c4382"}, {file = "fastsim-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e03f42a1e2d7cd7f24b2d9205bd0a3a04b20a21a125491cf85581581b48e782e"}, @@ -294,7 +294,7 @@ description = "Tools to manipulate font files" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "fonttools-4.55.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d11600f5343092697d7434f3bf77a393c7ae74be206fe30e577b9a195fd53165"}, {file = "fonttools-4.55.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c96f2506ce1a0beeaa9595f9a8b7446477eb133f40c0e41fc078744c28149f80"}, @@ -349,18 +349,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "pycairo", "scipy"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr"] +type1 = ["xattr ; sys_platform == \"darwin\""] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "grapheme" @@ -369,7 +369,7 @@ description = "Unicode grapheme helpers" optional = true python-versions = "*" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "grapheme-0.6.0.tar.gz", hash = "sha256:44c2b9f21bbe77cfb05835fec230bd435954275267fea1858013b102f8603cca"}, ] @@ -384,7 +384,7 @@ description = "Read resources from Python packages" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version < \"3.10\" and (extra == \"fastsim\" or extra == \"dev\")" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version == \"3.9\"" files = [ {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, @@ -394,7 +394,7 @@ files = [ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -408,7 +408,7 @@ description = "brain-dead simple config-ini parsing" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (python_version < \"3.11\" or extra == \"dev\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "(extra == \"fastsim\" or extra == \"dev\") and (python_version < \"3.11\" or extra == \"dev\")" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -421,7 +421,7 @@ description = "A fast implementation of the Cassowary constraint solver" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, @@ -546,7 +546,7 @@ description = "Python plotting package" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50"}, {file = "matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff"}, @@ -613,7 +613,6 @@ description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -660,7 +659,7 @@ description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"fastsim\" or python_version < \"3.11\" and extra == \"dev\"" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, @@ -676,7 +675,7 @@ description = "Core utilities for Python packages" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -689,7 +688,6 @@ description = "Powerful data structures for data analysis, time series, and stat optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pandas-2.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:625466edd01d43b75b1883a64d859168e4556261a5035b32f9d743b67ef44634"}, {file = "pandas-2.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6872d695c896f00df46b71648eea332279ef4077a409e2fe94220208b6bb675"}, @@ -777,7 +775,7 @@ description = "Python Imaging Library (Fork)" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, @@ -857,7 +855,7 @@ docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] @@ -867,7 +865,7 @@ description = "An open-source, interactive data visualization library for Python optional = true python-versions = ">=3.6" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"fastsim\" or python_version < \"3.11\" and extra == \"dev\"" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "plotly-5.18.0-py3-none-any.whl", hash = "sha256:23aa8ea2f4fb364a20d34ad38235524bd9d691bf5299e800bca608c31e8db8de"}, {file = "plotly-5.18.0.tar.gz", hash = "sha256:360a31e6fbb49d12b007036eb6929521343d6bee2236f8459915821baefa2cbb"}, @@ -884,7 +882,7 @@ description = "plugin and hook calling mechanisms for python" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (python_version < \"3.11\" or extra == \"dev\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "(extra == \"fastsim\" or extra == \"dev\") and (python_version < \"3.11\" or extra == \"dev\")" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -901,7 +899,7 @@ description = "Multi-Objective Optimization in Python" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "pymoo-0.6.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b50fc36aba4b863d80b275558f303e0bc7ea0e16aa207cd558f65246f527b742"}, {file = "pymoo-0.6.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18086aeb45e478adb601c8d6c9d7e0166007256e53617d966e63e9bb7fce7c88"}, @@ -936,7 +934,7 @@ description = "pyparsing module - Classes and methods to define and execute pars optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -952,7 +950,7 @@ description = "pytest: simple powerful testing with Python" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (python_version < \"3.11\" or extra == \"dev\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "(extra == \"fastsim\" or extra == \"dev\") and (python_version < \"3.11\" or extra == \"dev\")" files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -976,7 +974,7 @@ description = "Thin-wrapper around the mock package for easier use with pytest" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and extra == \"dev\"" +markers = "extra == \"dev\"" files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -995,7 +993,6 @@ description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1011,7 +1008,6 @@ description = "World timezone definitions, modern and historical" optional = false python-versions = "*" groups = ["main"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, @@ -1024,7 +1020,7 @@ description = "YAML parser and emitter for Python" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"fastsim\" or python_version < \"3.11\" and extra == \"dev\"" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -1088,7 +1084,7 @@ description = "An extremely fast Python linter and code formatter, written in Ru optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and extra == \"dev\"" +markers = "extra == \"dev\"" files = [ {file = "ruff-0.9.9-py3-none-linux_armv6l.whl", hash = "sha256:628abb5ea10345e53dff55b167595a159d3e174d6720bf19761f5e467e68d367"}, {file = "ruff-0.9.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b6cd1428e834b35d7493354723543b28cc11dc14d1ce19b685f6e68e07c05ec7"}, @@ -1117,7 +1113,6 @@ description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, @@ -1161,7 +1156,7 @@ description = "Statistical data visualization" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"fastsim\" or python_version < \"3.11\" and extra == \"dev\"" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987"}, {file = "seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7"}, @@ -1184,7 +1179,7 @@ description = "Easily download, build, install, upgrade, and uninstall Python pa optional = true python-versions = ">=3.7" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"fastsim\" or python_version < \"3.11\" and extra == \"dev\"" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"}, {file = "setuptools-65.6.3.tar.gz", hash = "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"}, @@ -1192,7 +1187,7 @@ files = [ [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7) ; platform_python_implementation != \"PyPy\"", "pytest-checkdocs (>=2.4)", "pytest-cov ; platform_python_implementation != \"PyPy\"", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\"", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -1202,7 +1197,6 @@ description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -1215,7 +1209,7 @@ description = "Retry code until it succeeds" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"fastsim\" or python_version < \"3.11\" and extra == \"dev\"" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, @@ -1232,7 +1226,7 @@ description = "A lil' TOML parser" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.11\" and (extra == \"fastsim\" or extra == \"dev\")" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -1275,7 +1269,7 @@ description = "Backported and Experimental Type Hints for Python 3.8+" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version < \"3.11\" and extra == \"fastsim\" or python_version < \"3.11\" and extra == \"dev\"" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version < \"3.11\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -1288,7 +1282,6 @@ description = "Provider of IANA time zone data" optional = false python-versions = ">=2" groups = ["main"] -markers = "python_version <= \"3.11\" or python_version >= \"3.12\"" files = [ {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, @@ -1301,7 +1294,7 @@ description = "Module for decorators, wrappers and monkey patching." optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and (extra == \"fastsim\" or extra == \"dev\")" +markers = "extra == \"fastsim\" or extra == \"dev\"" files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -1384,6 +1377,18 @@ files = [ {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] +[[package]] +name = "zipcodes" +version = "1.3.0" +description = "Query U.S. state zipcodes without SQLite." +optional = false +python-versions = ">=2.6" +groups = ["main"] +files = [ + {file = "zipcodes-1.3.0-py2.py3-none-any.whl", hash = "sha256:0da407f1c7e7c0bb93fc91da00c4bb95dc88b545c2ff04febdff5168e9ab8b2f"}, + {file = "zipcodes-1.3.0.tar.gz", hash = "sha256:6a8d663f8477b54806b0af01bd90bfa2ba88e8e79be824a44e37697c69d064ef"}, +] + [[package]] name = "zipp" version = "3.21.0" @@ -1391,18 +1396,18 @@ description = "Backport of pathlib-compatible object wrapper for zip files" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version < \"3.10\" and (extra == \"fastsim\" or extra == \"dev\")" +markers = "(extra == \"fastsim\" or extra == \"dev\") and python_version == \"3.9\"" files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [extras] @@ -1412,4 +1417,4 @@ fastsim = ["fastsim", "pymoo"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4" -content-hash = "5759b87c3f9268bcc253ec00942a15c2b0246f7f00318a7ff0fa841ab2e876f3" +content-hash = "e844a3c4c52e7c5792ac1bb21b2b4e78bd9170740b6c3009de23bf3a2c4d6cbc" diff --git a/pyproject.toml b/pyproject.toml index 1d811da6..5d697b50 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,15 +31,17 @@ requires-python = ">=3.9,<4" python = ">=3.9,<4" pandas = "^2.3.0" numpy = "^1.26.0" +zipcodes = "^1.3.0" +requests = "^2.28.0" scipy = [ {version = "^1.11.0", python = ">=3.9,<3.10"}, {version = "^1.13.0", python = ">=3.10"} ] -fastsim = { version = "<3", optional = true } +fastsim = { version = ">=2.1.1,<3", python = ">=3.9,<3.11", optional = true } [project.optional-dependencies] -fastsim = ["fastsim>=2.1.1", "pymoo>=0.6.0"] -dev = ["pytest", "pytest-mock", "fastsim>=2.1.1", "pymoo>=0.6.0","ruff"] +fastsim = ["fastsim>=2.1.1,<3; python_version < '3.11'", "pymoo>=0.6.0"] +dev = ["pytest", "pytest-mock", "fastsim>=2.1.1,<3; python_version < '3.11'", "pymoo>=0.6.0", "ruff"] [project.scripts] install_t3co_demo_inputs = "t3co.utils.demo_inputs_installer:main" @@ -55,4 +57,4 @@ packages = [{include = "t3co", from = "src"}] Homepage = "https://www.nrel.gov/transportation/t3co.html" Documentation = "https://pages.github.nrel.gov/AVCI/T3CO" Repository = "https://github.nrel.gov/AVCI/T3CO" -"Bug Tracker" = "https://github.nrel.gov/AVCI/T3CO/issues" \ No newline at end of file +"Bug Tracker" = "https://github.nrel.gov/AVCI/T3CO/issues" diff --git a/src/t3co/cli/sweep.py b/src/t3co/cli/sweep.py index aa9b806f..552360f8 100644 --- a/src/t3co/cli/sweep.py +++ b/src/t3co/cli/sweep.py @@ -25,8 +25,9 @@ try: from pymoo.algorithms.soo.nonconvex.ga import GA - from pymoo.algorithms.moo import nsga2 + from pymoo.algorithms.moo.nsga2 import NSGA2 from pymoo.core.problem import StarmapParallelization + from pymoo.termination.default import DefaultSingleObjectiveTermination from pymoo.optimize import minimize from t3co.optimize.optimization import VehicleDesignOpt @@ -39,6 +40,102 @@ optimization_installed = False +def _normalize_selections_arg(selections) -> list | None: + if not selections: + return None + + if len(selections) == 1 and isinstance(selections[0], list): + return selections[0] + + return list(selections) + + +def _normalize_drive_cycle_arg(drive_cycle): + if not drive_cycle: + return None + + if len(drive_cycle) == 1: + return drive_cycle[0] + + return drive_cycle + + +def _argument_was_provided(argv: list[str], *flags: str) -> bool: + return any(flag in argv for flag in flags) + + +def apply_cli_overrides(config: Config, args, argv: list[str] | None = None) -> Config: + argv = [] if argv is None else argv + + override_specs = [ + (("--vehicles",), "vehicle_file", args.vehicles), + (("--scenarios",), "scenario_file", args.scenarios), + (("--eng-curves",), "eng_eff_imp_curves", args.eng_curves), + (("--lw-curves",), "lw_imp_curves", args.lw_curves), + (("--aero-curves",), "aero_drag_imp_curves", args.aero_curves), + (("--dst-dir",), "dst_dir", args.dst_dir), + (("--algorithms", "--algos", "--algo"), "algorithms", args.algorithms), + (("--x-tol",), "x_tol", args.x_tol), + (("--f-tol",), "f_tol", args.f_tol), + (("--n-max-gen",), "n_max_gen", int(args.n_max_gen)), + (("--pop-size",), "pop_size", int(args.pop_size)), + (("--nth-gen",), "nth_gen", args.nth_gen), + (("--n-last",), "n_last", args.n_last), + ] + + for flags, attr_name, value in override_specs: + if _argument_was_provided(argv, *flags): + setattr(config, attr_name, value) + + if _argument_was_provided(argv, "--selections"): + config.selections = _normalize_selections_arg(args.selections) + + if _argument_was_provided(argv, "--drive-cycle"): + config.drive_cycle = _normalize_drive_cycle_arg(args.drive_cycle) + + if _argument_was_provided(argv, "--skip-all-opt", "--skopt"): + config.skip_all_opt = True + + return config + + +def _get_primary_algorithm(config: Config) -> str: + algorithms = config.algorithms + if isinstance(algorithms, list): + return str(algorithms[0]) + + if isinstance(algorithms, str): + algorithms = algorithms.strip() + if not algorithms: + return "NSGA2" + if algorithms.startswith("["): + parsed_algorithms = ast.literal_eval(algorithms) + if isinstance(parsed_algorithms, list) and parsed_algorithms: + return str(parsed_algorithms[0]) + return algorithms + + return "NSGA2" + + +def _build_optimization_algorithm(config: Config): + algorithm_name = _get_primary_algorithm(config).upper() + if algorithm_name == "NSGA2": + return NSGA2(pop_size=int(config.pop_size), eliminate_duplicates=True) + if algorithm_name == "GA": + return GA(pop_size=int(config.pop_size), eliminate_duplicates=True) + + raise ValueError(f"Unsupported optimization algorithm '{algorithm_name}'") + + +def _build_optimization_termination(config: Config): + return DefaultSingleObjectiveTermination( + xtol=config.x_tol, + ftol=config.f_tol, + period=max(int(config.nth_gen), int(config.n_last)), + n_max_gen=int(config.n_max_gen), + ) + + def load_vehicle_scenario_energy( selection: Union[int, str], config: Config, @@ -139,16 +236,17 @@ def generate_ledger(selection: int, config: Config) -> Dict: print(f"Running Selection: {selection}: {input_scenario.scenario_name}") if not config.skip_all_opt and optimization_installed: - optimized_vehicle = run_optimization( + optimized_vehicle, optimized_energy = run_optimization( vehicle=input_vehicle, scenario=input_scenario, config=config ) else: optimized_vehicle = None + optimized_energy = None return Ledger( vehicle=(input_vehicle if not optimized_vehicle else optimized_vehicle), scenario=input_scenario, - energy=input_energy, + energy=(input_energy if optimized_energy is None else optimized_energy), config=config, ).to_dict( include_calcs=config.include_calcs, @@ -167,12 +265,12 @@ def run_optimization(vehicle: Vehicle, scenario: Scenario, config: Config): problem = VehicleDesignOpt( vehicle=vehicle, scenario=scenario, config=config, runner=runner ) - algorithm = GA(pop_size=100) + algorithm = _build_optimization_algorithm(config) res = minimize( problem, algorithm, - termination=("n_gen", 5), + termination=_build_optimization_termination(config), seed=1, verbose=True, ) @@ -181,9 +279,9 @@ def run_optimization(vehicle: Vehicle, scenario: Scenario, config: Config): pool.close() pool.join() - vehicle.fc_max_kw = res.X[0] - print(vehicle) - return vehicle + optimized_vehicle, optimized_energy, _ = problem.evaluate_solution(res.X) + print(optimized_vehicle) + return optimized_vehicle, optimized_energy def create_results_filepath(config: Config) -> Path: @@ -451,6 +549,7 @@ def run_t3co(config: Config, save_results: bool = True) -> None: if __name__ == "__main__": start = time.time() + raw_argv = os.sys.argv[1:] parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter, @@ -655,19 +754,43 @@ def run_t3co(config: Config, save_results: bool = True) -> None: help="Number of processors to use for multiprocessing", default=9, ) + parser.add_argument( + "--fuel-prices-json", + default=None, + type=str, + help="Fuel price override JSON string or path. Payload supports only 'zipcode' and 'fuel_prices'.", + ) + parser.add_argument( + "--fuel-prices-zipcode", + default=None, + type=str, + help="US zipcode used to resolve the source fuel price region when applying overrides.", + ) + parser.add_argument( + "--eia-api-key", + default=None, + type=str, + help="EIA API key (prefer setting T3CO_EIA_API_KEY in .env file instead).", + ) + parser.add_argument( + "--eia-aeo-year", + default=None, + type=str, + help="AEO publication year to query (e.g. '2023', '2025'). Default: auto-discover latest.", + ) + parser.add_argument( + "--eia-aeo-case", + default=None, + type=str, + help="AEO scenario case ID (e.g. 'aeo2023ref'). Default: auto-discover reference case.", + ) args = parser.parse_args() if args.config is None or args.config == "None": config = Config() - config.selections = ( - args.selections[0] - if isinstance(args.selections[0], list) - else [args.selections] - ) - config.drive_cycle = args.drive_cycle - config.check_drivecycles_and_create_selections() - config.read_auxiliary_files() + config.selections = _normalize_selections_arg(args.selections) + config.drive_cycle = _normalize_drive_cycle_arg(args.drive_cycle) config.vehicle_file = Path(args.vehicles) config.scenario_file = Path(args.scenarios) config.eng_eff_imp_curves = Path(args.eng_curves) @@ -676,8 +799,21 @@ def run_t3co(config: Config, save_results: bool = True) -> None: else: config = Config() config.from_csv(filename=args.config, analysis_id=args.analysis_id) - config.check_drivecycles_and_create_selections() - config.read_auxiliary_files() + + apply_cli_overrides(config=config, args=args, argv=raw_argv) + config.fuel_prices_json = args.fuel_prices_json + config.fuel_prices_zipcode = args.fuel_prices_zipcode + if args.eia_api_key is not None: + os.environ["T3CO_EIA_API_KEY"] = args.eia_api_key + if args.eia_aeo_year is not None: + config.eia_aeo_year = args.eia_aeo_year + if args.eia_aeo_case is not None: + config.eia_aeo_case = args.eia_aeo_case + + config.check_drivecycles_and_create_selections() + config.read_auxiliary_files() + + if args.config is not None and args.config != "None": gl.RESOURCES_FOLDERPATH = Path(args.config).parent config.vehicle_file = get_path_object(config.vehicle_file) config.scenario_file = get_path_object(config.scenario_file) @@ -733,7 +869,7 @@ def run_t3co(config: Config, save_results: bool = True) -> None: pool.join() # Sort the final file - print(f"Sorting results by selection...") + print("Sorting results by selection...") sort_csv_file(input_path=result_filepath, sort_by="selection") print(f"T3CO results saved and sorted to: {result_filepath}") diff --git a/src/t3co/cost_models/operating_costs.py b/src/t3co/cost_models/operating_costs.py index 9a0d0238..b5c5ccf1 100644 --- a/src/t3co/cost_models/operating_costs.py +++ b/src/t3co/cost_models/operating_costs.py @@ -132,30 +132,30 @@ def set_fuel_cost( "diesel" in scenario.fuel_type.lower() and "bio" not in scenario.fuel_type.lower() ): - dieselDolPerGal = scenario.fuel_prices_df.loc[ - "dieselDolPerGal", str(scenario.model_year + year_number - 1) + diesel_dol_per_gal = scenario.fuel_prices_df.loc[ + "diesel_dol_per_gal", str(scenario.model_year + year_number - 1) ] - self.fuel_price_dol_per_gge = dieselDolPerGal * gl.DGE_TO_GGE + self.fuel_price_dol_per_gge = diesel_dol_per_gal * gl.DGE_TO_GGE elif "gasoline" in scenario.fuel_type.lower(): - gasolineDolPerGal = scenario.fuel_prices_df.loc[ - "gasolineDolPerGal", str(scenario.model_year + year_number - 1) + gasoline_dol_per_gal = scenario.fuel_prices_df.loc[ + "gasoline_dol_per_gal", str(scenario.model_year + year_number - 1) ] - self.fuel_price_dol_per_gge = gasolineDolPerGal + self.fuel_price_dol_per_gge = gasoline_dol_per_gal elif "electricity" in scenario.fuel_type.lower(): - dolPerKwh = scenario.fuel_prices_df.loc[ - "dolPerKwh", str(scenario.model_year + year_number - 1) + electricity_dol_per_kwh = scenario.fuel_prices_df.loc[ + "electricity_dol_per_kwh", str(scenario.model_year + year_number - 1) ] - self.fuel_price_dol_per_gge = dolPerKwh * gl.KWH_PER_GGE + self.fuel_price_dol_per_gge = electricity_dol_per_kwh * gl.KWH_PER_GGE elif scenario.fuel_type.lower() == "cng": - CNGDolPerGge = scenario.fuel_prices_df.loc[ - "CNGDolPerGge", str(scenario.model_year + year_number - 1) + cng_dol_per_gge = scenario.fuel_prices_df.loc[ + "cng_dol_per_gge", str(scenario.model_year + year_number - 1) ] - self.fuel_price_dol_per_gge = CNGDolPerGge + self.fuel_price_dol_per_gge = cng_dol_per_gge elif scenario.fuel_type.lower() == "hydrogen": - hydrogenDolPerGGE = scenario.fuel_prices_df.loc[ - "hydrogenDolPerGGE", str(scenario.model_year + year_number - 1) + hydrogen_dol_per_gge = scenario.fuel_prices_df.loc[ + "hydrogen_dol_per_gge", str(scenario.model_year + year_number - 1) ] - self.fuel_price_dol_per_gge = hydrogenDolPerGGE + self.fuel_price_dol_per_gge = hydrogen_dol_per_gge else: raise Exception( f"Operating Costs calculation: Unknown fuel type {scenario.fuel_type}" @@ -285,6 +285,15 @@ def set_purchasing_payment_cost( self.purchasing_cost_dol_per_yr = 0 elif scenario.purchasing_method == "loan": + if ( + scenario.purchasing_term_yr <= 0 + or scenario.purchasing_payment_frequency_months <= 0 + ): + self.purchasing_payment_dol_per_yr = 0 + self.purchasing_cost_dol_per_yr = 0 + self.purchasing_remaining_principal_dol = 0 + return + interest_rate_pct_per_frequency = ( scenario.purchasing_interest_apr_pct_per_yr / 12 @@ -337,6 +346,12 @@ def set_purchasing_payment_cost( ) elif scenario.purchasing_method == "lease": + if scenario.purchasing_term_yr <= 0: + self.purchasing_payment_dol_per_yr = 0 + self.purchasing_cost_dol_per_yr = 0 + self.purchasing_tax_amount_dol_per_year = 0 + return + adjusted_cap_cost_dol = ( cap_costs.msrp_total_dol + cap_costs.purchase_tax_dol diff --git a/src/t3co/data_fetching/__init__.py b/src/t3co/data_fetching/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/t3co/data_fetching/eia_client.py b/src/t3co/data_fetching/eia_client.py new file mode 100644 index 00000000..1933d95a --- /dev/null +++ b/src/t3co/data_fetching/eia_client.py @@ -0,0 +1,574 @@ +""" +EIA (Energy Information Administration) API v2 client for fetching fuel price +projections from the Annual Energy Outlook (AEO). + +Usage: + client = EIAClient(api_key="your_key") + df = client.fetch_aeo_fuel_prices() # auto-discovers latest AEO year + +The returned DataFrame matches the T3CO FuelPrices.csv schema: + Region | Fuel | 2019 | 2020 | ... | 2100 +""" + +import hashlib +import json +import logging +import os +import tempfile +import time +from pathlib import Path +from typing import Dict, List, Optional, Union +from urllib.parse import urlencode + +import numpy as np +import pandas as pd + +try: + import requests + from urllib3.exceptions import InsecureRequestWarning +except ImportError: + requests = None + InsecureRequestWarning = None + +try: + import truststore + truststore.inject_into_ssl() +except ImportError: + pass + +logger = logging.getLogger(__name__) + +EIA_BASE_URL = "https://api.eia.gov/v2" + +# ── AEO Region IDs → T3CO Region Names ────────────────────────────────────── +AEO_REGION_ID_TO_T3CO = { + "1-1": "New England", + "1-2": "Middle Atlantic", + "1-3": "East North Central", + "1-4": "West North Central", + "1-5": "South Atlantic", + "1-6": "East South Central", + "1-7": "West South Central", + "1-8": "Mountain", + "1-9": "Pacific", + "1-0": "United States", +} + +T3CO_TO_AEO_REGION_ID = {v: k for k, v in AEO_REGION_ID_TO_T3CO.items()} + +# ── EIA AEO Series ID Prefixes → T3CO Fuel Names ──────────────────────────── +# Table 3: Energy Prices by Sector and Source (in $/MMBtu) +# +# Series IDs are region-specific: the penultimate segment encodes the census +# division (e.g. "pcf" = Pacific, "neengl" = New England, "mtn" = Mountain). +# We match on the *prefix* up to and including the "NA_" before the region +# token, so a single mapping works for every region. +AEO_SERIES_TO_FUEL = { + # Transportation sector – diesel fuel + "prce_nom_trn_NA_dfu_NA_": { + "fuel": "diesel_dol_per_gal", + "mmbtu_per_unit": 0.137381, # 1 gal diesel ≈ 137,381 BTU HHV + }, + # Average price to all users – motor gasoline + "prce_nom_ten_NA_mgs_NA_": { + "fuel": "gasoline_dol_per_gal", + "mmbtu_per_unit": 0.120476, # 1 gal gasoline ≈ 120,476 BTU HHV + }, + # Commercial sector – electricity + "prce_nom_comm_NA_elc_NA_": { + "fuel": "electricity_dol_per_kwh", + "mmbtu_per_unit": 0.003412, # 1 kWh = 3,412 BTU + }, + # Commercial sector – natural gas (used as CNG proxy) + "prce_nom_comm_NA_ng_NA_": { + "fuel": "cng_dol_per_gge", + "mmbtu_per_unit": 0.120476, # 1 GGE ≈ 120,476 BTU + }, +} + +# Years covered in T3CO FuelPrices.csv +T3CO_YEAR_RANGE = range(2019, 2101) + +# Default cache TTL in seconds (24 hours) +DEFAULT_CACHE_TTL_SECONDS = 86400 + +# Max rows per EIA API request +EIA_MAX_LENGTH = 5000 + + +class EIAClientError(Exception): + """Raised when the EIA API returns an error or is unreachable.""" + + +class EIAClient: + """ + Client for querying the EIA Open Data API v2 to retrieve AEO fuel price + projections and convert them to T3CO FuelPrices.csv format. + """ + + def __init__( + self, + api_key: str, + base_url: str = EIA_BASE_URL, + cache_dir: Optional[Union[str, Path]] = None, + cache_ttl_seconds: int = DEFAULT_CACHE_TTL_SECONDS, + max_retries: int = 3, + ssl_verify: Optional[Union[bool, str]] = None, + ): + if requests is None: + raise ImportError( + "The 'requests' package is required for EIA API queries. " + "Install it with: pip install requests" + ) + if not api_key: + raise ValueError( + "An EIA API key is required. Register at https://www.eia.gov/opendata/register.php " + "and set the T3CO_EIA_API_KEY environment variable or pass --eia-api-key." + ) + self.api_key = api_key + self.base_url = base_url.rstrip("/") + self.cache_dir = Path(cache_dir or tempfile.gettempdir()) / "t3co_eia_cache" + self.cache_dir.mkdir(parents=True, exist_ok=True) + self.cache_ttl_seconds = cache_ttl_seconds + self.max_retries = max_retries + self.ssl_verify = self._resolve_ssl_verify(ssl_verify) + if self.ssl_verify is False and InsecureRequestWarning is not None: + import warnings + warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + @staticmethod + def _resolve_ssl_verify(ssl_verify: Optional[Union[bool, str]]) -> Union[bool, str]: + """Determine the ``verify`` value for requests. + + Priority: + 1. Explicit *ssl_verify* argument (bool or path to CA bundle). + 2. ``T3CO_SSL_VERIFY`` env-var ("false"/"0" → disable, path → CA bundle). + 3. ``REQUESTS_CA_BUNDLE`` / ``CURL_CA_BUNDLE`` env-vars (standard). + 4. Default ``True`` (use certifi bundle). + """ + if ssl_verify is not None: + return ssl_verify + + env_val = os.environ.get("T3CO_SSL_VERIFY", "").strip() + if env_val: + if env_val.lower() in ("false", "0", "no"): + logger.warning( + "SSL verification disabled via T3CO_SSL_VERIFY=%s. " + "Connections to the EIA API will NOT be verified.", + env_val, + ) + return False + return env_val # treat as path to CA bundle + + for var in ("REQUESTS_CA_BUNDLE", "CURL_CA_BUNDLE"): + bundle = os.environ.get(var, "").strip() + if bundle: + return bundle + + return True + + # ── Core API request ───────────────────────────────────────────────── + + def _request(self, route: str, params: Optional[Union[dict, List[tuple]]] = None) -> dict: + """ + Makes a GET request to the EIA API with retry and caching. + Params can be a dict or a list of (key, value) tuples (for repeated keys). + """ + url = f"{self.base_url}/{route.strip('/')}" + + # Normalise to list-of-tuples so repeated keys (facets) are preserved + if isinstance(params, dict): + param_list = list(params.items()) + elif params: + param_list = list(params) + else: + param_list = [] + param_list.append(("api_key", self.api_key)) + + cache_key = self._cache_key(url, sorted(param_list)) + cached = self._read_cache(cache_key) + if cached is not None: + logger.debug("EIA cache hit: %s", cache_key) + return cached + + last_error = None + for attempt in range(1, self.max_retries + 1): + try: + resp = requests.get(url, params=param_list, timeout=30, verify=self.ssl_verify) + resp.raise_for_status() + data = resp.json() + if "error" in data: + raise EIAClientError( + f"EIA API error: {data['error']} (code {data.get('code', '?')})" + ) + self._write_cache(cache_key, data) + return data + except requests.RequestException as exc: + last_error = exc + if attempt < self.max_retries: + wait = 2 ** attempt + logger.warning( + "EIA request failed (attempt %d/%d), retrying in %ds: %s", + attempt, + self.max_retries, + wait, + exc, + ) + time.sleep(wait) + raise EIAClientError( + f"EIA API request failed after {self.max_retries} attempts: {last_error}" + ) from last_error + + # ── AEO discovery ──────────────────────────────────────────────────── + + def discover_latest_aeo_year(self) -> str: + """Query ``/v2/aeo/`` and return the most recent numeric AEO + publication year (e.g. ``"2025"``).""" + data = self._request("aeo/") + routes = data.get("response", {}).get("routes", []) + numeric_years = [] + for r in routes: + rid = r.get("id", "") + if rid.isdigit(): + numeric_years.append(int(rid)) + if not numeric_years: + raise EIAClientError( + "Could not discover any AEO publication years from the EIA API" + ) + latest = str(max(numeric_years)) + logger.info("Latest AEO publication year: %s", latest) + return latest + + def discover_reference_scenario(self, aeo_year: str) -> str: + """Query the facets for *aeo_year* and return the reference-case + scenario ID (the one whose name contains ``ref``).""" + data = self._request( + f"aeo/{aeo_year}/data/", + [ + ("facets[tableId][]", "3"), + ("facets[regionId][]", "1-0"), + ("frequency", "annual"), + ("data[]", "value"), + ("length", "1"), + ], + ) + rows = data.get("response", {}).get("data", []) + if rows: + scenario = rows[0].get("scenario", "") + if scenario: + logger.info( + "Reference scenario for AEO %s: %s", aeo_year, scenario + ) + return scenario + + raise EIAClientError( + f"Could not discover the reference scenario for AEO {aeo_year}" + ) + + def _resolve_aeo_params( + self, aeo_year: Optional[str], scenario: Optional[str] + ) -> tuple: + """Resolve *aeo_year* and *scenario* to concrete values. + + * ``aeo_year`` of ``"latest"`` / ``None`` / ``""`` → auto-discover. + * ``scenario`` of ``None`` / ``""`` → auto-discover for the resolved + *aeo_year*. + """ + if not aeo_year or aeo_year.lower() == "latest": + aeo_year = self.discover_latest_aeo_year() + if not scenario: + scenario = self.discover_reference_scenario(aeo_year) + return aeo_year, scenario + + # ── AEO fuel price fetching ────────────────────────────────────────── + + def fetch_aeo_fuel_prices( + self, + aeo_year: Optional[str] = None, + scenario: Optional[str] = None, + region_ids: Optional[List[str]] = None, + ) -> pd.DataFrame: + """ + Fetches AEO fuel price projections and returns a DataFrame matching + the T3CO FuelPrices.csv schema (Region, Fuel, year-columns). + + Args: + aeo_year: AEO publication year (e.g. "2023", "2025"). Pass + ``"latest"`` or ``None`` to auto-discover the most recent. + scenario: AEO scenario case ID. Pass ``None`` to auto-discover + the reference case for the resolved *aeo_year*. + region_ids: List of EIA region IDs to fetch. Defaults to all + census divisions (1-1 through 1-9). + + Returns: + DataFrame with columns: Region, Fuel, 2019, 2020, ..., 2100 + """ + aeo_year, scenario = self._resolve_aeo_params(aeo_year, scenario) + + if region_ids is None: + region_ids = list(AEO_REGION_ID_TO_T3CO.keys()) + + raw_data = self._fetch_aeo_table3_data( + aeo_year=aeo_year, + scenario=scenario, + region_ids=region_ids, + ) + + # Group records by regionId and transform each region + all_rows = [] + from collections import defaultdict + by_region = defaultdict(list) + for record in raw_data: + by_region[record.get("regionId", "")].append(record) + + for region_id in region_ids: + t3co_region = AEO_REGION_ID_TO_T3CO.get(region_id) + if not t3co_region: + logger.warning("Unknown EIA region ID '%s', skipping", region_id) + continue + + region_rows = self._transform_aeo_to_t3co( + raw_data=by_region.get(region_id, []), + t3co_region=t3co_region, + ) + all_rows.extend(region_rows) + + if not all_rows: + raise EIAClientError( + f"No fuel price data returned from EIA AEO {aeo_year} " + f"scenario '{scenario}' for regions {region_ids}" + ) + + df = pd.DataFrame(all_rows) + + # Ensure all T3CO year columns exist + year_cols = [str(y) for y in T3CO_YEAR_RANGE] + for col in year_cols: + if col not in df.columns: + df[col] = np.nan + + # Reorder columns: Region, Fuel, then years in order + ordered_cols = ["Region", "Fuel"] + year_cols + df = df[[c for c in ordered_cols if c in df.columns]] + + # Extrapolate: fill years before AEO start with earliest available, + # and years after AEO end with latest available + inflation trend + df = self._extrapolate_years(df) + + return df + + def _fetch_aeo_table3_data( + self, + aeo_year: str, + scenario: str, + region_ids: List[str], + series_ids: Optional[List[str]] = None, + ) -> List[dict]: + """ + Fetches Table 3 (Energy Prices by Sector and Source) data from AEO. + Sends all regions in a single API call. Series IDs are NOT sent as + facets because they contain a region-specific suffix that varies per + census division; instead all Table 3 data for the requested regions is + fetched and filtered client-side in ``_transform_aeo_to_t3co``. + + Returns the raw data list from the API response. + """ + route = f"aeo/{aeo_year}/data/" + + param_list = [ + ("facets[scenario][]", scenario), + ("facets[tableId][]", "3"), + ] + for rid in region_ids: + param_list.append(("facets[regionId][]", rid)) + + param_list.append(("frequency", "annual")) + param_list.append(("data[]", "value")) + param_list.append(("length", str(EIA_MAX_LENGTH))) + + response = self._request(route, param_list) + data = response.get("response", {}).get("data", []) + return data + + @staticmethod + def _match_series_prefix(series_id: str) -> Optional[dict]: + """Return the AEO_SERIES_TO_FUEL mapping if *series_id* starts with + any known prefix, otherwise ``None``.""" + for prefix, mapping in AEO_SERIES_TO_FUEL.items(): + if series_id.startswith(prefix): + return mapping + return None + + def _transform_aeo_to_t3co( + self, + raw_data: List[dict], + t3co_region: str, + ) -> List[dict]: + """ + Converts raw AEO API data ($/MMBtu) to T3CO fuel price rows + ($/gal, $/kWh, $/GGE). Series IDs are matched by *prefix* because + the region-specific suffix varies per census division. + """ + fuel_data: Dict[str, Dict[str, float]] = {} + fuel_mappings: Dict[str, dict] = {} + + for record in raw_data: + sid = record.get("seriesId", "") + period = record.get("period", "") + value = record.get("value") + if not period or value is None: + continue + mapping = self._match_series_prefix(sid) + if mapping is None: + continue + try: + value = float(value) + except (TypeError, ValueError): + continue + fuel_name = mapping["fuel"] + fuel_data.setdefault(fuel_name, {})[period] = value + fuel_mappings[fuel_name] = mapping + + rows = [] + for fuel_name, year_values in fuel_data.items(): + mmbtu_per_unit = fuel_mappings[fuel_name]["mmbtu_per_unit"] + + row = {"Region": t3co_region, "Fuel": fuel_name} + for year_str, price_per_mmbtu in year_values.items(): + price_native = price_per_mmbtu * mmbtu_per_unit + row[year_str] = round(price_native, 9) + + rows.append(row) + + return rows + + @staticmethod + def _extrapolate_years(df: pd.DataFrame) -> pd.DataFrame: + """ + Fills missing year columns by: + - Backfilling years before the earliest AEO data with that year's value. + - Forward-extrapolating years after the latest AEO data using the + compound annual growth rate of the last 5 available years. + """ + year_cols = [c for c in df.columns if c not in ("Region", "Fuel")] + year_ints = sorted(int(c) for c in year_cols) + if not year_ints: + return df + + for idx in df.index: + values = df.loc[idx, [str(y) for y in year_ints]] + non_null = values.dropna() + if non_null.empty: + continue + + first_year = int(non_null.index[0]) + last_year = int(non_null.index[-1]) + + # Backfill + earliest_val = non_null.iloc[0] + for y in year_ints: + if y < first_year: + df.loc[idx, str(y)] = earliest_val + + # Forward extrapolation using CAGR of last 5 years + tail_years = sorted(int(y) for y in non_null.index)[-5:] + if len(tail_years) >= 2: + v_start = float(non_null[str(tail_years[0])]) + v_end = float(non_null[str(tail_years[-1])]) + n_years = tail_years[-1] - tail_years[0] + if v_start > 0 and v_end > 0 and n_years > 0: + cagr = (v_end / v_start) ** (1.0 / n_years) - 1.0 + else: + cagr = 0.0 + else: + cagr = 0.0 + + last_val = float(non_null.iloc[-1]) + for y in year_ints: + if y > last_year: + years_out = y - last_year + df.loc[idx, str(y)] = round( + last_val * (1.0 + cagr) ** years_out, 9 + ) + + return df + + # ── Caching helpers ────────────────────────────────────────────────── + + def _cache_key(self, url: str, params) -> str: + raw = json.dumps({"url": url, "params": params}, sort_keys=True, default=str) + return hashlib.sha256(raw.encode()).hexdigest()[:16] + + def _read_cache(self, key: str) -> Optional[dict]: + cache_file = self.cache_dir / f"{key}.json" + if not cache_file.exists(): + return None + age = time.time() - cache_file.stat().st_mtime + if age > self.cache_ttl_seconds: + cache_file.unlink(missing_ok=True) + return None + try: + return json.loads(cache_file.read_text()) + except (json.JSONDecodeError, OSError): + cache_file.unlink(missing_ok=True) + return None + + def _write_cache(self, key: str, data: dict) -> None: + cache_file = self.cache_dir / f"{key}.json" + try: + cache_file.write_text(json.dumps(data)) + except OSError: + pass + + +def build_fuel_prices_df_from_eia( + api_key: str, + aeo_year: Optional[str] = None, + scenario: Optional[str] = None, + hydrogen_fallback_df: Optional[pd.DataFrame] = None, + region_ids: Optional[List[str]] = None, +) -> pd.DataFrame: + """ + High-level helper that fetches AEO fuel prices via the EIA API and + returns a complete DataFrame in T3CO FuelPrices.csv format. + + Hydrogen prices are not available in AEO. If a fallback DataFrame is + provided (e.g. from the existing FuelPrices.csv), hydrogen rows will + be copied from it. Otherwise, hydrogen rows are omitted with a warning. + + Args: + api_key: EIA API key. + aeo_year: AEO publication year. ``None`` or ``"latest"`` → + auto-discover the most recent AEO. + scenario: AEO scenario case ID. ``None`` → auto-discover the + reference case for the resolved year. + hydrogen_fallback_df: Optional DataFrame with hydrogen rows to merge. + region_ids: Optional list of AEO region IDs to fetch (e.g. ["1-9"]). + Defaults to all census divisions. + + Returns: + DataFrame with columns: Region, Fuel, 2019, 2020, ..., 2100 + """ + client = EIAClient(api_key=api_key) + df = client.fetch_aeo_fuel_prices( + aeo_year=aeo_year, scenario=scenario, region_ids=region_ids + ) + + # AEO doesn't include hydrogen prices. Merge from fallback if available. + if hydrogen_fallback_df is not None: + h2_rows = hydrogen_fallback_df[ + hydrogen_fallback_df["Fuel"] == "hydrogen_dol_per_gge" + ].copy() + if not h2_rows.empty: + # Only include regions that exist in the EIA data + eia_regions = set(df["Region"].unique()) + h2_rows = h2_rows[h2_rows["Region"].isin(eia_regions)] + if not h2_rows.empty: + df = pd.concat([df, h2_rows], ignore_index=True) + else: + logger.warning( + "Hydrogen prices are not available from EIA AEO. " + "Hydrogen fuel cost calculations will fail unless a fallback is provided." + ) + + return df diff --git a/src/t3co/input_data/config.py b/src/t3co/input_data/config.py index c42b925f..017833f6 100644 --- a/src/t3co/input_data/config.py +++ b/src/t3co/input_data/config.py @@ -1,7 +1,12 @@ import ast from dataclasses import dataclass, field +import json +import os from pathlib import Path +import re import sys +import tempfile +import uuid from t3co.input_data.toggles import Toggles @@ -10,13 +15,18 @@ except ImportError: from typing_extensions import Self # Older versions of Python -from typing import Union +from typing import Optional, Tuple, Union import numpy as np import pandas as pd from t3co.constants import Global as gl +from t3co.utils import resolve_fuel_price_region_from_zipcode from t3co.utils.print_class_objects import get_path_object, remove_df_attrs +ALLOWED_FUEL_PRICE_PAYLOAD_KEYS = {"zipcode", "fuel_prices"} +ZIPCODE_REGION_PREFIX = "zip" + + @dataclass class Config: analysis_id: int = 0 @@ -44,6 +54,13 @@ class Config: insurance_rates_file: str = "" energy_file: str = None fuel_prices_file: str = "" + fuel_prices_json: Union[str, dict] = None + fuel_prices_zipcode: Union[str, int] = None + fuel_prices_region: str = None + fuel_prices_source_region: str = None + region: str = None + eia_aeo_year: str = None + eia_aeo_case: str = None plf_weight_dist_file: str = None cost_toggles_file: str = gl.RESOURCES_FOLDERPATH / "inputs" / "cost_toggles.json" @@ -51,7 +68,7 @@ class Config: purchasing_method: str = "cash" # Optimization - algorithms: str = "" + algorithms: str = "NSGA2" lw_imp_curves: str = "" eng_eff_imp_curves: str = "" aero_drag_imp_curves: str = "" @@ -65,6 +82,12 @@ class Config: objective_tco: bool = False constraint_c_rate: bool = False constraint_trace_miss_dist_percent_on: bool = False + x_tol: float = 0.001 + f_tol: float = 0.001 + n_max_gen: int = 1000 + pop_size: int = 25 + nth_gen: int = 1 + n_last: int = 5 # Opportunity Cost activate_tco_payload_cap_cost_multiplier: bool = False @@ -86,6 +109,162 @@ class Config: vehicle_db_df: pd.DataFrame = None scenario_df: pd.DataFrame = None + def _load_fuel_prices_payload(self) -> Optional[dict]: + """ + Loads optional JSON fuel price overrides from a JSON string, file path, or dict. + """ + if self.fuel_prices_json is None: + return None + + if isinstance(self.fuel_prices_json, dict): + return self.fuel_prices_json + + fuel_prices_json = str(self.fuel_prices_json).strip() + if not fuel_prices_json: + return None + + payload_path = Path(fuel_prices_json) + if payload_path.exists(): + with open(payload_path, "r") as fuel_prices_file: + return json.load(fuel_prices_file) + + return json.loads(fuel_prices_json) + + def _normalize_fuel_price_overrides(self, payload: dict) -> Tuple[str, str, dict]: + """ + Extracts and validates the zipcode-based fuel price overrides from a payload. + """ + invalid_keys = set(payload).difference(ALLOWED_FUEL_PRICE_PAYLOAD_KEYS) + if invalid_keys: + invalid_keys_text = ", ".join(sorted(invalid_keys)) + raise ValueError( + "Fuel price override payload only supports 'zipcode' and 'fuel_prices'. " + f"Unexpected keys: {invalid_keys_text}" + ) + + zipcode = self._sanitize_zipcode( + payload.get("zipcode") or self.fuel_prices_zipcode + ) + fuel_prices = payload.get("fuel_prices") + if not isinstance(fuel_prices, dict) or not fuel_prices: + raise ValueError( + "Fuel price override payload must include a non-empty 'fuel_prices' mapping" + ) + + region_name = f"{ZIPCODE_REGION_PREFIX}_{zipcode}_{uuid.uuid4().hex[:8]}" + return zipcode, region_name, fuel_prices + + def _sanitize_zipcode(self, zipcode_value: Union[str, int, None]) -> str: + """ + Validates and normalizes a US zipcode to its 5-digit form. + """ + if zipcode_value is None: + raise ValueError( + "Fuel price overrides require a US zipcode via payload['zipcode'] or config.fuel_prices_zipcode" + ) + + zipcode = str(zipcode_value).strip() + zipcode_match = re.fullmatch(r"(\d{5})(?:-\d{4})?", zipcode) + if zipcode_match is None: + raise ValueError( + "Fuel price override zipcode must be a 5-digit US zipcode or ZIP+4 string" + ) + + return zipcode_match.group(1) + + def _resolve_fuel_price_region_from_zipcode(self, zipcode: str) -> str: + """ + Resolves a 5-digit US zipcode to the matching fuel price region. + """ + return resolve_fuel_price_region_from_zipcode(zipcode) + + def _create_temporary_fuel_price_region(self) -> None: + """ + Creates a temporary fuel price CSV by cloning a base region and applying JSON overrides. + """ + payload = self._load_fuel_prices_payload() + if payload is None: + return + + zipcode, region_name, fuel_price_overrides = ( + self._normalize_fuel_price_overrides(payload) + ) + + if ( + "Region" not in self.fuel_prices_df.columns + or "Fuel" not in self.fuel_prices_df.columns + ): + raise ValueError("Fuel prices CSV must contain 'Region' and 'Fuel' columns") + + base_region = self._resolve_fuel_price_region_from_zipcode(zipcode) + + region_rows = self.fuel_prices_df[ + self.fuel_prices_df["Region"] == base_region + ].copy() + if region_rows.empty: + raise ValueError(f"Fuel price base region '{base_region}' was not found") + + region_rows.loc[:, "Region"] = region_name + + for fuel_name, year_values in fuel_price_overrides.items(): + if not isinstance(year_values, dict): + raise ValueError( + f"Fuel price overrides for '{fuel_name}' must map years to values" + ) + + fuel_mask = region_rows["Fuel"] == fuel_name + if not fuel_mask.any(): + template_rows = self.fuel_prices_df[ + self.fuel_prices_df["Fuel"] == fuel_name + ] + if template_rows.empty: + raise ValueError( + f"Fuel price overrides reference unknown fuel '{fuel_name}'" + ) + new_row = template_rows.iloc[[0]].copy() + new_row.loc[:, "Region"] = region_name + region_rows = pd.concat([region_rows, new_row], ignore_index=True) + fuel_mask = region_rows["Fuel"] == fuel_name + + for year, value in year_values.items(): + year_column = str(year) + if year_column not in region_rows.columns: + raise ValueError( + f"Fuel price overrides reference unknown year column '{year_column}'" + ) + try: + numeric_value = float(value) + except (TypeError, ValueError) as exc: + raise ValueError( + f"Fuel price override for '{fuel_name}' year '{year_column}' must be numeric" + ) from exc + if ( + not np.isfinite(numeric_value) + or numeric_value < 0 + or numeric_value > 1000 + ): + raise ValueError( + f"Fuel price override for '{fuel_name}' year '{year_column}' must be between 0 and 1000" + ) + region_rows.loc[fuel_mask, year_column] = numeric_value + + self.fuel_prices_df = self.fuel_prices_df[ + self.fuel_prices_df["Region"] != region_name + ].copy() + self.fuel_prices_df = pd.concat( + [self.fuel_prices_df, region_rows], ignore_index=True + ) + + with tempfile.NamedTemporaryFile( + mode="w", suffix=".csv", prefix="t3co_fuel_prices_", delete=False + ) as fuel_prices_temp_file: + temp_file_path = Path(fuel_prices_temp_file.name) + + self.fuel_prices_df.to_csv(temp_file_path, index=False) + self.fuel_prices_file = temp_file_path + self.fuel_prices_region = region_name + self.fuel_prices_source_region = base_region + def __new__(cls, *args, **kwargs): """ Creates a new instance of the Config class. @@ -235,17 +414,119 @@ def check_drivecycles_and_create_selections(self) -> None: else: self.selections_list = self.selections + @staticmethod + def _is_zipcode(value) -> bool: + """Returns True if *value* looks like a 5-digit US zipcode (or ZIP+4).""" + if value is None: + return False + if isinstance(value, float) and value == int(value): + value = int(value) + return bool(re.fullmatch(r"\d{5}(?:-\d{4})?", str(value).strip())) + def read_auxiliary_files(self) -> None: """ Reads auxiliary files such as fuel prices and residual rates. + + If the config ``region`` is a US zipcode **and** the + ``eia_fuel_prices`` toggle is enabled, fuel prices for the + corresponding census division are fetched from the EIA AEO API. + Otherwise the static CSV pointed to by ``fuel_prices_file`` is used. """ self.vehicle_df = pd.read_csv(get_path_object(self.vehicle_file)) self.scenario_df = pd.read_csv(get_path_object(self.scenario_file)) - self.fuel_prices_df = pd.read_csv(get_path_object(self.fuel_prices_file)) + self.cost_toggles = Toggles.from_json(get_path_object(self.cost_toggles_file)) + + if self._is_zipcode(self.region) and self.cost_toggles.eia_fuel_prices: + self._load_fuel_prices_from_eia_for_zipcode() + else: + self.fuel_prices_df = pd.read_csv( + get_path_object(self.fuel_prices_file) + ) + + self._create_temporary_fuel_price_region() self.fuel_prices_df = self.fuel_prices_df.set_index("Fuel") - self.cost_toggles = Toggles.from_json(get_path_object(self.cost_toggles_file)) + + @staticmethod + def _load_dotenv() -> None: + """ + Reads a .env file from the working directory (if present) and + loads its KEY=VALUE pairs into os.environ without overwriting + existing variables. + """ + env_path = Path.cwd() / ".env" + if not env_path.is_file(): + return + with open(env_path) as f: + for line in f: + line = line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, _, value = line.partition("=") + key = key.strip() + value = value.strip().strip('"').strip("'") + if key and key not in os.environ: + os.environ[key] = value + + def _load_fuel_prices_from_eia_for_zipcode(self) -> None: + """ + Resolves the config ``region`` zipcode to a census division, then + fetches fuel prices from the EIA AEO API for that single region. + + Sets ``fuel_prices_region`` so that + :meth:`Scenario.override_from_config` propagates the resolved + region to the scenario. + """ + self._load_dotenv() + + from t3co.data_fetching.eia_client import ( + T3CO_TO_AEO_REGION_ID, + build_fuel_prices_df_from_eia, + ) + + region_val = self.region + if isinstance(region_val, float) and region_val == int(region_val): + region_val = int(region_val) + zipcode = str(region_val).strip() + region_name = resolve_fuel_price_region_from_zipcode(zipcode) + + aeo_region_id = T3CO_TO_AEO_REGION_ID.get(region_name) + if not aeo_region_id: + raise ValueError( + f"Could not map region '{region_name}' (from zipcode {zipcode}) " + f"to an EIA AEO region ID" + ) + + api_key = os.environ.get("T3CO_EIA_API_KEY", "") + if not api_key: + raise ValueError( + "EIA API key required for zipcode-based fuel price lookup. " + "Set T3CO_EIA_API_KEY in a .env file or as an environment " + "variable, or pass --eia-api-key on the command line." + ) + + hydrogen_fallback_df = None + if self.fuel_prices_file: + try: + hydrogen_fallback_df = pd.read_csv( + get_path_object(self.fuel_prices_file) + ) + except Exception: + pass + + self.fuel_prices_df = build_fuel_prices_df_from_eia( + api_key=api_key, + aeo_year=self.eia_aeo_year or None, + scenario=self.eia_aeo_case or None, + hydrogen_fallback_df=hydrogen_fallback_df, + region_ids=[aeo_region_id], + ) + self.fuel_prices_region = region_name + print( + f"Successfully loaded fuel prices from EIA for zipcode " + f"{zipcode} (region: {region_name})" + ) def __getstate__(self): state = self.__dict__.copy() diff --git a/src/t3co/input_data/scenario.py b/src/t3co/input_data/scenario.py index 39ae45c6..86e3e85a 100644 --- a/src/t3co/input_data/scenario.py +++ b/src/t3co/input_data/scenario.py @@ -14,6 +14,7 @@ from typing_extensions import Self # Older versions of Python from t3co.input_data.config import Config +from t3co.utils import resolve_fuel_price_region_from_zipcode from t3co.utils.print_class_objects import handle_nan, remove_df_attrs from t3co.constants import Global as gl @@ -235,38 +236,45 @@ def from_dict(cls, scenario_dict: dict) -> Self: Returns: Scenario: An instance of the Scenario class. """ + default_scenario = cls() + for field_name in cls.__annotations__: + scenario_dict.setdefault(field_name, getattr(default_scenario, field_name)) + + def _parse_life_year_series( + field_name: str, fallback_value: float + ) -> list[float]: + raw_value = scenario_dict.get(field_name) + if raw_value in (None, ""): + return [fallback_value] * int(scenario_dict["vehicle_life_yr"]) + + if isinstance(raw_value, str): + parsed_value = ast.literal_eval(raw_value) + else: + parsed_value = raw_value + + if isinstance(parsed_value, (list, tuple)): + return list(parsed_value)[: int(scenario_dict["vehicle_life_yr"])] + + return [parsed_value] * int(scenario_dict["vehicle_life_yr"]) + scenario_dict["vehicle_class"] = " " scenario_dict["vehicle_class"] = ( scenario_dict["vehicle_class"] .join(scenario_dict["scenario_name"].split()[:3]) .lower() ) - scenario_dict["vmt"] = ast.literal_eval(scenario_dict["vmt"])[ - : scenario_dict["vehicle_life_yr"] - ] - scenario_dict["shifts_per_year"] = ast.literal_eval( - scenario_dict["shifts_per_year"] - )[: scenario_dict["vehicle_life_yr"]] - scenario_dict["mr_unplanned_downtime_hr_per_mi"] = ( - ast.literal_eval(scenario_dict["mr_unplanned_downtime_hr_per_mi"])[ - : scenario_dict["vehicle_life_yr"] - ] - if scenario_dict["mr_unplanned_downtime_hr_per_mi"] - else 0 + scenario_dict["vmt"] = _parse_life_year_series("vmt", 0.0) + scenario_dict["shifts_per_year"] = _parse_life_year_series( + "shifts_per_year", 0.0 ) - scenario_dict["depreciation_rates_pct_per_yr"] = ( - ast.literal_eval(scenario_dict["depreciation_rates_pct_per_yr"])[ - : scenario_dict["vehicle_life_yr"] - ] - if scenario_dict["depreciation_rates_pct_per_yr"] - else 0 + scenario_dict["mr_unplanned_downtime_hr_per_mi"] = _parse_life_year_series( + "mr_unplanned_downtime_hr_per_mi", 0.0 ) - scenario_dict["maint_oper_cost_dol_per_mi"] = ( - ast.literal_eval(scenario_dict["maint_oper_cost_dol_per_mi"])[ - : scenario_dict["vehicle_life_yr"] - ] - if scenario_dict["maint_oper_cost_dol_per_mi"] - else -1 + scenario_dict["depreciation_rates_pct_per_yr"] = _parse_life_year_series( + "depreciation_rates_pct_per_yr", 0.0 + ) + scenario_dict["maint_oper_cost_dol_per_mi"] = _parse_life_year_series( + "maint_oper_cost_dol_per_mi", -1.0 ) return cls(**handle_nan(scenario_dict)) @@ -337,7 +345,10 @@ def override_from_config( self.purchasing_method = "cash" self.insurance_rates_file = config.insurance_rates_file + self.fuel_prices_file = config.fuel_prices_file self.fuel_prices_df = config.fuel_prices_df + if config.fuel_prices_region: + self.region = config.fuel_prices_region if self.activate_tco_payload_cap_cost_multiplier and config: self.plf_weight_distribution_file = config.plf_weight_dist_file @@ -345,6 +356,69 @@ def override_from_config( if config.cost_toggles is not None: self.cost_toggles = config.cost_toggles + self._resolve_zipcode_region(config) + + def _resolve_zipcode_region(self, config: Config) -> None: + """If ``self.region`` is a US zipcode and the ``eia_fuel_prices`` + toggle is enabled, resolves it to the corresponding census division + and fetches EIA fuel prices for that region. + + If the config already resolved a zipcode (``config.fuel_prices_region`` + is set), this method is a no-op. + """ + if config.fuel_prices_region: + return + if not Config._is_zipcode(self.region): + return + if not getattr(self, "cost_toggles", None): + return + if not self.cost_toggles.eia_fuel_prices: + return + + import os + from t3co.data_fetching.eia_client import ( + T3CO_TO_AEO_REGION_ID, + build_fuel_prices_df_from_eia, + ) + + Config._load_dotenv() + + region_val = self.region + if isinstance(region_val, float) and region_val == int(region_val): + region_val = int(region_val) + zipcode = str(region_val).strip() + region_name = resolve_fuel_price_region_from_zipcode(zipcode) + aeo_region_id = T3CO_TO_AEO_REGION_ID.get(region_name) + if not aeo_region_id: + return + + api_key = os.environ.get("T3CO_EIA_API_KEY", "") + if not api_key: + return + + hydrogen_fallback_df = None + if self.fuel_prices_file: + try: + from t3co.utils.print_class_objects import get_path_object + hydrogen_fallback_df = pd.read_csv( + get_path_object(self.fuel_prices_file) + ) + except Exception: + pass + + self.fuel_prices_df = build_fuel_prices_df_from_eia( + api_key=api_key, + aeo_year=config.eia_aeo_year or None, + scenario=config.eia_aeo_case or None, + hydrogen_fallback_df=hydrogen_fallback_df, + region_ids=[aeo_region_id], + ) + self.fuel_prices_df = self.fuel_prices_df.set_index("Fuel") + self.region = region_name + print( + f"Scenario zipcode {zipcode} resolved to EIA region: {region_name}" + ) + def get_discounted_value(self, value: float, year_number: int) -> float: """ Calculates the discounted value for a given year. diff --git a/src/t3co/input_data/toggles.py b/src/t3co/input_data/toggles.py index 8e719154..04f22a49 100644 --- a/src/t3co/input_data/toggles.py +++ b/src/t3co/input_data/toggles.py @@ -24,6 +24,7 @@ class Toggles: mark_up: bool = True residual_cost: bool = True fuel_cost: bool = True + eia_fuel_prices: bool = True maintenance_oper_cost: bool = True insurance_cost: bool = True purchasing_cost: bool = True diff --git a/src/t3co/optimize/optimization.py b/src/t3co/optimize/optimization.py index 6f347ee3..c45c0c70 100644 --- a/src/t3co/optimize/optimization.py +++ b/src/t3co/optimize/optimization.py @@ -1,9 +1,9 @@ import numpy as np from multiprocessing import Pool -from pymoo.algorithms.soo.nonconvex.ga import GA from pymoo.algorithms.moo.nsga2 import NSGA2 from pymoo.core.problem import ElementwiseProblem, StarmapParallelization from pymoo.optimize import minimize +from pymoo.termination.default import DefaultSingleObjectiveTermination from t3co.energy_models.energy import Energy from t3co.input_data.config import Config @@ -130,41 +130,49 @@ def __init__( elementwise_runner=runner, ) - def _evaluate(self, x, out, *args, **kwargs): - # Update vehicle attributes based on decision variables - if self.vehicle.veh_pt_type == gl.CONV: - self.vehicle.fc_max_kw = x[0] + def apply_design_variables(self, x, vehicle=None): + target_vehicle = self.vehicle if vehicle is None else vehicle + + if target_vehicle.veh_pt_type == gl.CONV: + target_vehicle.fc_max_kw = x[0] if len(x) > 1: - self.vehicle.fs_kwh = x[1] - elif self.vehicle.veh_pt_type == gl.BEV: - self.vehicle.ess_max_kwh = x[0] - self.vehicle.mc_max_kw = x[1] - elif self.vehicle.veh_pt_type == gl.HEV: - self.vehicle.ess_max_kwh = x[0] - self.vehicle.fc_max_kw = x[1] - self.vehicle.fs_kwh = x[2] - self.vehicle.mc_max_kw = x[3] - - # Initialize Energy and run fastsim model + target_vehicle.fs_kwh = x[1] + elif target_vehicle.veh_pt_type == gl.BEV: + target_vehicle.ess_max_kwh = x[0] + target_vehicle.mc_max_kw = x[1] + elif target_vehicle.veh_pt_type == gl.HEV: + target_vehicle.ess_max_kwh = x[0] + target_vehicle.fc_max_kw = x[1] + target_vehicle.fs_kwh = x[2] + target_vehicle.mc_max_kw = x[3] + else: + raise ValueError(f"Unknown vehicle type: {target_vehicle.veh_pt_type}") + + return target_vehicle + + def evaluate_solution(self, x): + vehicle = self.apply_design_variables(x) + energy = Energy() energy.run_fastsim_model( - veh_no=self.vehicle.selection, + veh_no=vehicle.selection, scenario=self.scenario, vehicle_df=self.config.vehicle_df, - t3co_vehicle=self.vehicle, + t3co_vehicle=vehicle, ) - # Run performance tests if needed for constraints if self.scenario.constraint_accel: - energy.run_acceleration_test(self.vehicle, self.scenario) + energy.run_acceleration_test(vehicle, self.scenario) if self.scenario.constraint_grade: - energy.run_gradeability_test(self.vehicle, self.scenario) - + energy.run_gradeability_test(vehicle, self.scenario) if self.scenario.constraint_range: - energy.run_range_test(self.vehicle, self.scenario) + energy.run_range_test(vehicle, self.scenario) - # Instantiate Ledger, which will calculate the operating costs using Energy - ledger = Ledger(self.vehicle, self.scenario, energy, self.config) + ledger = Ledger(vehicle, self.scenario, energy, self.config) + return vehicle, energy, ledger + + def _evaluate(self, x, out, *args, **kwargs): + vehicle, energy, ledger = self.evaluate_solution(x) # Objective: minimize the discounted total cost of ownership out["F"] = [ledger.discounted_tco_dol] @@ -238,12 +246,17 @@ def run_optimization(selection, parallel=True, n_processes=4): try: problem = VehicleDesignOpt(vehicle, scenario, config, runner=runner) - algorithm = GA(pop_size=100) + algorithm = NSGA2(pop_size=config.pop_size, eliminate_duplicates=True) res = minimize( problem, algorithm, - termination=("n_gen", 5), + termination=DefaultSingleObjectiveTermination( + xtol=config.x_tol, + ftol=config.f_tol, + period=max(config.nth_gen, config.n_last), + n_max_gen=config.n_max_gen, + ), seed=1, verbose=True, ) @@ -252,6 +265,8 @@ def run_optimization(selection, parallel=True, n_processes=4): pool.close() pool.join() + vehicle, energy, ledger = problem.evaluate_solution(res.X) + print("Best solution:") if vehicle.veh_pt_type == gl.CONV: print(" Fuel Converter Peak Power (kW): {:.2f}".format(res.X[0])) @@ -266,7 +281,7 @@ def run_optimization(selection, parallel=True, n_processes=4): print(" Fuel Converter Peak Power (kW): {:.2f}".format(res.X[1])) print(" Fuel Storage Energy (kWh eq.): {:.2f}".format(res.X[2])) print(" Motor Peak Power (kW): {:.2f}".format(res.X[3])) - print("Minimum Discounted TCO: ${:.2f}".format(res.F[0])) + print("Minimum Discounted TCO: ${:.2f}".format(ledger.discounted_tco_dol)) if __name__ == "__main__": diff --git a/src/t3co/resources/T3COConfig.csv b/src/t3co/resources/T3COConfig.csv index 24220b26..15728d8c 100644 --- a/src/t3co/resources/T3COConfig.csv +++ b/src/t3co/resources/T3COConfig.csv @@ -1,6 +1,7 @@ -analysis_id,analysis_name,vehicle_file,scenario_file,dst_dir,resfile_suffix,selections,drive_cycle,vehicle_life_yr,cost_toggles_file,energy_file,TCO_method,purchasing_method,fuel_prices_file,ess_max_charging_power_kw,fs_fueling_rate_kg_per_min,fs_fueling_rate_gasoline_gpm,fs_fueling_rate_diesel_gpm,algorithms,lw_imp_curves,eng_eff_imp_curves,aero_drag_imp_curves,lw_imp_curve_sel,eng_eff_imp_curve_sel,aero_drag_imp_curve_sel,skip_all_opt,constraint_range,constraint_accel,constraint_grade,objective_tco,constraint_c_rate,constraint_trace_miss_dist_percent_on,plf_weight_dist_file,fdt_frac_full_charge_bounds,exclude_list_fields,include_calcs -0,Demo-NoOpt,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,"[12,13,14,15,16,17,18,19,20]",,4,./cost_toggles.json,,DIRECT,lease,./auxiliary/FuelPrices.csv,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",FALSE, -1,Demo-Opt,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,[1],,4,./cost_toggles.json,,EFFICIENCY,loan,./auxiliary/FuelPrices.csv,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",, -2,Demo-Scenario,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,[12],./cycles/long_haul_cyc.csv,4,./cost_toggles.json,,EFFICIENCY,loan,./auxiliary/FuelPrices.csv,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",, -3,Demo-NoOpt-multi,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,[12],./cycles/,4,./cost_toggles.json,,DIRECT,loan,./auxiliary/FuelPrices.csv,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",, -4,Demo-NoOpt-Energy,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,[12],,4,./cost_toggles.json,./auxiliary/EnergyValues.csv,DIRECT,cash,./auxiliary/FuelPrices.csv,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",TRUE,TRUE \ No newline at end of file +analysis_id,analysis_name,vehicle_file,scenario_file,dst_dir,resfile_suffix,selections,drive_cycle,vehicle_life_yr,cost_toggles_file,energy_file,TCO_method,purchasing_method,fuel_prices_file,region,ess_max_charging_power_kw,fs_fueling_rate_kg_per_min,fs_fueling_rate_gasoline_gpm,fs_fueling_rate_diesel_gpm,algorithms,lw_imp_curves,eng_eff_imp_curves,aero_drag_imp_curves,lw_imp_curve_sel,eng_eff_imp_curve_sel,aero_drag_imp_curve_sel,skip_all_opt,constraint_range,constraint_accel,constraint_grade,objective_tco,constraint_c_rate,constraint_trace_miss_dist_percent_on,plf_weight_dist_file,fdt_frac_full_charge_bounds,exclude_list_fields,include_calcs +0,Demo-NoOpt,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,"[12,13,14,15,16,17,18,19,20]",,4,./cost_toggles.json,,DIRECT,lease,./auxiliary/FuelPrices.csv,,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",FALSE, +1,Demo-Opt,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,[1],,4,./cost_toggles.json,,EFFICIENCY,loan,./auxiliary/FuelPrices.csv,,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",, +2,Demo-Scenario,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,[12],./cycles/long_haul_cyc.csv,4,./cost_toggles.json,,EFFICIENCY,loan,./auxiliary/FuelPrices.csv,,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",, +3,Demo-NoOpt-multi,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,[12],./cycles/,4,./cost_toggles.json,,DIRECT,loan,./auxiliary/FuelPrices.csv,,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",, +4,Demo-NoOpt-Energy,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,[12],,4,./cost_toggles.json,./auxiliary/EnergyValues.csv,DIRECT,cash,./auxiliary/FuelPrices.csv,,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",TRUE,TRUE +5,Demo-NoOpt-EIA-Zip,./inputs/Demo_FY22_vehicle_model_assumptions.csv,./inputs/Demo_FY22_scenario_assumptions.csv,../../results/t3co_results,,"[12,13,14,45,46,47,65,66,67]",,4,./cost_toggles.json,,DIRECT,cash,./auxiliary/FuelPrices.csv,90210,100,7.2,10,15,NSGA2,./auxiliary/LightweightImprovementCostCurve.csv,./auxiliary/EngineEffImprovementCostCurve.csv,./auxiliary/AeroDragImprovementCostCurve.csv,MDHD_noprogram_2020,MDHD_large_noprogram_2020,SleeperTractorHighRoof_noprogram_2021,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,./auxiliary/tractorweightvars.csv,"[0.1,0.9]",TRUE,TRUE \ No newline at end of file diff --git a/src/t3co/resources/auxiliary/FuelPrices.csv b/src/t3co/resources/auxiliary/FuelPrices.csv index 4bf11537..daf0e1f4 100644 --- a/src/t3co/resources/auxiliary/FuelPrices.csv +++ b/src/t3co/resources/auxiliary/FuelPrices.csv @@ -1,83 +1,83 @@ Region,Fuel,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100 -Pacific,gasolineDolPerGal,3.069722209,3.086530987,3.149335121,3.191860271,3.234319895,3.265413474,3.310172144,3.361870727,3.382550831,3.419458424,3.445939114,3.905952725,3.926745854,3.94153759,4.04380724,4.069785223,4.101621485,4.131632187,4.150380173,4.186986739,4.222034206,4.24329647,4.271472039,4.320977264,4.352638953,4.378992691,4.404960727,4.442638731,4.473804801,4.513358847,4.544393116,4.578084905,4.637600008,4.697888808,4.758961363,4.820827861,4.883498623,4.946984105,5.011294898,5.076441732,5.142435474,5.209287136,5.277007868,5.345608971,5.415101887,5.485498212,5.556809689,5.629048215,5.702225841,5.776354777,5.851447389,5.927516205,6.004573916,6.082633377,6.161707611,6.24180981,6.322953337,6.405151731,6.488418703,6.572768146,6.658214132,6.744770916,6.832452938,6.921274826,7.011251399,7.102397667,7.194728837,7.288260312,7.383007696,7.478986796,7.576213624,7.674704401,7.774475558,7.875543741,7.977925809,8.081638845,8.18670015,8.293127252,8.400937906,8.510150099,8.62078205,8.732852217 -Pacific,dieselDolPerGal,3.243445751,3.251054873,3.382408693,3.528446757,3.651060536,3.807813356,3.927696825,3.995680912,4.009688691,4.065603033,4.101343249,4.521756311,4.558743947,4.579287352,4.687445902,4.709592956,4.737764716,4.776970093,4.805358778,4.835536163,4.862689106,4.862680176,4.873186251,4.934654494,4.953993617,4.982061655,5.033124661,5.030281012,5.071288691,5.098808029,5.121131205,5.144641353,5.221810973,5.300138137,5.379640209,5.460334813,5.542239835,5.625373432,5.709754034,5.795400344,5.882331349,5.97056632,6.060124815,6.151026687,6.243292087,6.336941468,6.43199559,6.528475524,6.626402657,6.725798697,6.826685677,6.929085963,7.033022252,7.138517586,7.24559535,7.35427928,7.464593469,7.576562371,7.690210807,7.805563969,7.922647428,8.04148714,8.162109447,8.284541088,8.408809205,8.534941343,8.662965463,8.792909945,8.924803594,9.058675648,9.194555783,9.332474119,9.472461231,9.61454815,9.758766372,9.905147868,10.05372509,10.20453096,10.35759893,10.51296291,10.67065735,10.83071721 -Pacific,CNGDolPerGge,2.035133231,1.971391229,1.845780418,1.801504832,1.822917671,1.810365148,1.823601055,1.834954245,1.834601999,1.822735306,1.800229567,2.153267354,2.124395715,2.108736174,2.153293608,2.146426303,2.134144303,2.117576286,2.116551209,2.111846925,2.103013506,2.093048063,2.084490958,2.074735421,2.070778869,2.068572349,2.067092197,2.067146894,2.072669309,2.075536435,2.079184111,2.08436921,2.086453579,2.088540033,2.090628573,2.092719201,2.09481192,2.096906732,2.099003639,2.101102643,2.103203745,2.105306949,2.107412256,2.109519668,2.111629188,2.113740817,2.115854558,2.117970413,2.120088383,2.122208471,2.12433068,2.126455011,2.128581466,2.130710047,2.132840757,2.134973598,2.137108571,2.13924568,2.141384926,2.143526311,2.145669837,2.147815507,2.149963322,2.152113286,2.154265399,2.156419664,2.158576084,2.16073466,2.162895395,2.16505829,2.167223348,2.169390572,2.171559962,2.173731522,2.175905254,2.178081159,2.18025924,2.182439499,2.184621939,2.186806561,2.188993367,2.191182361 -Pacific,dolPerKwh,0.150672214,0.156410908,0.151477968,0.152424341,0.157182143,0.157716622,0.160894392,0.165551502,0.166433204,0.166785879,0.166642172,0.168101706,0.17022279,0.170000027,0.169805519,0.17001156,0.168847535,0.167110425,0.166457958,0.165650215,0.164498935,0.163526515,0.162721866,0.16236594,0.161658025,0.160917495,0.160790916,0.160988795,0.160924186,0.16110625,0.160870938,0.160227281,0.160547736,0.160868831,0.161190569,0.16151295,0.161835976,0.162159648,0.162483967,0.162808935,0.163134553,0.163460822,0.163787744,0.164115319,0.16444355,0.164772437,0.165101982,0.165432186,0.16576305,0.166094576,0.166426765,0.166759619,0.167093138,0.167427324,0.167762179,0.168097703,0.168433899,0.168770767,0.169108308,0.169446525,0.169785418,0.170124989,0.170465239,0.170806169,0.171147781,0.171490077,0.171833057,0.172176723,0.172521077,0.172866119,0.173211851,0.173558275,0.173905391,0.174253202,0.174601709,0.174950912,0.175300814,0.175651415,0.176002718,0.176354724,0.176707433,0.177060848 -Pacific,hydrogenDolPerGGE,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 -Mountain,gasolineDolPerGal,2.726837375,2.682777123,2.669270939,2.654259869,2.625576869,2.568933657,2.595847175,2.613900597,2.652008569,2.662933081,2.702629123,2.737765991,2.75987613,2.789505481,2.84055675,2.891643082,2.929724072,2.967243667,2.977541133,3.012140106,3.056067563,3.066199656,3.089262115,3.139283102,3.165494969,3.191915727,3.235352663,3.244276793,3.306140419,3.344979511,3.377144528,3.402597547,3.42641573,3.45040064,3.474553445,3.498875319,3.523367446,3.548031018,3.572867235,3.597877306,3.623062447,3.648423884,3.673962852,3.699680592,3.725578356,3.751657404,3.777919006,3.804364439,3.83099499,3.857811955,3.884816639,3.912010355,3.939394428,3.966970189,3.99473898,4.022702153,4.050861068,4.079217095,4.107771615,4.136526016,4.165481699,4.19464007,4.224002551,4.253570569,4.283345563,4.313328982,4.343522285,4.373926941,4.404544429,4.43537624,4.466423874,4.497688841,4.529172663,4.560876871,4.59280301,4.624952631,4.657327299,4.68992859,4.72275809,4.755817397,4.789108119,4.822631876 -Mountain,dieselDolPerGal,3.072332083,2.942515556,2.942233512,2.966334811,2.965090002,2.996862792,2.988484063,3.047476426,3.054929482,3.100653451,3.130638503,3.148011017,3.184551615,3.209649201,3.252512622,3.281280753,3.310786483,3.344663538,3.367366848,3.39656924,3.427207126,3.427580803,3.451830472,3.502873009,3.525141095,3.554633774,3.603937479,3.606576156,3.640135037,3.672541841,3.695879851,3.717085845,3.73938836,3.76182469,3.784395638,3.807102012,3.829944624,3.852924292,3.876041837,3.899298088,3.922693877,3.94623004,3.96990742,3.993726865,4.017689226,4.041795361,4.066046134,4.09044241,4.114985065,4.139674975,4.164513025,4.189500103,4.214637104,4.239924927,4.265364476,4.290956663,4.316702403,4.342602617,4.368658233,4.394870182,4.421239404,4.44776684,4.474453441,4.501300162,4.528307963,4.55547781,4.582810677,4.610307541,4.637969387,4.665797203,4.693791986,4.721954738,4.750286466,4.778788185,4.807460914,4.83630568,4.865323514,4.894515455,4.923882548,4.953425843,4.983146398,5.013045277 -Mountain,CNGDolPerGge,1.686393173,1.644044319,1.632912618,1.601914765,1.572994736,1.548691477,1.530444985,1.502410653,1.467981851,1.429135503,1.381500523,1.337833033,1.300468252,1.279114356,1.268454975,1.260792705,1.251940496,1.242809271,1.246442534,1.246287067,1.245907924,1.243036036,1.241558588,1.242358572,1.245096743,1.248107366,1.253019497,1.260110093,1.270833951,1.278390303,1.285433152,1.295619955,1.285254995,1.274972955,1.264773172,1.254654986,1.244617747,1.234660805,1.224783518,1.21498525,1.205265368,1.195623245,1.186058259,1.176569793,1.167157235,1.157819977,1.148557417,1.139368958,1.130254006,1.121211974,1.112242278,1.10334434,1.094517585,1.085761445,1.077075353,1.06845875,1.05991108,1.051431791,1.043020337,1.034676174,1.026398765,1.018187575,1.010042074,1.001961738,0.993946044,0.985994475,0.97810652,0.970281668,0.962519414,0.954819259,0.947180705,0.939603259,0.932086433,0.924629742,0.917232704,0.909894842,0.902615683,0.895394758,0.8882316,0.881125747,0.874076741,0.867084127 -Mountain,dolPerKwh,0.107094662,0.11044443,0.10786374,0.107566463,0.109148317,0.108970354,0.109316891,0.109758618,0.109481919,0.107995826,0.107282134,0.106459269,0.104986837,0.104585231,0.104320627,0.104586344,0.104368389,0.104054662,0.103509759,0.102908001,0.101817765,0.101375014,0.100758687,0.100236371,0.099217712,0.098825035,0.098381874,0.097759481,0.096904853,0.096367511,0.095684081,0.094934485,0.094554747,0.094176528,0.093799822,0.093424623,0.093050924,0.09267872,0.092308005,0.091938773,0.091571018,0.091204734,0.090839915,0.090476556,0.090114649,0.089754191,0.089395174,0.089037593,0.088681443,0.088326717,0.08797341,0.087621517,0.087271031,0.086921947,0.086574259,0.086227962,0.08588305,0.085539518,0.08519736,0.08485657,0.084517144,0.084179075,0.083842359,0.08350699,0.083172962,0.08284027,0.082508909,0.082178873,0.081850158,0.081522757,0.081196666,0.080871879,0.080548392,0.080226198,0.079905293,0.079585672,0.07926733,0.07895026,0.078634459,0.078319921,0.078006642,0.077694615 -Mountain,hydrogenDolPerGGE,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 -West South Central,gasolineDolPerGal,2.611791293,2.557939888,2.531070635,2.505851748,2.468613907,2.404557794,2.419052481,2.439352851,2.474760406,2.487610199,2.527431452,2.565143774,2.587260876,2.616480154,2.66489442,2.722292251,2.759345571,2.796178685,2.806382398,2.840650627,2.884690238,2.895253792,2.918323462,2.968797544,2.99531392,3.021655722,3.068118347,3.075263918,3.138003147,3.176660453,3.208294165,3.234049953,3.256688302,3.27948512,3.302441516,3.325558607,3.348837517,3.37227938,3.395885335,3.419656533,3.443594128,3.467699287,3.491973182,3.516416995,3.541031914,3.565819137,3.590779871,3.61591533,3.641226737,3.666715324,3.692382332,3.718229008,3.744256611,3.770466407,3.796859672,3.82343769,3.850201754,3.877153166,3.904293238,3.931623291,3.959144654,3.986858666,4.014766677,4.042870044,4.071170134,4.099668325,4.128366003,4.157264565,4.186365417,4.215669975,4.245179665,4.274895923,4.304820194,4.334953936,4.365298613,4.395855703,4.426626693,4.45761308,4.488816372,4.520238086,4.551879753,4.583742911 -West South Central,dieselDolPerGal,2.985787686,2.842448334,2.816444721,2.822678934,2.804686968,2.820156069,2.793316767,2.855005507,2.862527117,2.910958041,2.939893914,2.956836426,2.99427687,3.017205759,3.058825333,3.091551273,3.121051507,3.154433029,3.177623217,3.206821076,3.23745539,3.237824808,3.262071318,3.313110282,3.335374659,3.364865552,3.41416651,3.416802164,3.450357611,3.482760706,3.505273193,3.525083258,3.542708674,3.560422218,3.578224329,3.59611545,3.614096028,3.632166508,3.65032734,3.668578977,3.686921872,3.705356481,3.723883264,3.74250268,3.761215193,3.780021269,3.798921376,3.817915983,3.837005563,3.85619059,3.875471543,3.894848901,3.914323146,3.933894761,3.953564235,3.973332056,3.993198717,4.01316471,4.033230534,4.053396686,4.07366367,4.094031988,4.114502148,4.135074659,4.155750032,4.176528782,4.197411426,4.218398483,4.239490476,4.260687928,4.281991368,4.303401325,4.324918331,4.346542923,4.368275637,4.390117016,4.412067601,4.434127939,4.456298578,4.478580071,4.500972972,4.523477837 -West South Central,CNGDolPerGge,1.483270357,1.434278775,1.334604396,1.320769659,1.329698442,1.320445598,1.332639827,1.339974561,1.336078884,1.321722407,1.298663911,1.275957918,1.249159083,1.235047003,1.229251363,1.223706426,1.213487191,1.204963418,1.204488782,1.202077632,1.198867012,1.195036199,1.191244509,1.191191486,1.190638729,1.190133334,1.190919162,1.194227077,1.199126209,1.202076988,1.204149149,1.210974627,1.202497805,1.19408032,1.185721758,1.177421706,1.169179754,1.160995495,1.152868527,1.144798447,1.136784858,1.128827364,1.120925572,1.113079093,1.10528754,1.097550527,1.089867673,1.0822386,1.074662929,1.067140289,1.059670307,1.052252615,1.044886846,1.037572639,1.03030963,1.023097463,1.01593578,1.00882423,1.00176246,0.994750123,0.987786872,0.980872364,0.974006258,0.967188214,0.960417896,0.953694971,0.947019106,0.940389972,0.933807243,0.927270592,0.920779698,0.91433424,0.9079339,0.901578363,0.895267314,0.889000443,0.88277744,0.876597998,0.870461812,0.864368579,0.858317999,0.852309773 -West South Central,dolPerKwh,0.085309168,0.087714024,0.088787245,0.089167765,0.08929998,0.090344137,0.092157008,0.093448521,0.094718519,0.09543926,0.095371293,0.094984986,0.094627047,0.094400251,0.094373044,0.094507183,0.094015422,0.093531211,0.093394011,0.09323839,0.092861152,0.092328075,0.091895939,0.091162539,0.090851918,0.090534431,0.090141935,0.089789319,0.089561134,0.089216198,0.088724259,0.088405623,0.088494028,0.088582523,0.088671105,0.088759776,0.088848536,0.088937384,0.089026322,0.089115348,0.089204464,0.089293668,0.089382962,0.089472345,0.089561817,0.089651379,0.08974103,0.089830771,0.089920602,0.090010523,0.090100533,0.090190634,0.090280824,0.090371105,0.090461476,0.090551938,0.09064249,0.090733132,0.090823865,0.090914689,0.091005604,0.091096609,0.091187706,0.091278894,0.091370173,0.091461543,0.091553004,0.091644557,0.091736202,0.091827938,0.091919766,0.092011686,0.092103697,0.092195801,0.092287997,0.092380285,0.092472665,0.092565138,0.092657703,0.092750361,0.092843111,0.092935954 -West South Central,hydrogenDolPerGGE,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 -East South Central,gasolineDolPerGal,2.636269238,2.577522194,2.548280286,2.518140892,2.475542008,2.405744246,2.416299717,2.43729291,2.47207976,2.484995454,2.52391835,2.561827626,2.583268692,2.612245383,2.660245596,2.716550603,2.754864233,2.790179528,2.801352348,2.835675907,2.879483625,2.889570459,2.912729157,2.962406717,2.988510408,3.014792527,3.060174886,3.06655216,3.131411759,3.169524083,3.201053971,3.225628156,3.248207553,3.270945006,3.293841621,3.316898512,3.340116802,3.363497619,3.387042103,3.410751397,3.434626657,3.458669044,3.482879727,3.507259885,3.531810704,3.556533379,3.581429113,3.606499117,3.63174461,3.657166823,3.68276699,3.708546359,3.734506184,3.760647727,3.786972261,3.813481067,3.840175435,3.867056663,3.894126059,3.921384942,3.948834636,3.976476479,4.004311814,4.032341997,4.060568391,4.088992369,4.117615316,4.146438623,4.175463694,4.204691939,4.234124783,4.263763657,4.293610002,4.323665272,4.353930929,4.384408446,4.415099305,4.446005,4.477127035,4.508466924,4.540026193,4.571806376 -East South Central,dieselDolPerGal,2.991196925,2.858675228,2.838558666,2.852262558,2.840096646,2.866277069,2.859075694,2.910525153,2.917020115,2.96294466,2.991723094,3.008487148,3.045023488,3.070117227,3.123119503,3.148047286,3.181385533,3.215259566,3.237959853,3.267158948,3.297794362,3.297204997,3.32241235,3.373404056,3.39571789,3.42211194,3.474510839,3.47708742,3.510703589,3.543107783,3.566443594,3.58764739,3.609173274,3.630828314,3.652613284,3.674528963,3.696576137,3.718755594,3.741068127,3.763514536,3.786095623,3.808812197,3.83166507,3.854655061,3.877782991,3.901049689,3.924455987,3.948002723,3.97169074,3.995520884,4.019494009,4.043610973,4.067872639,4.092279875,4.116833554,4.141534556,4.166383763,4.191382065,4.216530358,4.24182954,4.267280517,4.2928842,4.318641506,4.344553355,4.370620675,4.396844399,4.423225465,4.449764818,4.476463407,4.503322187,4.53034212,4.557524173,4.584869318,4.612378534,4.640052805,4.667893122,4.695900481,4.724075884,4.752420339,4.780934861,4.80962047,4.838478193 -East South Central,CNGDolPerGge,1.640487374,1.601096377,1.569352079,1.55204109,1.545049334,1.535638707,1.540198592,1.538174693,1.523307415,1.497164037,1.461238739,1.425656677,1.39018491,1.368207731,1.35561158,1.345221306,1.331115661,1.317416056,1.312614734,1.307314065,1.302086625,1.297671395,1.294174295,1.293947658,1.293912395,1.293384735,1.295898843,1.299794649,1.306023485,1.309247232,1.311892354,1.317791209,1.308566671,1.299406704,1.290310857,1.281278681,1.272309731,1.263403562,1.254559738,1.245777819,1.237057375,1.228397973,1.219799187,1.211260593,1.202781769,1.194362296,1.18600176,1.177699748,1.16945585,1.161269659,1.153140771,1.145068786,1.137053304,1.129093931,1.121190274,1.113341942,1.105548548,1.097809708,1.09012504,1.082494165,1.074916706,1.067392289,1.059920543,1.052501099,1.045133591,1.037817656,1.030552933,1.023339062,1.016175689,1.009062459,1.001999022,0.994985029,0.988020133,0.981103992,0.974236264,0.967416611,0.960644694,0.953920181,0.94724274,0.940612041,0.934027757,0.927489562 -East South Central,dolPerKwh,0.117124932,0.124191051,0.117192213,0.11594654,0.11540425,0.1152847,0.115845043,0.115944847,0.116025377,0.115497589,0.114946281,0.113303485,0.111858633,0.110604446,0.10994101,0.109023906,0.107699572,0.10623969,0.105181045,0.10437295,0.103457494,0.102877525,0.102209302,0.100867516,0.099205763,0.098406038,0.097760307,0.097339989,0.096955412,0.096470192,0.095762632,0.095027561,0.094362368,0.093701831,0.093045918,0.092394597,0.091747835,0.0911056,0.090467861,0.089834586,0.089205744,0.088581304,0.087961234,0.087345506,0.086734087,0.086126949,0.08552406,0.084925392,0.084330914,0.083740597,0.083154413,0.082572332,0.081994326,0.081420366,0.080850423,0.08028447,0.079722479,0.079164422,0.078610271,0.078059999,0.077513579,0.076970984,0.076432187,0.075897161,0.075365881,0.07483832,0.074314452,0.073794251,0.073277691,0.072764747,0.072255394,0.071749606,0.071247359,0.070748627,0.070253387,0.069761613,0.069273282,0.068788369,0.06830685,0.067828703,0.067353902,0.066882424 -East South Central,hydrogenDolPerGGE,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 -South Atlantic,gasolineDolPerGal,2.685224881,2.668090331,2.676945204,2.686008969,2.681991046,2.652864028,2.697011566,2.718255553,2.755400884,2.767119432,2.806462846,2.843463073,2.865762955,2.895880589,2.943239955,2.99539872,3.028244001,3.06723889,3.0749471,3.109372991,3.153054752,3.16330099,3.186081819,3.236319158,3.262572056,3.288908388,3.334600229,3.341233892,3.405316739,3.446263144,3.476214288,3.500596367,3.532101734,3.56389065,3.595965666,3.628329357,3.660984321,3.69393318,3.727178579,3.760723186,3.794569694,3.828720822,3.863179309,3.897947923,3.933029454,3.968426719,4.00414256,4.040179843,4.076541461,4.113230335,4.150249408,4.187601652,4.225290067,4.263317678,4.301687537,4.340402725,4.379466349,4.418881546,4.45865148,4.498779344,4.539268358,4.580121773,4.621342869,4.662934955,4.704901369,4.747245482,4.789970691,4.833080427,4.876578151,4.920467354,4.964751561,5.009434325,5.054519233,5.100009907,5.145909996,5.192223186,5.238953194,5.286103773,5.333678707,5.381681815,5.430116952,5.478988004 -South Atlantic,dieselDolPerGal,3.007423819,2.893833911,2.895806977,2.931599948,2.94152339,2.989793441,3.00468087,3.056128544,3.062622543,3.108545989,3.137323187,3.15408628,3.190621383,3.215714022,3.258572636,3.287335546,3.31683633,3.350709676,3.373409139,3.402607547,3.433242136,3.433612103,3.457858751,3.50889799,3.531162917,3.560653534,3.609955042,3.612590834,3.646146692,3.678549925,3.701885324,3.723088295,3.749149913,3.775393963,3.80182172,3.828434473,3.855233514,3.882220148,3.909395689,3.936761459,3.964318789,3.992069021,4.020013504,4.048153599,4.076490674,4.105026109,4.133761291,4.16269762,4.191836504,4.221179359,4.250727615,4.280482708,4.310446087,4.34061921,4.371003544,4.401600569,4.432411773,4.463438655,4.494682726,4.526145505,4.557828524,4.589733323,4.621861456,4.654214487,4.686793988,4.719601546,4.752638757,4.785907228,4.819408579,4.853144439,4.88711645,4.921326265,4.955775549,4.990465978,5.025399239,5.060577034,5.096001073,5.131673081,5.167594792,5.203767956,5.240194332,5.276875692 -South Atlantic,CNGDolPerGge,1.497027746,1.457586815,1.428943229,1.392329141,1.389529067,1.383076683,1.387417911,1.388401418,1.382046458,1.366478936,1.345278319,1.319005343,1.298105364,1.286868645,1.283066789,1.279504953,1.271302282,1.264459944,1.263048131,1.260651266,1.259262362,1.258226088,1.257250818,1.258797377,1.258648989,1.259126972,1.261507106,1.265814872,1.272216035,1.275580062,1.278650144,1.285075501,1.278650124,1.272256873,1.265895589,1.259566111,1.25326828,1.247001939,1.240766929,1.234563095,1.228390279,1.222248328,1.216137086,1.210056401,1.204006119,1.197986088,1.191996158,1.186036177,1.180105996,1.174205466,1.168334439,1.162492766,1.156680303,1.150896901,1.145142417,1.139416705,1.133719621,1.128051023,1.122410768,1.116798714,1.11121472,1.105658647,1.100130354,1.094629702,1.089156553,1.083710771,1.078292217,1.072900756,1.067536252,1.062198571,1.056887578,1.05160314,1.046345124,1.041113398,1.035907831,1.030728292,1.025574651,1.020446778,1.015344544,1.010267821,1.005216482,1.000190399 -South Atlantic,dolPerKwh,0.101373973,0.107040217,0.109520457,0.112160155,0.11383459,0.115633212,0.117311306,0.118388542,0.11856035,0.118285196,0.11802078,0.11741978,0.116495049,0.115790011,0.115512424,0.115169487,0.114368367,0.113560975,0.11285841,0.112423373,0.111871414,0.111184923,0.110203134,0.109284924,0.108383374,0.107762069,0.107195271,0.106548384,0.105840052,0.105142831,0.10417183,0.103304039,0.103407343,0.10351075,0.103614261,0.103717875,0.103821593,0.103925415,0.10402934,0.10413337,0.104237503,0.10434174,0.104446082,0.104550528,0.104655079,0.104759734,0.104864494,0.104969358,0.105074327,0.105179402,0.105284581,0.105389866,0.105495256,0.105600751,0.105706352,0.105812058,0.10591787,0.106023788,0.106129812,0.106235942,0.106342177,0.10644852,0.106554968,0.106661523,0.106768185,0.106874953,0.106981828,0.10708881,0.107195898,0.107303094,0.107410397,0.107517808,0.107625326,0.107732951,0.107840684,0.107948525,0.108056473,0.10816453,0.108272694,0.108380967,0.108489348,0.108597837 -South Atlantic,hydrogenDolPerGGE,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 -West North Central,gasolineDolPerGal,2.675433727,2.624030079,2.601625379,2.579012906,2.543572525,2.482942103,2.495555028,2.516823012,2.553960262,2.565623105,2.604855732,2.641823506,2.664052265,2.694144908,2.741491466,2.793580103,2.8264224,2.865460808,2.873056117,2.907475543,2.951174836,2.961479887,2.984325745,3.034397588,3.060685799,3.086959463,3.132433958,3.139162617,3.203374529,3.244310738,3.274270585,3.298578558,3.321668608,3.344920288,3.36833473,3.391913073,3.415656465,3.43956606,3.463643022,3.487888524,3.512303743,3.53688987,3.561648099,3.586579635,3.611685693,3.636967493,3.662426265,3.688063249,3.713879692,3.739876849,3.766055987,3.792418379,3.818965308,3.845698065,3.872617952,3.899726277,3.927024361,3.954513532,3.982195126,4.010070492,4.038140986,4.066407973,4.094872828,4.123536938,4.152401697,4.181468509,4.210738788,4.24021396,4.269895458,4.299784726,4.329883219,4.360192401,4.390713748,4.421448744,4.452398886,4.483565678,4.514950638,4.546555292,4.578381179,4.610429847,4.642702856,4.675201776 -West North Central,dieselDolPerGal,2.977674101,2.839743577,2.813557247,2.821190823,2.802955143,2.823065661,2.80979342,2.861241918,2.867735643,2.913659364,2.942436699,2.959199929,2.995735306,3.020827946,3.073829399,3.098756082,3.132093642,3.165966851,3.188666314,3.217864997,3.248499586,3.247909535,3.273116338,3.324107769,3.346420916,3.372814279,3.425212904,3.42778921,3.461404692,3.493808199,3.517143323,3.538346844,3.559576925,3.580934387,3.602419993,3.624034513,3.64577872,3.667653392,3.689659313,3.711797269,3.734068052,3.756472461,3.779011295,3.801685363,3.824495475,3.847442448,3.870527103,3.893750265,3.917112767,3.940615444,3.964259136,3.988044691,4.011972959,4.036044797,4.060261066,4.084622632,4.109130368,4.13378515,4.158587861,4.183539388,4.208640625,4.233892468,4.259295823,4.284851598,4.310560708,4.336424072,4.362442616,4.388617272,4.414948976,4.441438669,4.468087302,4.494895825,4.5218652,4.548996391,4.57629037,4.603748112,4.631370601,4.659158824,4.687113777,4.71523646,4.743527879,4.771989046 -West North Central,CNGDolPerGge,1.649550646,1.606923934,1.593430117,1.566266811,1.537348712,1.512075201,1.490232641,1.461420203,1.42315634,1.380524737,1.331611661,1.286068404,1.247926932,1.225376663,1.21586385,1.207867223,1.196954308,1.187108811,1.187057718,1.186114365,1.184395736,1.182745318,1.182056657,1.184262663,1.187309965,1.19051518,1.195398482,1.20281005,1.212942542,1.220523219,1.227582927,1.238018245,1.226876081,1.215834196,1.204891688,1.194047663,1.183301234,1.172651523,1.162097659,1.15163878,1.141274031,1.131002565,1.120823542,1.11073613,1.100739505,1.090832849,1.081015354,1.071286215,1.06164464,1.052089838,1.042621029,1.03323744,1.023938303,1.014722858,1.005590353,0.996540039,0.987571179,0.978683038,0.969874891,0.961146017,0.952495703,0.943923242,0.935427932,0.927009081,0.918665999,0.910398005,0.902204423,0.894084583,0.886037822,0.878063482,0.87016091,0.862329462,0.854568497,0.846877381,0.839255484,0.831702185,0.824216865,0.816798913,0.809447723,0.802162694,0.794943229,0.78778874 -West North Central,dolPerKwh,0.116989387,0.126164241,0.129240654,0.131095683,0.132694202,0.133290896,0.133071685,0.132433457,0.132058225,0.131557419,0.130635527,0.129879234,0.129782032,0.129245431,0.128141539,0.127138899,0.126162484,0.125086329,0.123742086,0.12223765,0.120744286,0.119383229,0.117771724,0.116337521,0.114657278,0.11342716,0.112523359,0.111621082,0.110660519,0.109581007,0.108200672,0.106922369,0.106601602,0.106281798,0.105962952,0.105645063,0.105328128,0.105012144,0.104697107,0.104383016,0.104069867,0.103757657,0.103446384,0.103136045,0.102826637,0.102518157,0.102210603,0.101903971,0.101598259,0.101293464,0.100989584,0.100686615,0.100384555,0.100083402,0.099783151,0.099483802,0.09918535,0.098887794,0.098591131,0.098295358,0.098000472,0.09770647,0.097413351,0.097121111,0.096829747,0.096539258,0.09624964,0.095960891,0.095673009,0.09538599,0.095099832,0.094814532,0.094530089,0.094246498,0.093963759,0.093681868,0.093400822,0.09312062,0.092841258,0.092562734,0.092285046,0.092008191 -West North Central,hydrogenDolPerGGE,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 -East North Central,gasolineDolPerGal,2.73173289,2.699911548,2.699290346,2.698849063,2.685333305,2.646981254,2.681624367,2.70254308,2.73993075,2.751450851,2.790772133,2.827607485,2.850055704,2.880096248,2.927841192,2.980005676,3.012798486,3.051885884,3.05948169,3.09390609,3.137604512,3.14802035,3.170766488,3.221004075,3.247364404,3.273670396,3.319243244,3.326242219,3.389954283,3.4308655,3.46085693,3.485426017,3.513309425,3.5414159,3.569747227,3.598305205,3.627091647,3.65610838,3.685357247,3.714840105,3.744558826,3.774515297,3.804711419,3.83514911,3.865830303,3.896756946,3.927931001,3.959354449,3.991029285,4.022957519,4.055141179,4.087582309,4.120282967,4.153245231,4.186471193,4.219962962,4.253722666,4.287752447,4.322054467,4.356630903,4.39148395,4.426615821,4.462028748,4.497724978,4.533706778,4.569976432,4.606536243,4.643388533,4.680535642,4.717979927,4.755723766,4.793769556,4.832119713,4.870776671,4.909742884,4.949020827,4.988612994,5.028521898,5.068750073,5.109300073,5.150174474,5.19137587 -East North Central,dieselDolPerGal,2.983083066,2.880311362,2.888997001,2.931502545,2.948138697,3.003121459,3.024721186,3.076168585,3.08266176,3.128584657,3.157361168,3.174123711,3.210658539,3.235750629,3.288751395,3.313677529,3.347014265,3.380887061,3.403586249,3.432784108,3.463418422,3.462827821,3.48803435,3.539024682,3.561337692,3.587731192,3.640129542,3.642705024,3.676320368,3.708723601,3.73205845,3.753261147,3.779533975,3.805990713,3.832632648,3.859461076,3.886477304,3.913682645,3.941078423,3.968665972,3.996446634,4.024421761,4.052592713,4.080960862,4.109527588,4.138294281,4.167262341,4.196433177,4.22580821,4.255388867,4.285176589,4.315172825,4.345379035,4.375796688,4.406427265,4.437272256,4.468333162,4.499611494,4.531108774,4.562826536,4.594766322,4.626929686,4.659318194,4.691933421,4.724776955,4.757850394,4.791155346,4.824693434,4.858466288,4.892475552,4.926722881,4.961209941,4.995938411,5.030909979,5.066126349,5.101589234,5.137300358,5.173261461,5.209474291,5.245940611,5.282662195,5.319640831 -East North Central,CNGDolPerGge,1.893848337,1.844271953,1.814584757,1.785632811,1.761887971,1.737227704,1.71895277,1.690751131,1.651778145,1.60490454,1.550581402,1.499677116,1.454209918,1.424187337,1.405902236,1.390848346,1.374144553,1.358608562,1.353700549,1.348487394,1.343659174,1.339169558,1.336050442,1.335914795,1.33651118,1.33702404,1.340309561,1.345702507,1.353963993,1.359500565,1.365218214,1.373772488,1.360034763,1.346434415,1.332970071,1.319640371,1.306443967,1.293379527,1.280445732,1.267641275,1.254964862,1.242415213,1.229991061,1.21769115,1.205514239,1.193459097,1.181524506,1.169709261,1.158012168,1.146432046,1.134967726,1.123618049,1.112381868,1.101258049,1.090245469,1.079343014,1.068549584,1.057864088,1.047285447,1.036812593,1.026444467,1.016180022,1.006018222,0.99595804,0.985998459,0.976138475,0.96637709,0.956713319,0.947146186,0.937674724,0.928297977,0.919014997,0.909824847,0.900726599,0.891719333,0.882802139,0.873974118,0.865234377,0.856582033,0.848016213,0.839536051,0.83114069 -East North Central,dolPerKwh,0.103134807,0.108602087,0.110742414,0.1132881,0.114182529,0.115055755,0.116505019,0.116935917,0.117021419,0.116733978,0.116547127,0.116355093,0.114825493,0.114655678,0.114498289,0.114086082,0.113049117,0.112213296,0.111489871,0.11089665,0.110153881,0.109447737,0.108816149,0.108232199,0.107407969,0.106745826,0.106394932,0.106008315,0.105632562,0.10515003,0.104360858,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449 -East North Central,hydrogenDolPerGGE,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 -Middle Atlantic,gasolineDolPerGal,2.86146564,2.817405637,2.799718272,2.789098517,2.767284307,2.719621801,2.745851697,2.76473198,2.801776845,2.814345754,2.856107456,2.892910231,2.916863337,2.946792224,2.995921196,3.049940088,3.081193941,3.120142452,3.129458999,3.164429375,3.207723569,3.219363658,3.240525207,3.293330415,3.320784563,3.347138923,3.394165306,3.403123008,3.462660357,3.505582028,3.535532674,3.564370104,3.589320695,3.61444594,3.639747062,3.665225291,3.690881868,3.716718041,3.742735067,3.768934213,3.795316752,3.82188397,3.848637157,3.875577618,3.902706661,3.930025608,3.957535787,3.985238537,4.013135207,4.041227154,4.069515744,4.098002354,4.12668837,4.155575189,4.184664215,4.213956865,4.243454563,4.273158745,4.303070856,4.333192352,4.363524698,4.394069371,4.424827857,4.455801652,4.486992263,4.518401209,4.550030018,4.581880228,4.613953389,4.646251063,4.678774821,4.711526244,4.744506928,4.777718477,4.811162506,4.844840643,4.878754528,4.91290581,4.94729615,4.981927223,5.016800714,5.051918319 -Middle Atlantic,dieselDolPerGal,3.112900143,2.988492168,2.984955981,3.015239287,3.019653476,3.062413862,3.071792863,3.123241772,3.129736871,3.175661416,3.204439988,3.221204042,3.257740656,3.28283467,3.325694382,3.354458529,3.383960687,3.417834582,3.440534732,3.469733964,3.500368966,3.500739482,3.524987091,3.576027293,3.598293043,3.627784897,3.677087229,3.679723845,3.713280666,3.745684722,3.769020946,3.790224741,3.81296609,3.835843886,3.85885895,3.882012103,3.905304176,3.928736001,3.952308417,3.976022268,3.999878401,4.023877672,4.048020938,4.072309063,4.096742918,4.121323375,4.146051315,4.170927623,4.195953189,4.221128908,4.246455682,4.271934416,4.297566022,4.323351418,4.349291527,4.375387276,4.4016396,4.428049437,4.454617734,4.48134544,4.508233513,4.535282914,4.562494611,4.589869579,4.617408797,4.645113249,4.672983929,4.701021832,4.729227963,4.757603331,4.786148951,4.814865845,4.84375504,4.87281757,4.902054476,4.931466803,4.961055603,4.990821937,5.020766869,5.05089147,5.081196819,5.111684 -Middle Atlantic,CNGDolPerGge,2.351693736,2.294616211,2.27253363,2.219200691,2.15320841,2.124736893,2.11301743,2.089997286,2.070697404,2.032782827,1.985930199,1.944026897,1.915041489,1.889570942,1.882080097,1.870963711,1.852771787,1.830948917,1.830157942,1.823911345,1.814495956,1.804292808,1.806041938,1.803654983,1.800391468,1.793929432,1.797600789,1.800654655,1.80751604,1.805008753,1.81698767,1.820511926,1.805947831,1.791500248,1.777168246,1.7629509,1.748847293,1.734856515,1.720977662,1.707209841,1.693552162,1.680003745,1.666563715,1.653231205,1.640005356,1.626885313,1.61387023,1.600959269,1.588151594,1.575446382,1.562842811,1.550340068,1.537937348,1.525633849,1.513428778,1.501321348,1.489310777,1.477396291,1.465577121,1.453852504,1.442221684,1.43068391,1.419238439,1.407884531,1.396621455,1.385448483,1.374364896,1.363369976,1.352463017,1.341643312,1.330910166,1.320262885,1.309700782,1.299223175,1.28882939,1.278518755,1.268290605,1.25814428,1.248079126,1.238094493,1.228189737,1.218364219 -Middle Atlantic,dolPerKwh,0.158978759,0.159764467,0.162082573,0.163773216,0.164656852,0.168078747,0.172857007,0.17546556,0.178654367,0.176466757,0.174183637,0.168720408,0.167194677,0.167355942,0.16933367,0.16968122,0.167516361,0.167019563,0.168023534,0.169344306,0.169583927,0.168821918,0.168257751,0.167712418,0.166754161,0.16602546,0.165365132,0.164604792,0.163927582,0.162613276,0.161193222,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534 -Middle Atlantic,hydrogenDolPerGGE,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 -New England,gasolineDolPerGal,2.86146564,2.817405637,2.799718272,2.789098517,2.767284307,2.719621801,2.745851697,2.76473198,2.801776845,2.814345754,2.856107456,2.892910231,2.916863337,2.946792224,2.995921196,3.049940088,3.081193941,3.120142452,3.129458999,3.164429375,3.207723569,3.219363658,3.240525207,3.293330415,3.320784563,3.347138923,3.394165306,3.403123008,3.462660357,3.505582028,3.535532674,3.564370104,3.589320695,3.61444594,3.639747062,3.665225291,3.690881868,3.716718041,3.742735067,3.768934213,3.795316752,3.82188397,3.848637157,3.875577618,3.902706661,3.930025608,3.957535787,3.985238537,4.013135207,4.041227154,4.069515744,4.098002354,4.12668837,4.155575189,4.184664215,4.213956865,4.243454563,4.273158745,4.303070856,4.333192352,4.363524698,4.394069371,4.424827857,4.455801652,4.486992263,4.518401209,4.550030018,4.581880228,4.613953389,4.646251063,4.678774821,4.711526244,4.744506928,4.777718477,4.811162506,4.844840643,4.878754528,4.91290581,4.94729615,4.981927223,5.016800714,5.051918319 -New England,dieselDolPerGal,3.112900143,2.988492168,2.984955981,3.015239287,3.019653476,3.062413862,3.071792863,3.123241772,3.129736871,3.175661416,3.204439988,3.221204042,3.257740656,3.28283467,3.325694382,3.354458529,3.383960687,3.417834582,3.440534732,3.469733964,3.500368966,3.500739482,3.524987091,3.576027293,3.598293043,3.627784897,3.677087229,3.679723845,3.713280666,3.745684722,3.769020946,3.790224741,3.81296609,3.835843886,3.85885895,3.882012103,3.905304176,3.928736001,3.952308417,3.976022268,3.999878401,4.023877672,4.048020938,4.072309063,4.096742918,4.121323375,4.146051315,4.170927623,4.195953189,4.221128908,4.246455682,4.271934416,4.297566022,4.323351418,4.349291527,4.375387276,4.4016396,4.428049437,4.454617734,4.48134544,4.508233513,4.535282914,4.562494611,4.589869579,4.617408797,4.645113249,4.672983929,4.701021832,4.729227963,4.757603331,4.786148951,4.814865845,4.84375504,4.87281757,4.902054476,4.931466803,4.961055603,4.990821937,5.020766869,5.05089147,5.081196819,5.111684 -New England,CNGDolPerGge,2.351693736,2.294616211,2.27253363,2.219200691,2.15320841,2.124736893,2.11301743,2.089997286,2.070697404,2.032782827,1.985930199,1.944026897,1.915041489,1.889570942,1.882080097,1.870963711,1.852771787,1.830948917,1.830157942,1.823911345,1.814495956,1.804292808,1.806041938,1.803654983,1.800391468,1.793929432,1.797600789,1.800654655,1.80751604,1.805008753,1.81698767,1.820511926,1.805947831,1.791500248,1.777168246,1.7629509,1.748847293,1.734856515,1.720977662,1.707209841,1.693552162,1.680003745,1.666563715,1.653231205,1.640005356,1.626885313,1.61387023,1.600959269,1.588151594,1.575446382,1.562842811,1.550340068,1.537937348,1.525633849,1.513428778,1.501321348,1.489310777,1.477396291,1.465577121,1.453852504,1.442221684,1.43068391,1.419238439,1.407884531,1.396621455,1.385448483,1.374364896,1.363369976,1.352463017,1.341643312,1.330910166,1.320262885,1.309700782,1.299223175,1.28882939,1.278518755,1.268290605,1.25814428,1.248079126,1.238094493,1.228189737,1.218364219 -New England,dolPerKwh,0.158978759,0.159764467,0.162082573,0.163773216,0.164656852,0.168078747,0.172857007,0.17546556,0.178654367,0.176466757,0.174183637,0.168720408,0.167194677,0.167355942,0.16933367,0.16968122,0.167516361,0.167019563,0.168023534,0.169344306,0.169583927,0.168821918,0.168257751,0.167712418,0.166754161,0.16602546,0.165365132,0.164604792,0.163927582,0.162613276,0.161193222,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534 -New England,hydrogenDolPerGGE,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 -United States,gasolineDolPerGal,2.667821,2.264015,2.364008242,2.408478992,2.470851717,2.477406536,2.52038644,2.542343964,2.571508831,2.636365735,2.680501109,2.80991093,2.822286914,2.880193865,2.902126278,2.940984717,2.963479835,3.001434037,3.03318413,3.073175704,3.078134403,3.131155572,3.160495733,3.180246144,3.199836594,3.211347818,3.191514951,3.234819367,3.248566436,3.260913326,3.255028899,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911 -United States,dieselDolPerGal,3.039967,2.54226434,2.53451309,2.641683529,2.860466274,2.953921224,3.02171182,3.080664452,3.133726356,3.186095454,3.217255657,3.321468041,3.356468708,3.397352336,3.415903045,3.429954603,3.447986574,3.455369159,3.49196238,3.518546316,3.518305949,3.571702259,3.603483144,3.622593647,3.656593732,3.664521408,3.658496419,3.700617112,3.715860658,3.717653772,3.734692928,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117 -United States,CNGDolPerGge,1.757059748,1.596670639,1.662486523,1.730404768,1.676432291,1.621196434,1.592654006,1.575481017,1.550704191,1.527387791,1.504877982,1.565030556,1.532027097,1.522463836,1.507077885,1.490006856,1.47372573,1.458578297,1.444121508,1.437653694,1.426245483,1.420844003,1.411825135,1.404271111,1.396583227,1.390730846,1.387044505,1.384736631,1.384551485,1.385708244,1.389791869,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041 -United States,dolPerKwh,0.12559407,0.237768062,0.248335114,0.243064981,0.238469355,0.234950988,0.234850111,0.236372996,0.236993353,0.237516511,0.238341925,0.23778225,0.23869352,0.238513536,0.239940485,0.24032322,0.239657959,0.238971993,0.23839753,0.237476419,0.236390466,0.235611697,0.234708049,0.233772205,0.231685427,0.230476937,0.229402825,0.22803851,0.226933081,0.226073641,0.225022077,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733 -United States,hydrogenDolPerGGE,13.39552294,9.273823571,8.861653634,8.449483698,8.037313761,7.625143825,7.212973888,6.800803952,6.388634016,5.976464079,5.564294143,5.152124206,5.049081722,4.946039238,4.842996754,4.73995427,4.636911785,4.533869301,4.430826817,4.327784333,4.224741849,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365 -United States T2CO,dieselDolPerGal,3.039967,2.54226434,2.53451309,2.641683529,2.860466274,2.953921224,3.02171182,3.080664452,3.133726356,3.186095454,3.217255657,3.321468041,3.356468708,3.397352336,3.415903045,3.429954603,3.447986574,3.455369159,3.49196238,3.518546316,3.518305949,3.571702259,3.603483144,3.622593647,3.656593732,3.664521408,3.658496419,3.700617112,3.715860658,3.717653772,3.734692928,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117 -United States T2CO,dolPerKwh,0.12559407,0.237768062,0.248335114,0.243064981,0.238469355,0.234950988,0.234850111,0.236372996,0.236993353,0.237516511,0.238341925,0.23778225,0.23869352,0.238513536,0.239940485,0.24032322,0.239657959,0.238971993,0.23839753,0.237476419,0.236390466,0.235611697,0.234708049,0.233772205,0.231685427,0.230476937,0.229402825,0.22803851,0.226933081,0.226073641,0.225022077,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733 -United States,E85DolPerGal,2.32936,2.109573042,2.218314415,2.380242902,2.406835909,2.407755842,2.446034317,2.463548197,2.492887278,2.561266705,2.607134725,2.718891722,2.733425136,2.791238359,2.815604855,2.857284898,2.881304417,2.921253075,2.954474725,2.995722748,3.002051593,3.055770593,3.086220626,3.107088995,3.126842205,3.138940662,3.120333161,3.164428427,3.178800072,3.192253787,3.187126945,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881 -FY21TechSuccess,gasolineDolPerGal,2.667821,2.264015,2.364008242,2.408478992,2.470851717,2.477406536,2.52038644,2.542343964,2.571508831,2.636365735,2.680501109,2.80991093,2.822286914,2.880193865,2.902126278,2.940984717,2.963479835,3.001434037,3.03318413,3.073175704,3.078134403,3.131155572,3.160495733,3.180246144,3.199836594,3.211347818,3.191514951,3.234819367,3.248566436,3.260913326,3.255028899,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911 -FY21TechSuccess,dieselDolPerGal,3.039967,2.54226434,2.53451309,2.641683529,2.860466274,2.953921224,3.02171182,3.080664452,3.133726356,3.186095454,3.217255657,3.321468041,3.356468708,3.397352336,3.415903045,3.429954603,3.447986574,3.455369159,3.49196238,3.518546316,3.518305949,3.571702259,3.603483144,3.622593647,3.656593732,3.664521408,3.658496419,3.700617112,3.715860658,3.717653772,3.734692928,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117 -FY21TechSuccess,CNGDolPerGge,1.757059748,1.596670639,1.662486523,1.730404768,1.676432291,1.621196434,1.592654006,1.575481017,1.550704191,1.527387791,1.504877982,1.565030556,1.532027097,1.522463836,1.507077885,1.490006856,1.47372573,1.458578297,1.444121508,1.437653694,1.426245483,1.420844003,1.411825135,1.404271111,1.396583227,1.390730846,1.387044505,1.384736631,1.384551485,1.385708244,1.389791869,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041 -FY21TechSuccess,dolPerKwh,0.12559407,0.237768062,0.248335114,0.243064981,0.238469355,0.234950988,0.234850111,0.236372996,0.236993353,0.237516511,0.238341925,0.23778225,0.23869352,0.238513536,0.239940485,0.24032322,0.239657959,0.238971993,0.23839753,0.237476419,0.236390466,0.235611697,0.234708049,0.233772205,0.231685427,0.230476937,0.229402825,0.22803851,0.226933081,0.226073641,0.225022077,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733 -FY21TechSuccess,hydrogenDolPerGGE,13.39552294,9.273823571,8.861653634,8.449483698,8.037313761,7.625143825,7.212973888,6.594718984,5.976464079,5.358209174,4.73995427,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365 -FY21TechSuccess,E85DolPerGal,2.32936,2.109573042,2.218314415,2.380242902,2.406835909,2.407755842,2.446034317,2.463548197,2.492887278,2.561266705,2.607134725,2.718891722,2.733425136,2.791238359,2.815604855,2.857284898,2.881304417,2.921253075,2.954474725,2.995722748,3.002051593,3.055770593,3.086220626,3.107088995,3.126842205,3.138940662,3.120333161,3.164428427,3.178800072,3.192253787,3.187126945,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881 -FY21NoProgram,gasolineDolPerGal,2.667821,2.264015,2.364008242,2.408478992,2.470851717,2.477406536,2.52038644,2.542343964,2.571508831,2.636365735,2.680501109,2.80991093,2.822286914,2.880193865,2.902126278,2.940984717,2.963479835,3.001434037,3.03318413,3.073175704,3.078134403,3.131155572,3.160495733,3.180246144,3.199836594,3.211347818,3.191514951,3.234819367,3.248566436,3.260913326,3.255028899,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911 -FY21NoProgram,dieselDolPerGal,3.039967,2.54226434,2.53451309,2.641683529,2.860466274,2.953921224,3.02171182,3.080664452,3.133726356,3.186095454,3.217255657,3.321468041,3.356468708,3.397352336,3.415903045,3.429954603,3.447986574,3.455369159,3.49196238,3.518546316,3.518305949,3.571702259,3.603483144,3.622593647,3.656593732,3.664521408,3.658496419,3.700617112,3.715860658,3.717653772,3.734692928,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117 -FY21NoProgram,CNGDolPerGge,1.757059748,1.596670639,1.662486523,1.730404768,1.676432291,1.621196434,1.592654006,1.575481017,1.550704191,1.527387791,1.504877982,1.565030556,1.532027097,1.522463836,1.507077885,1.490006856,1.47372573,1.458578297,1.444121508,1.437653694,1.426245483,1.420844003,1.411825135,1.404271111,1.396583227,1.390730846,1.387044505,1.384736631,1.384551485,1.385708244,1.389791869,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041 -FY21NoProgram,dolPerKwh,0.12559407,0.237768062,0.248335114,0.243064981,0.238469355,0.234950988,0.234850111,0.236372996,0.236993353,0.237516511,0.238341925,0.23778225,0.23869352,0.238513536,0.239940485,0.24032322,0.239657959,0.238971993,0.23839753,0.237476419,0.236390466,0.235611697,0.234708049,0.233772205,0.231685427,0.230476937,0.229402825,0.22803851,0.226933081,0.226073641,0.225022077,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733 -FY21NoProgram,hydrogenDolPerGGE,13.39552294,9.273823571,9.067738603,8.861653634,8.655568666,8.449483698,8.24339873,8.037313761,7.831228793,7.625143825,7.419058857,7.212973888,7.00688892,6.800803952,6.594718984,6.388634016,6.182549047,5.976464079,5.770379111,5.564294143,5.358209174,5.152124206,5.049081722,4.946039238,4.842996754,4.73995427,4.636911785,4.533869301,4.430826817,4.327784333,4.224741849,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365 -FY21NoProgram,E85DolPerGal,2.32936,2.109573042,2.218314415,2.380242902,2.406835909,2.407755842,2.446034317,2.463548197,2.492887278,2.561266705,2.607134725,2.718891722,2.733425136,2.791238359,2.815604855,2.857284898,2.881304417,2.921253075,2.954474725,2.995722748,3.002051593,3.055770593,3.086220626,3.107088995,3.126842205,3.138940662,3.120333161,3.164428427,3.178800072,3.192253787,3.187126945,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881 -FY22NoProgram,gasolineDolPerGal,2.667821,2.264015,3.232355936,3.099445486,2.77340515,2.755122396,2.727299852,2.756087319,2.789028144,2.819176133,2.840333894,2.910524364,3.003742657,3.034235342,3.05936961,3.083085073,3.094689786,3.1166894,3.136223364,3.170620765,3.172299969,3.19721186,3.217466984,3.222593269,3.254573924,3.285350895,3.295881123,3.322274731,3.33250779,3.323551956,3.325518197,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202 -FY22NoProgram,dieselDolPerGal,3.039967,2.54226434,3.288893791,3.163300386,3.051355061,3.159781567,3.156189792,3.152807315,3.161005456,3.185832617,3.204481664,3.199388046,3.284448872,3.2978742,3.316060128,3.321583162,3.335361342,3.360581302,3.388365131,3.40694039,3.419198557,3.44745355,3.463383384,3.465061931,3.501223102,3.540905311,3.555158677,3.58038155,3.588656114,3.581645662,3.578725749,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042 -FY22NoProgram,CNGDolPerGge,1.757059748,1.596670639,1.831534346,1.829450163,1.739923215,1.671976268,1.621590415,1.584474471,1.557738168,1.54080393,1.524365223,1.504573112,1.586783156,1.564036368,1.563914049,1.545126133,1.523232455,1.508833531,1.496010877,1.484555874,1.472936278,1.469392516,1.463844492,1.453700233,1.44954675,1.442491495,1.437035398,1.433214854,1.42961431,1.42387155,1.419008289,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501 -FY22NoProgram,dolPerKwh,0.12559407,0.237768062,0.265928557,0.270498702,0.261089548,0.253729255,0.253963369,0.256065732,0.256788553,0.257331383,0.257572785,0.256433963,0.257088289,0.257706098,0.258425739,0.258131257,0.255955144,0.25409041,0.252592235,0.251089999,0.249708635,0.24858093,0.247243815,0.246018338,0.24427212,0.242571025,0.24153149,0.2403254,0.238856072,0.237723241,0.236505046,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068 -FY22NoProgram,hydrogenDolPerGGE,13.39552294,9.93692531,9.716104747,9.495284185,9.274463622,9.05364306,8.832822497,8.612001935,8.391181373,8.17036081,7.949540248,7.728719685,7.507899123,7.28707856,7.066257998,6.845437436,6.624616873,6.403796311,6.182975748,5.962155186,5.741334623,5.520514061,5.41010378,5.299693498,5.189283217,5.078872936,4.968462655,4.858052374,4.747642092,4.637231811,4.52682153,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249 -FY22NoProgram,E85DolPerGal,2.32936,2.109573042,2.096746027,2.096205346,2.108251382,2.089965149,2.065032595,2.088154934,2.115042298,2.141099462,2.160003,2.216314344,2.276425637,2.305901189,2.319500971,2.358489941,2.372518858,2.375909582,2.386873032,2.417581315,2.416719211,2.435733235,2.453192126,2.45477639,2.478698083,2.502822226,2.511262685,2.532775382,2.541457704,2.535158021,2.537609366,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325 -FY22TechSuccess,gasolineDolPerGal,2.667821,2.264015,3.232355936,3.099445486,2.77340515,2.755122396,2.727299852,2.756087319,2.789028144,2.819176133,2.840333894,2.910524364,3.003742657,3.034235342,3.05936961,3.083085073,3.094689786,3.1166894,3.136223364,3.170620765,3.172299969,3.19721186,3.217466984,3.222593269,3.254573924,3.285350895,3.295881123,3.322274731,3.33250779,3.323551956,3.325518197,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202 -FY22TechSuccess,dieselDolPerGal,3.039967,2.54226434,3.288893791,3.163300386,3.051355061,3.159781567,3.156189792,3.152807315,3.161005456,3.185832617,3.204481664,3.199388046,3.284448872,3.2978742,3.316060128,3.321583162,3.335361342,3.360581302,3.388365131,3.40694039,3.419198557,3.44745355,3.463383384,3.465061931,3.501223102,3.540905311,3.555158677,3.58038155,3.588656114,3.581645662,3.578725749,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042 -FY22TechSuccess,CNGDolPerGge,1.757059748,1.596670639,1.831534346,1.829450163,1.739923215,1.671976268,1.621590415,1.584474471,1.557738168,1.54080393,1.524365223,1.504573112,1.586783156,1.564036368,1.563914049,1.545126133,1.523232455,1.508833531,1.496010877,1.484555874,1.472936278,1.469392516,1.463844492,1.453700233,1.44954675,1.442491495,1.437035398,1.433214854,1.42961431,1.42387155,1.419008289,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501 -FY22TechSuccess,dolPerKwh,0.12559407,0.237768062,0.265928557,0.270498702,0.261089548,0.253729255,0.253963369,0.256065732,0.256788553,0.257331383,0.257572785,0.256433963,0.257088289,0.257706098,0.258425739,0.258131257,0.255955144,0.25409041,0.252592235,0.251089999,0.249708635,0.24858093,0.247243815,0.246018338,0.24427212,0.242571025,0.24153149,0.2403254,0.238856072,0.237723241,0.236505046,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068 -FY22TechSuccess,hydrogenDolPerGGE,13.39552294,9.93692531,9.495284185,9.05364306,8.612001935,8.17036081,7.728719685,7.28707856,6.845437436,6.403796311,5.962155186,5.520514061,5.41010378,5.299693498,5.189283217,5.078872936,4.968462655,4.858052374,4.747642092,4.637231811,4.52682153,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249 -FY22TechSuccess,E85DolPerGal,2.32936,2.109573042,2.096746027,2.096205346,2.108251382,2.089965149,2.065032595,2.088154934,2.115042298,2.141099462,2.160003,2.216314344,2.276425637,2.305901189,2.319500971,2.358489941,2.372518858,2.375909582,2.386873032,2.417581315,2.416719211,2.435733235,2.453192126,2.45477639,2.478698083,2.502822226,2.511262685,2.532775382,2.541457704,2.535158021,2.537609366,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325 -AEO2023NoTaxes,gasolineDolPerGal,,,,3.630191,3.118264,2.786285,2.573572,2.545253,2.530096,2.533875,2.542762,2.556915,2.55617,2.575692,2.58673,2.600774,2.611039,2.647436,2.655259,2.667901,2.684505,2.691646,2.694711,2.705702,2.695939,2.719227,2.721342,2.777465,2.780017,2.808998,2.820143,2.85132,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -AEO2023NoTaxes,dieselDolPerGal,,,,4.534457,3.95697,3.73079,3.445461,3.32293,3.199108,3.096978,3.114693,3.122572,3.148627,3.170337,3.191192,3.202062,3.23476,3.239661,3.262592,3.28023,3.289756,3.299955,3.326997,3.331949,3.351907,3.342346,3.351127,3.39162,3.398527,3.408837,3.421015,3.425328,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -FY22HFTOGoal,hydrogenDolPerGGE,13.39552294,9.93692531,9.495284185,9.05364306,8.612001935,8.17036081,7.728719685,7.28707856,6.845437436,6.403796311,5.962155186,5.520514061,5.299693499,5.078872936,4.858052374,4.637231811,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249 -AEO2023Commercial,dolPerKwh,,,,0.125126187,0.122496976,0.117181012,0.1121662,0.109373807,0.107347419,0.105643055,0.104810247,0.104685414,0.104628622,0.104523249,0.105709899,0.106494121,0.10624195,0.106567878,0.106944322,0.107793577,0.108352386,0.108812158,0.109166581,0.109224157,0.109248302,0.10912252,0.108946624,0.108343269,0.107444501,0.107062519,0.106208662,0.10510263,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -AEO2023Commercialx2,dolPerKwh,,,,0.250252374,0.244993952,0.234362024,0.2243324,0.218747614,0.214694838,0.21128611,0.209620494,0.209370828,0.209257244,0.209046498,0.211419798,0.212988242,0.2124839,0.213135756,0.213888644,0.215587154,0.216704772,0.217624316,0.218333162,0.218448314,0.218496604,0.21824504,0.217893248,0.216686538,0.214889002,0.214125038,0.212417324,0.21020526,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file +Pacific,gasoline_dol_per_gal,3.069722209,3.086530987,3.149335121,3.191860271,3.234319895,3.265413474,3.310172144,3.361870727,3.382550831,3.419458424,3.445939114,3.905952725,3.926745854,3.94153759,4.04380724,4.069785223,4.101621485,4.131632187,4.150380173,4.186986739,4.222034206,4.24329647,4.271472039,4.320977264,4.352638953,4.378992691,4.404960727,4.442638731,4.473804801,4.513358847,4.544393116,4.578084905,4.637600008,4.697888808,4.758961363,4.820827861,4.883498623,4.946984105,5.011294898,5.076441732,5.142435474,5.209287136,5.277007868,5.345608971,5.415101887,5.485498212,5.556809689,5.629048215,5.702225841,5.776354777,5.851447389,5.927516205,6.004573916,6.082633377,6.161707611,6.24180981,6.322953337,6.405151731,6.488418703,6.572768146,6.658214132,6.744770916,6.832452938,6.921274826,7.011251399,7.102397667,7.194728837,7.288260312,7.383007696,7.478986796,7.576213624,7.674704401,7.774475558,7.875543741,7.977925809,8.081638845,8.18670015,8.293127252,8.400937906,8.510150099,8.62078205,8.732852217 +Pacific,diesel_dol_per_gal,3.243445751,3.251054873,3.382408693,3.528446757,3.651060536,3.807813356,3.927696825,3.995680912,4.009688691,4.065603033,4.101343249,4.521756311,4.558743947,4.579287352,4.687445902,4.709592956,4.737764716,4.776970093,4.805358778,4.835536163,4.862689106,4.862680176,4.873186251,4.934654494,4.953993617,4.982061655,5.033124661,5.030281012,5.071288691,5.098808029,5.121131205,5.144641353,5.221810973,5.300138137,5.379640209,5.460334813,5.542239835,5.625373432,5.709754034,5.795400344,5.882331349,5.97056632,6.060124815,6.151026687,6.243292087,6.336941468,6.43199559,6.528475524,6.626402657,6.725798697,6.826685677,6.929085963,7.033022252,7.138517586,7.24559535,7.35427928,7.464593469,7.576562371,7.690210807,7.805563969,7.922647428,8.04148714,8.162109447,8.284541088,8.408809205,8.534941343,8.662965463,8.792909945,8.924803594,9.058675648,9.194555783,9.332474119,9.472461231,9.61454815,9.758766372,9.905147868,10.05372509,10.20453096,10.35759893,10.51296291,10.67065735,10.83071721 +Pacific,cng_dol_per_gge,2.035133231,1.971391229,1.845780418,1.801504832,1.822917671,1.810365148,1.823601055,1.834954245,1.834601999,1.822735306,1.800229567,2.153267354,2.124395715,2.108736174,2.153293608,2.146426303,2.134144303,2.117576286,2.116551209,2.111846925,2.103013506,2.093048063,2.084490958,2.074735421,2.070778869,2.068572349,2.067092197,2.067146894,2.072669309,2.075536435,2.079184111,2.08436921,2.086453579,2.088540033,2.090628573,2.092719201,2.09481192,2.096906732,2.099003639,2.101102643,2.103203745,2.105306949,2.107412256,2.109519668,2.111629188,2.113740817,2.115854558,2.117970413,2.120088383,2.122208471,2.12433068,2.126455011,2.128581466,2.130710047,2.132840757,2.134973598,2.137108571,2.13924568,2.141384926,2.143526311,2.145669837,2.147815507,2.149963322,2.152113286,2.154265399,2.156419664,2.158576084,2.16073466,2.162895395,2.16505829,2.167223348,2.169390572,2.171559962,2.173731522,2.175905254,2.178081159,2.18025924,2.182439499,2.184621939,2.186806561,2.188993367,2.191182361 +Pacific,electricity_dol_per_kwh,0.150672214,0.156410908,0.151477968,0.152424341,0.157182143,0.157716622,0.160894392,0.165551502,0.166433204,0.166785879,0.166642172,0.168101706,0.17022279,0.170000027,0.169805519,0.17001156,0.168847535,0.167110425,0.166457958,0.165650215,0.164498935,0.163526515,0.162721866,0.16236594,0.161658025,0.160917495,0.160790916,0.160988795,0.160924186,0.16110625,0.160870938,0.160227281,0.160547736,0.160868831,0.161190569,0.16151295,0.161835976,0.162159648,0.162483967,0.162808935,0.163134553,0.163460822,0.163787744,0.164115319,0.16444355,0.164772437,0.165101982,0.165432186,0.16576305,0.166094576,0.166426765,0.166759619,0.167093138,0.167427324,0.167762179,0.168097703,0.168433899,0.168770767,0.169108308,0.169446525,0.169785418,0.170124989,0.170465239,0.170806169,0.171147781,0.171490077,0.171833057,0.172176723,0.172521077,0.172866119,0.173211851,0.173558275,0.173905391,0.174253202,0.174601709,0.174950912,0.175300814,0.175651415,0.176002718,0.176354724,0.176707433,0.177060848 +Pacific,hydrogen_dol_per_gge,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +Mountain,gasoline_dol_per_gal,2.726837375,2.682777123,2.669270939,2.654259869,2.625576869,2.568933657,2.595847175,2.613900597,2.652008569,2.662933081,2.702629123,2.737765991,2.75987613,2.789505481,2.84055675,2.891643082,2.929724072,2.967243667,2.977541133,3.012140106,3.056067563,3.066199656,3.089262115,3.139283102,3.165494969,3.191915727,3.235352663,3.244276793,3.306140419,3.344979511,3.377144528,3.402597547,3.42641573,3.45040064,3.474553445,3.498875319,3.523367446,3.548031018,3.572867235,3.597877306,3.623062447,3.648423884,3.673962852,3.699680592,3.725578356,3.751657404,3.777919006,3.804364439,3.83099499,3.857811955,3.884816639,3.912010355,3.939394428,3.966970189,3.99473898,4.022702153,4.050861068,4.079217095,4.107771615,4.136526016,4.165481699,4.19464007,4.224002551,4.253570569,4.283345563,4.313328982,4.343522285,4.373926941,4.404544429,4.43537624,4.466423874,4.497688841,4.529172663,4.560876871,4.59280301,4.624952631,4.657327299,4.68992859,4.72275809,4.755817397,4.789108119,4.822631876 +Mountain,diesel_dol_per_gal,3.072332083,2.942515556,2.942233512,2.966334811,2.965090002,2.996862792,2.988484063,3.047476426,3.054929482,3.100653451,3.130638503,3.148011017,3.184551615,3.209649201,3.252512622,3.281280753,3.310786483,3.344663538,3.367366848,3.39656924,3.427207126,3.427580803,3.451830472,3.502873009,3.525141095,3.554633774,3.603937479,3.606576156,3.640135037,3.672541841,3.695879851,3.717085845,3.73938836,3.76182469,3.784395638,3.807102012,3.829944624,3.852924292,3.876041837,3.899298088,3.922693877,3.94623004,3.96990742,3.993726865,4.017689226,4.041795361,4.066046134,4.09044241,4.114985065,4.139674975,4.164513025,4.189500103,4.214637104,4.239924927,4.265364476,4.290956663,4.316702403,4.342602617,4.368658233,4.394870182,4.421239404,4.44776684,4.474453441,4.501300162,4.528307963,4.55547781,4.582810677,4.610307541,4.637969387,4.665797203,4.693791986,4.721954738,4.750286466,4.778788185,4.807460914,4.83630568,4.865323514,4.894515455,4.923882548,4.953425843,4.983146398,5.013045277 +Mountain,cng_dol_per_gge,1.686393173,1.644044319,1.632912618,1.601914765,1.572994736,1.548691477,1.530444985,1.502410653,1.467981851,1.429135503,1.381500523,1.337833033,1.300468252,1.279114356,1.268454975,1.260792705,1.251940496,1.242809271,1.246442534,1.246287067,1.245907924,1.243036036,1.241558588,1.242358572,1.245096743,1.248107366,1.253019497,1.260110093,1.270833951,1.278390303,1.285433152,1.295619955,1.285254995,1.274972955,1.264773172,1.254654986,1.244617747,1.234660805,1.224783518,1.21498525,1.205265368,1.195623245,1.186058259,1.176569793,1.167157235,1.157819977,1.148557417,1.139368958,1.130254006,1.121211974,1.112242278,1.10334434,1.094517585,1.085761445,1.077075353,1.06845875,1.05991108,1.051431791,1.043020337,1.034676174,1.026398765,1.018187575,1.010042074,1.001961738,0.993946044,0.985994475,0.97810652,0.970281668,0.962519414,0.954819259,0.947180705,0.939603259,0.932086433,0.924629742,0.917232704,0.909894842,0.902615683,0.895394758,0.8882316,0.881125747,0.874076741,0.867084127 +Mountain,electricity_dol_per_kwh,0.107094662,0.11044443,0.10786374,0.107566463,0.109148317,0.108970354,0.109316891,0.109758618,0.109481919,0.107995826,0.107282134,0.106459269,0.104986837,0.104585231,0.104320627,0.104586344,0.104368389,0.104054662,0.103509759,0.102908001,0.101817765,0.101375014,0.100758687,0.100236371,0.099217712,0.098825035,0.098381874,0.097759481,0.096904853,0.096367511,0.095684081,0.094934485,0.094554747,0.094176528,0.093799822,0.093424623,0.093050924,0.09267872,0.092308005,0.091938773,0.091571018,0.091204734,0.090839915,0.090476556,0.090114649,0.089754191,0.089395174,0.089037593,0.088681443,0.088326717,0.08797341,0.087621517,0.087271031,0.086921947,0.086574259,0.086227962,0.08588305,0.085539518,0.08519736,0.08485657,0.084517144,0.084179075,0.083842359,0.08350699,0.083172962,0.08284027,0.082508909,0.082178873,0.081850158,0.081522757,0.081196666,0.080871879,0.080548392,0.080226198,0.079905293,0.079585672,0.07926733,0.07895026,0.078634459,0.078319921,0.078006642,0.077694615 +Mountain,hydrogen_dol_per_gge,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +West South Central,gasoline_dol_per_gal,2.611791293,2.557939888,2.531070635,2.505851748,2.468613907,2.404557794,2.419052481,2.439352851,2.474760406,2.487610199,2.527431452,2.565143774,2.587260876,2.616480154,2.66489442,2.722292251,2.759345571,2.796178685,2.806382398,2.840650627,2.884690238,2.895253792,2.918323462,2.968797544,2.99531392,3.021655722,3.068118347,3.075263918,3.138003147,3.176660453,3.208294165,3.234049953,3.256688302,3.27948512,3.302441516,3.325558607,3.348837517,3.37227938,3.395885335,3.419656533,3.443594128,3.467699287,3.491973182,3.516416995,3.541031914,3.565819137,3.590779871,3.61591533,3.641226737,3.666715324,3.692382332,3.718229008,3.744256611,3.770466407,3.796859672,3.82343769,3.850201754,3.877153166,3.904293238,3.931623291,3.959144654,3.986858666,4.014766677,4.042870044,4.071170134,4.099668325,4.128366003,4.157264565,4.186365417,4.215669975,4.245179665,4.274895923,4.304820194,4.334953936,4.365298613,4.395855703,4.426626693,4.45761308,4.488816372,4.520238086,4.551879753,4.583742911 +West South Central,diesel_dol_per_gal,2.985787686,2.842448334,2.816444721,2.822678934,2.804686968,2.820156069,2.793316767,2.855005507,2.862527117,2.910958041,2.939893914,2.956836426,2.99427687,3.017205759,3.058825333,3.091551273,3.121051507,3.154433029,3.177623217,3.206821076,3.23745539,3.237824808,3.262071318,3.313110282,3.335374659,3.364865552,3.41416651,3.416802164,3.450357611,3.482760706,3.505273193,3.525083258,3.542708674,3.560422218,3.578224329,3.59611545,3.614096028,3.632166508,3.65032734,3.668578977,3.686921872,3.705356481,3.723883264,3.74250268,3.761215193,3.780021269,3.798921376,3.817915983,3.837005563,3.85619059,3.875471543,3.894848901,3.914323146,3.933894761,3.953564235,3.973332056,3.993198717,4.01316471,4.033230534,4.053396686,4.07366367,4.094031988,4.114502148,4.135074659,4.155750032,4.176528782,4.197411426,4.218398483,4.239490476,4.260687928,4.281991368,4.303401325,4.324918331,4.346542923,4.368275637,4.390117016,4.412067601,4.434127939,4.456298578,4.478580071,4.500972972,4.523477837 +West South Central,cng_dol_per_gge,1.483270357,1.434278775,1.334604396,1.320769659,1.329698442,1.320445598,1.332639827,1.339974561,1.336078884,1.321722407,1.298663911,1.275957918,1.249159083,1.235047003,1.229251363,1.223706426,1.213487191,1.204963418,1.204488782,1.202077632,1.198867012,1.195036199,1.191244509,1.191191486,1.190638729,1.190133334,1.190919162,1.194227077,1.199126209,1.202076988,1.204149149,1.210974627,1.202497805,1.19408032,1.185721758,1.177421706,1.169179754,1.160995495,1.152868527,1.144798447,1.136784858,1.128827364,1.120925572,1.113079093,1.10528754,1.097550527,1.089867673,1.0822386,1.074662929,1.067140289,1.059670307,1.052252615,1.044886846,1.037572639,1.03030963,1.023097463,1.01593578,1.00882423,1.00176246,0.994750123,0.987786872,0.980872364,0.974006258,0.967188214,0.960417896,0.953694971,0.947019106,0.940389972,0.933807243,0.927270592,0.920779698,0.91433424,0.9079339,0.901578363,0.895267314,0.889000443,0.88277744,0.876597998,0.870461812,0.864368579,0.858317999,0.852309773 +West South Central,electricity_dol_per_kwh,0.085309168,0.087714024,0.088787245,0.089167765,0.08929998,0.090344137,0.092157008,0.093448521,0.094718519,0.09543926,0.095371293,0.094984986,0.094627047,0.094400251,0.094373044,0.094507183,0.094015422,0.093531211,0.093394011,0.09323839,0.092861152,0.092328075,0.091895939,0.091162539,0.090851918,0.090534431,0.090141935,0.089789319,0.089561134,0.089216198,0.088724259,0.088405623,0.088494028,0.088582523,0.088671105,0.088759776,0.088848536,0.088937384,0.089026322,0.089115348,0.089204464,0.089293668,0.089382962,0.089472345,0.089561817,0.089651379,0.08974103,0.089830771,0.089920602,0.090010523,0.090100533,0.090190634,0.090280824,0.090371105,0.090461476,0.090551938,0.09064249,0.090733132,0.090823865,0.090914689,0.091005604,0.091096609,0.091187706,0.091278894,0.091370173,0.091461543,0.091553004,0.091644557,0.091736202,0.091827938,0.091919766,0.092011686,0.092103697,0.092195801,0.092287997,0.092380285,0.092472665,0.092565138,0.092657703,0.092750361,0.092843111,0.092935954 +West South Central,hydrogen_dol_per_gge,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +East South Central,gasoline_dol_per_gal,2.636269238,2.577522194,2.548280286,2.518140892,2.475542008,2.405744246,2.416299717,2.43729291,2.47207976,2.484995454,2.52391835,2.561827626,2.583268692,2.612245383,2.660245596,2.716550603,2.754864233,2.790179528,2.801352348,2.835675907,2.879483625,2.889570459,2.912729157,2.962406717,2.988510408,3.014792527,3.060174886,3.06655216,3.131411759,3.169524083,3.201053971,3.225628156,3.248207553,3.270945006,3.293841621,3.316898512,3.340116802,3.363497619,3.387042103,3.410751397,3.434626657,3.458669044,3.482879727,3.507259885,3.531810704,3.556533379,3.581429113,3.606499117,3.63174461,3.657166823,3.68276699,3.708546359,3.734506184,3.760647727,3.786972261,3.813481067,3.840175435,3.867056663,3.894126059,3.921384942,3.948834636,3.976476479,4.004311814,4.032341997,4.060568391,4.088992369,4.117615316,4.146438623,4.175463694,4.204691939,4.234124783,4.263763657,4.293610002,4.323665272,4.353930929,4.384408446,4.415099305,4.446005,4.477127035,4.508466924,4.540026193,4.571806376 +East South Central,diesel_dol_per_gal,2.991196925,2.858675228,2.838558666,2.852262558,2.840096646,2.866277069,2.859075694,2.910525153,2.917020115,2.96294466,2.991723094,3.008487148,3.045023488,3.070117227,3.123119503,3.148047286,3.181385533,3.215259566,3.237959853,3.267158948,3.297794362,3.297204997,3.32241235,3.373404056,3.39571789,3.42211194,3.474510839,3.47708742,3.510703589,3.543107783,3.566443594,3.58764739,3.609173274,3.630828314,3.652613284,3.674528963,3.696576137,3.718755594,3.741068127,3.763514536,3.786095623,3.808812197,3.83166507,3.854655061,3.877782991,3.901049689,3.924455987,3.948002723,3.97169074,3.995520884,4.019494009,4.043610973,4.067872639,4.092279875,4.116833554,4.141534556,4.166383763,4.191382065,4.216530358,4.24182954,4.267280517,4.2928842,4.318641506,4.344553355,4.370620675,4.396844399,4.423225465,4.449764818,4.476463407,4.503322187,4.53034212,4.557524173,4.584869318,4.612378534,4.640052805,4.667893122,4.695900481,4.724075884,4.752420339,4.780934861,4.80962047,4.838478193 +East South Central,cng_dol_per_gge,1.640487374,1.601096377,1.569352079,1.55204109,1.545049334,1.535638707,1.540198592,1.538174693,1.523307415,1.497164037,1.461238739,1.425656677,1.39018491,1.368207731,1.35561158,1.345221306,1.331115661,1.317416056,1.312614734,1.307314065,1.302086625,1.297671395,1.294174295,1.293947658,1.293912395,1.293384735,1.295898843,1.299794649,1.306023485,1.309247232,1.311892354,1.317791209,1.308566671,1.299406704,1.290310857,1.281278681,1.272309731,1.263403562,1.254559738,1.245777819,1.237057375,1.228397973,1.219799187,1.211260593,1.202781769,1.194362296,1.18600176,1.177699748,1.16945585,1.161269659,1.153140771,1.145068786,1.137053304,1.129093931,1.121190274,1.113341942,1.105548548,1.097809708,1.09012504,1.082494165,1.074916706,1.067392289,1.059920543,1.052501099,1.045133591,1.037817656,1.030552933,1.023339062,1.016175689,1.009062459,1.001999022,0.994985029,0.988020133,0.981103992,0.974236264,0.967416611,0.960644694,0.953920181,0.94724274,0.940612041,0.934027757,0.927489562 +East South Central,electricity_dol_per_kwh,0.117124932,0.124191051,0.117192213,0.11594654,0.11540425,0.1152847,0.115845043,0.115944847,0.116025377,0.115497589,0.114946281,0.113303485,0.111858633,0.110604446,0.10994101,0.109023906,0.107699572,0.10623969,0.105181045,0.10437295,0.103457494,0.102877525,0.102209302,0.100867516,0.099205763,0.098406038,0.097760307,0.097339989,0.096955412,0.096470192,0.095762632,0.095027561,0.094362368,0.093701831,0.093045918,0.092394597,0.091747835,0.0911056,0.090467861,0.089834586,0.089205744,0.088581304,0.087961234,0.087345506,0.086734087,0.086126949,0.08552406,0.084925392,0.084330914,0.083740597,0.083154413,0.082572332,0.081994326,0.081420366,0.080850423,0.08028447,0.079722479,0.079164422,0.078610271,0.078059999,0.077513579,0.076970984,0.076432187,0.075897161,0.075365881,0.07483832,0.074314452,0.073794251,0.073277691,0.072764747,0.072255394,0.071749606,0.071247359,0.070748627,0.070253387,0.069761613,0.069273282,0.068788369,0.06830685,0.067828703,0.067353902,0.066882424 +East South Central,hydrogen_dol_per_gge,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +South Atlantic,gasoline_dol_per_gal,2.685224881,2.668090331,2.676945204,2.686008969,2.681991046,2.652864028,2.697011566,2.718255553,2.755400884,2.767119432,2.806462846,2.843463073,2.865762955,2.895880589,2.943239955,2.99539872,3.028244001,3.06723889,3.0749471,3.109372991,3.153054752,3.16330099,3.186081819,3.236319158,3.262572056,3.288908388,3.334600229,3.341233892,3.405316739,3.446263144,3.476214288,3.500596367,3.532101734,3.56389065,3.595965666,3.628329357,3.660984321,3.69393318,3.727178579,3.760723186,3.794569694,3.828720822,3.863179309,3.897947923,3.933029454,3.968426719,4.00414256,4.040179843,4.076541461,4.113230335,4.150249408,4.187601652,4.225290067,4.263317678,4.301687537,4.340402725,4.379466349,4.418881546,4.45865148,4.498779344,4.539268358,4.580121773,4.621342869,4.662934955,4.704901369,4.747245482,4.789970691,4.833080427,4.876578151,4.920467354,4.964751561,5.009434325,5.054519233,5.100009907,5.145909996,5.192223186,5.238953194,5.286103773,5.333678707,5.381681815,5.430116952,5.478988004 +South Atlantic,diesel_dol_per_gal,3.007423819,2.893833911,2.895806977,2.931599948,2.94152339,2.989793441,3.00468087,3.056128544,3.062622543,3.108545989,3.137323187,3.15408628,3.190621383,3.215714022,3.258572636,3.287335546,3.31683633,3.350709676,3.373409139,3.402607547,3.433242136,3.433612103,3.457858751,3.50889799,3.531162917,3.560653534,3.609955042,3.612590834,3.646146692,3.678549925,3.701885324,3.723088295,3.749149913,3.775393963,3.80182172,3.828434473,3.855233514,3.882220148,3.909395689,3.936761459,3.964318789,3.992069021,4.020013504,4.048153599,4.076490674,4.105026109,4.133761291,4.16269762,4.191836504,4.221179359,4.250727615,4.280482708,4.310446087,4.34061921,4.371003544,4.401600569,4.432411773,4.463438655,4.494682726,4.526145505,4.557828524,4.589733323,4.621861456,4.654214487,4.686793988,4.719601546,4.752638757,4.785907228,4.819408579,4.853144439,4.88711645,4.921326265,4.955775549,4.990465978,5.025399239,5.060577034,5.096001073,5.131673081,5.167594792,5.203767956,5.240194332,5.276875692 +South Atlantic,cng_dol_per_gge,1.497027746,1.457586815,1.428943229,1.392329141,1.389529067,1.383076683,1.387417911,1.388401418,1.382046458,1.366478936,1.345278319,1.319005343,1.298105364,1.286868645,1.283066789,1.279504953,1.271302282,1.264459944,1.263048131,1.260651266,1.259262362,1.258226088,1.257250818,1.258797377,1.258648989,1.259126972,1.261507106,1.265814872,1.272216035,1.275580062,1.278650144,1.285075501,1.278650124,1.272256873,1.265895589,1.259566111,1.25326828,1.247001939,1.240766929,1.234563095,1.228390279,1.222248328,1.216137086,1.210056401,1.204006119,1.197986088,1.191996158,1.186036177,1.180105996,1.174205466,1.168334439,1.162492766,1.156680303,1.150896901,1.145142417,1.139416705,1.133719621,1.128051023,1.122410768,1.116798714,1.11121472,1.105658647,1.100130354,1.094629702,1.089156553,1.083710771,1.078292217,1.072900756,1.067536252,1.062198571,1.056887578,1.05160314,1.046345124,1.041113398,1.035907831,1.030728292,1.025574651,1.020446778,1.015344544,1.010267821,1.005216482,1.000190399 +South Atlantic,electricity_dol_per_kwh,0.101373973,0.107040217,0.109520457,0.112160155,0.11383459,0.115633212,0.117311306,0.118388542,0.11856035,0.118285196,0.11802078,0.11741978,0.116495049,0.115790011,0.115512424,0.115169487,0.114368367,0.113560975,0.11285841,0.112423373,0.111871414,0.111184923,0.110203134,0.109284924,0.108383374,0.107762069,0.107195271,0.106548384,0.105840052,0.105142831,0.10417183,0.103304039,0.103407343,0.10351075,0.103614261,0.103717875,0.103821593,0.103925415,0.10402934,0.10413337,0.104237503,0.10434174,0.104446082,0.104550528,0.104655079,0.104759734,0.104864494,0.104969358,0.105074327,0.105179402,0.105284581,0.105389866,0.105495256,0.105600751,0.105706352,0.105812058,0.10591787,0.106023788,0.106129812,0.106235942,0.106342177,0.10644852,0.106554968,0.106661523,0.106768185,0.106874953,0.106981828,0.10708881,0.107195898,0.107303094,0.107410397,0.107517808,0.107625326,0.107732951,0.107840684,0.107948525,0.108056473,0.10816453,0.108272694,0.108380967,0.108489348,0.108597837 +South Atlantic,hydrogen_dol_per_gge,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +West North Central,gasoline_dol_per_gal,2.675433727,2.624030079,2.601625379,2.579012906,2.543572525,2.482942103,2.495555028,2.516823012,2.553960262,2.565623105,2.604855732,2.641823506,2.664052265,2.694144908,2.741491466,2.793580103,2.8264224,2.865460808,2.873056117,2.907475543,2.951174836,2.961479887,2.984325745,3.034397588,3.060685799,3.086959463,3.132433958,3.139162617,3.203374529,3.244310738,3.274270585,3.298578558,3.321668608,3.344920288,3.36833473,3.391913073,3.415656465,3.43956606,3.463643022,3.487888524,3.512303743,3.53688987,3.561648099,3.586579635,3.611685693,3.636967493,3.662426265,3.688063249,3.713879692,3.739876849,3.766055987,3.792418379,3.818965308,3.845698065,3.872617952,3.899726277,3.927024361,3.954513532,3.982195126,4.010070492,4.038140986,4.066407973,4.094872828,4.123536938,4.152401697,4.181468509,4.210738788,4.24021396,4.269895458,4.299784726,4.329883219,4.360192401,4.390713748,4.421448744,4.452398886,4.483565678,4.514950638,4.546555292,4.578381179,4.610429847,4.642702856,4.675201776 +West North Central,diesel_dol_per_gal,2.977674101,2.839743577,2.813557247,2.821190823,2.802955143,2.823065661,2.80979342,2.861241918,2.867735643,2.913659364,2.942436699,2.959199929,2.995735306,3.020827946,3.073829399,3.098756082,3.132093642,3.165966851,3.188666314,3.217864997,3.248499586,3.247909535,3.273116338,3.324107769,3.346420916,3.372814279,3.425212904,3.42778921,3.461404692,3.493808199,3.517143323,3.538346844,3.559576925,3.580934387,3.602419993,3.624034513,3.64577872,3.667653392,3.689659313,3.711797269,3.734068052,3.756472461,3.779011295,3.801685363,3.824495475,3.847442448,3.870527103,3.893750265,3.917112767,3.940615444,3.964259136,3.988044691,4.011972959,4.036044797,4.060261066,4.084622632,4.109130368,4.13378515,4.158587861,4.183539388,4.208640625,4.233892468,4.259295823,4.284851598,4.310560708,4.336424072,4.362442616,4.388617272,4.414948976,4.441438669,4.468087302,4.494895825,4.5218652,4.548996391,4.57629037,4.603748112,4.631370601,4.659158824,4.687113777,4.71523646,4.743527879,4.771989046 +West North Central,cng_dol_per_gge,1.649550646,1.606923934,1.593430117,1.566266811,1.537348712,1.512075201,1.490232641,1.461420203,1.42315634,1.380524737,1.331611661,1.286068404,1.247926932,1.225376663,1.21586385,1.207867223,1.196954308,1.187108811,1.187057718,1.186114365,1.184395736,1.182745318,1.182056657,1.184262663,1.187309965,1.19051518,1.195398482,1.20281005,1.212942542,1.220523219,1.227582927,1.238018245,1.226876081,1.215834196,1.204891688,1.194047663,1.183301234,1.172651523,1.162097659,1.15163878,1.141274031,1.131002565,1.120823542,1.11073613,1.100739505,1.090832849,1.081015354,1.071286215,1.06164464,1.052089838,1.042621029,1.03323744,1.023938303,1.014722858,1.005590353,0.996540039,0.987571179,0.978683038,0.969874891,0.961146017,0.952495703,0.943923242,0.935427932,0.927009081,0.918665999,0.910398005,0.902204423,0.894084583,0.886037822,0.878063482,0.87016091,0.862329462,0.854568497,0.846877381,0.839255484,0.831702185,0.824216865,0.816798913,0.809447723,0.802162694,0.794943229,0.78778874 +West North Central,electricity_dol_per_kwh,0.116989387,0.126164241,0.129240654,0.131095683,0.132694202,0.133290896,0.133071685,0.132433457,0.132058225,0.131557419,0.130635527,0.129879234,0.129782032,0.129245431,0.128141539,0.127138899,0.126162484,0.125086329,0.123742086,0.12223765,0.120744286,0.119383229,0.117771724,0.116337521,0.114657278,0.11342716,0.112523359,0.111621082,0.110660519,0.109581007,0.108200672,0.106922369,0.106601602,0.106281798,0.105962952,0.105645063,0.105328128,0.105012144,0.104697107,0.104383016,0.104069867,0.103757657,0.103446384,0.103136045,0.102826637,0.102518157,0.102210603,0.101903971,0.101598259,0.101293464,0.100989584,0.100686615,0.100384555,0.100083402,0.099783151,0.099483802,0.09918535,0.098887794,0.098591131,0.098295358,0.098000472,0.09770647,0.097413351,0.097121111,0.096829747,0.096539258,0.09624964,0.095960891,0.095673009,0.09538599,0.095099832,0.094814532,0.094530089,0.094246498,0.093963759,0.093681868,0.093400822,0.09312062,0.092841258,0.092562734,0.092285046,0.092008191 +West North Central,hydrogen_dol_per_gge,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +East North Central,gasoline_dol_per_gal,2.73173289,2.699911548,2.699290346,2.698849063,2.685333305,2.646981254,2.681624367,2.70254308,2.73993075,2.751450851,2.790772133,2.827607485,2.850055704,2.880096248,2.927841192,2.980005676,3.012798486,3.051885884,3.05948169,3.09390609,3.137604512,3.14802035,3.170766488,3.221004075,3.247364404,3.273670396,3.319243244,3.326242219,3.389954283,3.4308655,3.46085693,3.485426017,3.513309425,3.5414159,3.569747227,3.598305205,3.627091647,3.65610838,3.685357247,3.714840105,3.744558826,3.774515297,3.804711419,3.83514911,3.865830303,3.896756946,3.927931001,3.959354449,3.991029285,4.022957519,4.055141179,4.087582309,4.120282967,4.153245231,4.186471193,4.219962962,4.253722666,4.287752447,4.322054467,4.356630903,4.39148395,4.426615821,4.462028748,4.497724978,4.533706778,4.569976432,4.606536243,4.643388533,4.680535642,4.717979927,4.755723766,4.793769556,4.832119713,4.870776671,4.909742884,4.949020827,4.988612994,5.028521898,5.068750073,5.109300073,5.150174474,5.19137587 +East North Central,diesel_dol_per_gal,2.983083066,2.880311362,2.888997001,2.931502545,2.948138697,3.003121459,3.024721186,3.076168585,3.08266176,3.128584657,3.157361168,3.174123711,3.210658539,3.235750629,3.288751395,3.313677529,3.347014265,3.380887061,3.403586249,3.432784108,3.463418422,3.462827821,3.48803435,3.539024682,3.561337692,3.587731192,3.640129542,3.642705024,3.676320368,3.708723601,3.73205845,3.753261147,3.779533975,3.805990713,3.832632648,3.859461076,3.886477304,3.913682645,3.941078423,3.968665972,3.996446634,4.024421761,4.052592713,4.080960862,4.109527588,4.138294281,4.167262341,4.196433177,4.22580821,4.255388867,4.285176589,4.315172825,4.345379035,4.375796688,4.406427265,4.437272256,4.468333162,4.499611494,4.531108774,4.562826536,4.594766322,4.626929686,4.659318194,4.691933421,4.724776955,4.757850394,4.791155346,4.824693434,4.858466288,4.892475552,4.926722881,4.961209941,4.995938411,5.030909979,5.066126349,5.101589234,5.137300358,5.173261461,5.209474291,5.245940611,5.282662195,5.319640831 +East North Central,cng_dol_per_gge,1.893848337,1.844271953,1.814584757,1.785632811,1.761887971,1.737227704,1.71895277,1.690751131,1.651778145,1.60490454,1.550581402,1.499677116,1.454209918,1.424187337,1.405902236,1.390848346,1.374144553,1.358608562,1.353700549,1.348487394,1.343659174,1.339169558,1.336050442,1.335914795,1.33651118,1.33702404,1.340309561,1.345702507,1.353963993,1.359500565,1.365218214,1.373772488,1.360034763,1.346434415,1.332970071,1.319640371,1.306443967,1.293379527,1.280445732,1.267641275,1.254964862,1.242415213,1.229991061,1.21769115,1.205514239,1.193459097,1.181524506,1.169709261,1.158012168,1.146432046,1.134967726,1.123618049,1.112381868,1.101258049,1.090245469,1.079343014,1.068549584,1.057864088,1.047285447,1.036812593,1.026444467,1.016180022,1.006018222,0.99595804,0.985998459,0.976138475,0.96637709,0.956713319,0.947146186,0.937674724,0.928297977,0.919014997,0.909824847,0.900726599,0.891719333,0.882802139,0.873974118,0.865234377,0.856582033,0.848016213,0.839536051,0.83114069 +East North Central,electricity_dol_per_kwh,0.103134807,0.108602087,0.110742414,0.1132881,0.114182529,0.115055755,0.116505019,0.116935917,0.117021419,0.116733978,0.116547127,0.116355093,0.114825493,0.114655678,0.114498289,0.114086082,0.113049117,0.112213296,0.111489871,0.11089665,0.110153881,0.109447737,0.108816149,0.108232199,0.107407969,0.106745826,0.106394932,0.106008315,0.105632562,0.10515003,0.104360858,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449,0.103531449 +East North Central,hydrogen_dol_per_gge,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +Middle Atlantic,gasoline_dol_per_gal,2.86146564,2.817405637,2.799718272,2.789098517,2.767284307,2.719621801,2.745851697,2.76473198,2.801776845,2.814345754,2.856107456,2.892910231,2.916863337,2.946792224,2.995921196,3.049940088,3.081193941,3.120142452,3.129458999,3.164429375,3.207723569,3.219363658,3.240525207,3.293330415,3.320784563,3.347138923,3.394165306,3.403123008,3.462660357,3.505582028,3.535532674,3.564370104,3.589320695,3.61444594,3.639747062,3.665225291,3.690881868,3.716718041,3.742735067,3.768934213,3.795316752,3.82188397,3.848637157,3.875577618,3.902706661,3.930025608,3.957535787,3.985238537,4.013135207,4.041227154,4.069515744,4.098002354,4.12668837,4.155575189,4.184664215,4.213956865,4.243454563,4.273158745,4.303070856,4.333192352,4.363524698,4.394069371,4.424827857,4.455801652,4.486992263,4.518401209,4.550030018,4.581880228,4.613953389,4.646251063,4.678774821,4.711526244,4.744506928,4.777718477,4.811162506,4.844840643,4.878754528,4.91290581,4.94729615,4.981927223,5.016800714,5.051918319 +Middle Atlantic,diesel_dol_per_gal,3.112900143,2.988492168,2.984955981,3.015239287,3.019653476,3.062413862,3.071792863,3.123241772,3.129736871,3.175661416,3.204439988,3.221204042,3.257740656,3.28283467,3.325694382,3.354458529,3.383960687,3.417834582,3.440534732,3.469733964,3.500368966,3.500739482,3.524987091,3.576027293,3.598293043,3.627784897,3.677087229,3.679723845,3.713280666,3.745684722,3.769020946,3.790224741,3.81296609,3.835843886,3.85885895,3.882012103,3.905304176,3.928736001,3.952308417,3.976022268,3.999878401,4.023877672,4.048020938,4.072309063,4.096742918,4.121323375,4.146051315,4.170927623,4.195953189,4.221128908,4.246455682,4.271934416,4.297566022,4.323351418,4.349291527,4.375387276,4.4016396,4.428049437,4.454617734,4.48134544,4.508233513,4.535282914,4.562494611,4.589869579,4.617408797,4.645113249,4.672983929,4.701021832,4.729227963,4.757603331,4.786148951,4.814865845,4.84375504,4.87281757,4.902054476,4.931466803,4.961055603,4.990821937,5.020766869,5.05089147,5.081196819,5.111684 +Middle Atlantic,cng_dol_per_gge,2.351693736,2.294616211,2.27253363,2.219200691,2.15320841,2.124736893,2.11301743,2.089997286,2.070697404,2.032782827,1.985930199,1.944026897,1.915041489,1.889570942,1.882080097,1.870963711,1.852771787,1.830948917,1.830157942,1.823911345,1.814495956,1.804292808,1.806041938,1.803654983,1.800391468,1.793929432,1.797600789,1.800654655,1.80751604,1.805008753,1.81698767,1.820511926,1.805947831,1.791500248,1.777168246,1.7629509,1.748847293,1.734856515,1.720977662,1.707209841,1.693552162,1.680003745,1.666563715,1.653231205,1.640005356,1.626885313,1.61387023,1.600959269,1.588151594,1.575446382,1.562842811,1.550340068,1.537937348,1.525633849,1.513428778,1.501321348,1.489310777,1.477396291,1.465577121,1.453852504,1.442221684,1.43068391,1.419238439,1.407884531,1.396621455,1.385448483,1.374364896,1.363369976,1.352463017,1.341643312,1.330910166,1.320262885,1.309700782,1.299223175,1.28882939,1.278518755,1.268290605,1.25814428,1.248079126,1.238094493,1.228189737,1.218364219 +Middle Atlantic,electricity_dol_per_kwh,0.158978759,0.159764467,0.162082573,0.163773216,0.164656852,0.168078747,0.172857007,0.17546556,0.178654367,0.176466757,0.174183637,0.168720408,0.167194677,0.167355942,0.16933367,0.16968122,0.167516361,0.167019563,0.168023534,0.169344306,0.169583927,0.168821918,0.168257751,0.167712418,0.166754161,0.16602546,0.165365132,0.164604792,0.163927582,0.162613276,0.161193222,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534 +Middle Atlantic,hydrogen_dol_per_gge,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +New England,gasoline_dol_per_gal,2.86146564,2.817405637,2.799718272,2.789098517,2.767284307,2.719621801,2.745851697,2.76473198,2.801776845,2.814345754,2.856107456,2.892910231,2.916863337,2.946792224,2.995921196,3.049940088,3.081193941,3.120142452,3.129458999,3.164429375,3.207723569,3.219363658,3.240525207,3.293330415,3.320784563,3.347138923,3.394165306,3.403123008,3.462660357,3.505582028,3.535532674,3.564370104,3.589320695,3.61444594,3.639747062,3.665225291,3.690881868,3.716718041,3.742735067,3.768934213,3.795316752,3.82188397,3.848637157,3.875577618,3.902706661,3.930025608,3.957535787,3.985238537,4.013135207,4.041227154,4.069515744,4.098002354,4.12668837,4.155575189,4.184664215,4.213956865,4.243454563,4.273158745,4.303070856,4.333192352,4.363524698,4.394069371,4.424827857,4.455801652,4.486992263,4.518401209,4.550030018,4.581880228,4.613953389,4.646251063,4.678774821,4.711526244,4.744506928,4.777718477,4.811162506,4.844840643,4.878754528,4.91290581,4.94729615,4.981927223,5.016800714,5.051918319 +New England,diesel_dol_per_gal,3.112900143,2.988492168,2.984955981,3.015239287,3.019653476,3.062413862,3.071792863,3.123241772,3.129736871,3.175661416,3.204439988,3.221204042,3.257740656,3.28283467,3.325694382,3.354458529,3.383960687,3.417834582,3.440534732,3.469733964,3.500368966,3.500739482,3.524987091,3.576027293,3.598293043,3.627784897,3.677087229,3.679723845,3.713280666,3.745684722,3.769020946,3.790224741,3.81296609,3.835843886,3.85885895,3.882012103,3.905304176,3.928736001,3.952308417,3.976022268,3.999878401,4.023877672,4.048020938,4.072309063,4.096742918,4.121323375,4.146051315,4.170927623,4.195953189,4.221128908,4.246455682,4.271934416,4.297566022,4.323351418,4.349291527,4.375387276,4.4016396,4.428049437,4.454617734,4.48134544,4.508233513,4.535282914,4.562494611,4.589869579,4.617408797,4.645113249,4.672983929,4.701021832,4.729227963,4.757603331,4.786148951,4.814865845,4.84375504,4.87281757,4.902054476,4.931466803,4.961055603,4.990821937,5.020766869,5.05089147,5.081196819,5.111684 +New England,cng_dol_per_gge,2.351693736,2.294616211,2.27253363,2.219200691,2.15320841,2.124736893,2.11301743,2.089997286,2.070697404,2.032782827,1.985930199,1.944026897,1.915041489,1.889570942,1.882080097,1.870963711,1.852771787,1.830948917,1.830157942,1.823911345,1.814495956,1.804292808,1.806041938,1.803654983,1.800391468,1.793929432,1.797600789,1.800654655,1.80751604,1.805008753,1.81698767,1.820511926,1.805947831,1.791500248,1.777168246,1.7629509,1.748847293,1.734856515,1.720977662,1.707209841,1.693552162,1.680003745,1.666563715,1.653231205,1.640005356,1.626885313,1.61387023,1.600959269,1.588151594,1.575446382,1.562842811,1.550340068,1.537937348,1.525633849,1.513428778,1.501321348,1.489310777,1.477396291,1.465577121,1.453852504,1.442221684,1.43068391,1.419238439,1.407884531,1.396621455,1.385448483,1.374364896,1.363369976,1.352463017,1.341643312,1.330910166,1.320262885,1.309700782,1.299223175,1.28882939,1.278518755,1.268290605,1.25814428,1.248079126,1.238094493,1.228189737,1.218364219 +New England,electricity_dol_per_kwh,0.158978759,0.159764467,0.162082573,0.163773216,0.164656852,0.168078747,0.172857007,0.17546556,0.178654367,0.176466757,0.174183637,0.168720408,0.167194677,0.167355942,0.16933367,0.16968122,0.167516361,0.167019563,0.168023534,0.169344306,0.169583927,0.168821918,0.168257751,0.167712418,0.166754161,0.16602546,0.165365132,0.164604792,0.163927582,0.162613276,0.161193222,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534,0.160082534 +New England,hydrogen_dol_per_gge,10.6,10,9.4,8.8,8.2,7.6,7,6.88,6.76,6.64,6.52,6.4,6.28,6.16,6.04,5.92,5.8,5.68,5.56,5.44,5.32,5.2,5.08,4.96,4.84,4.72,4.6,4.48,4.36,4.24,4.12,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +United States,gasoline_dol_per_gal,2.667821,2.264015,2.364008242,2.408478992,2.470851717,2.477406536,2.52038644,2.542343964,2.571508831,2.636365735,2.680501109,2.80991093,2.822286914,2.880193865,2.902126278,2.940984717,2.963479835,3.001434037,3.03318413,3.073175704,3.078134403,3.131155572,3.160495733,3.180246144,3.199836594,3.211347818,3.191514951,3.234819367,3.248566436,3.260913326,3.255028899,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911 +United States,diesel_dol_per_gal,3.039967,2.54226434,2.53451309,2.641683529,2.860466274,2.953921224,3.02171182,3.080664452,3.133726356,3.186095454,3.217255657,3.321468041,3.356468708,3.397352336,3.415903045,3.429954603,3.447986574,3.455369159,3.49196238,3.518546316,3.518305949,3.571702259,3.603483144,3.622593647,3.656593732,3.664521408,3.658496419,3.700617112,3.715860658,3.717653772,3.734692928,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117 +United States,cng_dol_per_gge,1.757059748,1.596670639,1.662486523,1.730404768,1.676432291,1.621196434,1.592654006,1.575481017,1.550704191,1.527387791,1.504877982,1.565030556,1.532027097,1.522463836,1.507077885,1.490006856,1.47372573,1.458578297,1.444121508,1.437653694,1.426245483,1.420844003,1.411825135,1.404271111,1.396583227,1.390730846,1.387044505,1.384736631,1.384551485,1.385708244,1.389791869,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041 +United States,electricity_dol_per_kwh,0.12559407,0.237768062,0.248335114,0.243064981,0.238469355,0.234950988,0.234850111,0.236372996,0.236993353,0.237516511,0.238341925,0.23778225,0.23869352,0.238513536,0.239940485,0.24032322,0.239657959,0.238971993,0.23839753,0.237476419,0.236390466,0.235611697,0.234708049,0.233772205,0.231685427,0.230476937,0.229402825,0.22803851,0.226933081,0.226073641,0.225022077,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733 +United States,hydrogen_dol_per_gge,13.39552294,9.273823571,8.861653634,8.449483698,8.037313761,7.625143825,7.212973888,6.800803952,6.388634016,5.976464079,5.564294143,5.152124206,5.049081722,4.946039238,4.842996754,4.73995427,4.636911785,4.533869301,4.430826817,4.327784333,4.224741849,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365 +United States T2CO,diesel_dol_per_gal,3.039967,2.54226434,2.53451309,2.641683529,2.860466274,2.953921224,3.02171182,3.080664452,3.133726356,3.186095454,3.217255657,3.321468041,3.356468708,3.397352336,3.415903045,3.429954603,3.447986574,3.455369159,3.49196238,3.518546316,3.518305949,3.571702259,3.603483144,3.622593647,3.656593732,3.664521408,3.658496419,3.700617112,3.715860658,3.717653772,3.734692928,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117 +United States T2CO,electricity_dol_per_kwh,0.12559407,0.237768062,0.248335114,0.243064981,0.238469355,0.234950988,0.234850111,0.236372996,0.236993353,0.237516511,0.238341925,0.23778225,0.23869352,0.238513536,0.239940485,0.24032322,0.239657959,0.238971993,0.23839753,0.237476419,0.236390466,0.235611697,0.234708049,0.233772205,0.231685427,0.230476937,0.229402825,0.22803851,0.226933081,0.226073641,0.225022077,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733 +United States,e85_dol_per_gal,2.32936,2.109573042,2.218314415,2.380242902,2.406835909,2.407755842,2.446034317,2.463548197,2.492887278,2.561266705,2.607134725,2.718891722,2.733425136,2.791238359,2.815604855,2.857284898,2.881304417,2.921253075,2.954474725,2.995722748,3.002051593,3.055770593,3.086220626,3.107088995,3.126842205,3.138940662,3.120333161,3.164428427,3.178800072,3.192253787,3.187126945,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881 +FY21TechSuccess,gasoline_dol_per_gal,2.667821,2.264015,2.364008242,2.408478992,2.470851717,2.477406536,2.52038644,2.542343964,2.571508831,2.636365735,2.680501109,2.80991093,2.822286914,2.880193865,2.902126278,2.940984717,2.963479835,3.001434037,3.03318413,3.073175704,3.078134403,3.131155572,3.160495733,3.180246144,3.199836594,3.211347818,3.191514951,3.234819367,3.248566436,3.260913326,3.255028899,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911 +FY21TechSuccess,diesel_dol_per_gal,3.039967,2.54226434,2.53451309,2.641683529,2.860466274,2.953921224,3.02171182,3.080664452,3.133726356,3.186095454,3.217255657,3.321468041,3.356468708,3.397352336,3.415903045,3.429954603,3.447986574,3.455369159,3.49196238,3.518546316,3.518305949,3.571702259,3.603483144,3.622593647,3.656593732,3.664521408,3.658496419,3.700617112,3.715860658,3.717653772,3.734692928,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117 +FY21TechSuccess,cng_dol_per_gge,1.757059748,1.596670639,1.662486523,1.730404768,1.676432291,1.621196434,1.592654006,1.575481017,1.550704191,1.527387791,1.504877982,1.565030556,1.532027097,1.522463836,1.507077885,1.490006856,1.47372573,1.458578297,1.444121508,1.437653694,1.426245483,1.420844003,1.411825135,1.404271111,1.396583227,1.390730846,1.387044505,1.384736631,1.384551485,1.385708244,1.389791869,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041 +FY21TechSuccess,electricity_dol_per_kwh,0.12559407,0.237768062,0.248335114,0.243064981,0.238469355,0.234950988,0.234850111,0.236372996,0.236993353,0.237516511,0.238341925,0.23778225,0.23869352,0.238513536,0.239940485,0.24032322,0.239657959,0.238971993,0.23839753,0.237476419,0.236390466,0.235611697,0.234708049,0.233772205,0.231685427,0.230476937,0.229402825,0.22803851,0.226933081,0.226073641,0.225022077,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733 +FY21TechSuccess,hydrogen_dol_per_gge,13.39552294,9.273823571,8.861653634,8.449483698,8.037313761,7.625143825,7.212973888,6.594718984,5.976464079,5.358209174,4.73995427,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365 +FY21TechSuccess,e85_dol_per_gal,2.32936,2.109573042,2.218314415,2.380242902,2.406835909,2.407755842,2.446034317,2.463548197,2.492887278,2.561266705,2.607134725,2.718891722,2.733425136,2.791238359,2.815604855,2.857284898,2.881304417,2.921253075,2.954474725,2.995722748,3.002051593,3.055770593,3.086220626,3.107088995,3.126842205,3.138940662,3.120333161,3.164428427,3.178800072,3.192253787,3.187126945,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881 +FY21NoProgram,gasoline_dol_per_gal,2.667821,2.264015,2.364008242,2.408478992,2.470851717,2.477406536,2.52038644,2.542343964,2.571508831,2.636365735,2.680501109,2.80991093,2.822286914,2.880193865,2.902126278,2.940984717,2.963479835,3.001434037,3.03318413,3.073175704,3.078134403,3.131155572,3.160495733,3.180246144,3.199836594,3.211347818,3.191514951,3.234819367,3.248566436,3.260913326,3.255028899,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911,3.257930911 +FY21NoProgram,diesel_dol_per_gal,3.039967,2.54226434,2.53451309,2.641683529,2.860466274,2.953921224,3.02171182,3.080664452,3.133726356,3.186095454,3.217255657,3.321468041,3.356468708,3.397352336,3.415903045,3.429954603,3.447986574,3.455369159,3.49196238,3.518546316,3.518305949,3.571702259,3.603483144,3.622593647,3.656593732,3.664521408,3.658496419,3.700617112,3.715860658,3.717653772,3.734692928,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117,3.730964117 +FY21NoProgram,cng_dol_per_gge,1.757059748,1.596670639,1.662486523,1.730404768,1.676432291,1.621196434,1.592654006,1.575481017,1.550704191,1.527387791,1.504877982,1.565030556,1.532027097,1.522463836,1.507077885,1.490006856,1.47372573,1.458578297,1.444121508,1.437653694,1.426245483,1.420844003,1.411825135,1.404271111,1.396583227,1.390730846,1.387044505,1.384736631,1.384551485,1.385708244,1.389791869,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041,1.39229041 +FY21NoProgram,electricity_dol_per_kwh,0.12559407,0.237768062,0.248335114,0.243064981,0.238469355,0.234950988,0.234850111,0.236372996,0.236993353,0.237516511,0.238341925,0.23778225,0.23869352,0.238513536,0.239940485,0.24032322,0.239657959,0.238971993,0.23839753,0.237476419,0.236390466,0.235611697,0.234708049,0.233772205,0.231685427,0.230476937,0.229402825,0.22803851,0.226933081,0.226073641,0.225022077,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733,0.223272733 +FY21NoProgram,hydrogen_dol_per_gge,13.39552294,9.273823571,9.067738603,8.861653634,8.655568666,8.449483698,8.24339873,8.037313761,7.831228793,7.625143825,7.419058857,7.212973888,7.00688892,6.800803952,6.594718984,6.388634016,6.182549047,5.976464079,5.770379111,5.564294143,5.358209174,5.152124206,5.049081722,4.946039238,4.842996754,4.73995427,4.636911785,4.533869301,4.430826817,4.327784333,4.224741849,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365,4.121699365 +FY21NoProgram,e85_dol_per_gal,2.32936,2.109573042,2.218314415,2.380242902,2.406835909,2.407755842,2.446034317,2.463548197,2.492887278,2.561266705,2.607134725,2.718891722,2.733425136,2.791238359,2.815604855,2.857284898,2.881304417,2.921253075,2.954474725,2.995722748,3.002051593,3.055770593,3.086220626,3.107088995,3.126842205,3.138940662,3.120333161,3.164428427,3.178800072,3.192253787,3.187126945,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881,3.190509881 +FY22NoProgram,gasoline_dol_per_gal,2.667821,2.264015,3.232355936,3.099445486,2.77340515,2.755122396,2.727299852,2.756087319,2.789028144,2.819176133,2.840333894,2.910524364,3.003742657,3.034235342,3.05936961,3.083085073,3.094689786,3.1166894,3.136223364,3.170620765,3.172299969,3.19721186,3.217466984,3.222593269,3.254573924,3.285350895,3.295881123,3.322274731,3.33250779,3.323551956,3.325518197,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202 +FY22NoProgram,diesel_dol_per_gal,3.039967,2.54226434,3.288893791,3.163300386,3.051355061,3.159781567,3.156189792,3.152807315,3.161005456,3.185832617,3.204481664,3.199388046,3.284448872,3.2978742,3.316060128,3.321583162,3.335361342,3.360581302,3.388365131,3.40694039,3.419198557,3.44745355,3.463383384,3.465061931,3.501223102,3.540905311,3.555158677,3.58038155,3.588656114,3.581645662,3.578725749,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042 +FY22NoProgram,cng_dol_per_gge,1.757059748,1.596670639,1.831534346,1.829450163,1.739923215,1.671976268,1.621590415,1.584474471,1.557738168,1.54080393,1.524365223,1.504573112,1.586783156,1.564036368,1.563914049,1.545126133,1.523232455,1.508833531,1.496010877,1.484555874,1.472936278,1.469392516,1.463844492,1.453700233,1.44954675,1.442491495,1.437035398,1.433214854,1.42961431,1.42387155,1.419008289,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501 +FY22NoProgram,electricity_dol_per_kwh,0.12559407,0.237768062,0.265928557,0.270498702,0.261089548,0.253729255,0.253963369,0.256065732,0.256788553,0.257331383,0.257572785,0.256433963,0.257088289,0.257706098,0.258425739,0.258131257,0.255955144,0.25409041,0.252592235,0.251089999,0.249708635,0.24858093,0.247243815,0.246018338,0.24427212,0.242571025,0.24153149,0.2403254,0.238856072,0.237723241,0.236505046,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068 +FY22NoProgram,hydrogen_dol_per_gge,13.39552294,9.93692531,9.716104747,9.495284185,9.274463622,9.05364306,8.832822497,8.612001935,8.391181373,8.17036081,7.949540248,7.728719685,7.507899123,7.28707856,7.066257998,6.845437436,6.624616873,6.403796311,6.182975748,5.962155186,5.741334623,5.520514061,5.41010378,5.299693498,5.189283217,5.078872936,4.968462655,4.858052374,4.747642092,4.637231811,4.52682153,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249 +FY22NoProgram,e85_dol_per_gal,2.32936,2.109573042,2.096746027,2.096205346,2.108251382,2.089965149,2.065032595,2.088154934,2.115042298,2.141099462,2.160003,2.216314344,2.276425637,2.305901189,2.319500971,2.358489941,2.372518858,2.375909582,2.386873032,2.417581315,2.416719211,2.435733235,2.453192126,2.45477639,2.478698083,2.502822226,2.511262685,2.532775382,2.541457704,2.535158021,2.537609366,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325 +FY22TechSuccess,gasoline_dol_per_gal,2.667821,2.264015,3.232355936,3.099445486,2.77340515,2.755122396,2.727299852,2.756087319,2.789028144,2.819176133,2.840333894,2.910524364,3.003742657,3.034235342,3.05936961,3.083085073,3.094689786,3.1166894,3.136223364,3.170620765,3.172299969,3.19721186,3.217466984,3.222593269,3.254573924,3.285350895,3.295881123,3.322274731,3.33250779,3.323551956,3.325518197,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202,3.324867202 +FY22TechSuccess,diesel_dol_per_gal,3.039967,2.54226434,3.288893791,3.163300386,3.051355061,3.159781567,3.156189792,3.152807315,3.161005456,3.185832617,3.204481664,3.199388046,3.284448872,3.2978742,3.316060128,3.321583162,3.335361342,3.360581302,3.388365131,3.40694039,3.419198557,3.44745355,3.463383384,3.465061931,3.501223102,3.540905311,3.555158677,3.58038155,3.588656114,3.581645662,3.578725749,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042,3.570270042 +FY22TechSuccess,cng_dol_per_gge,1.757059748,1.596670639,1.831534346,1.829450163,1.739923215,1.671976268,1.621590415,1.584474471,1.557738168,1.54080393,1.524365223,1.504573112,1.586783156,1.564036368,1.563914049,1.545126133,1.523232455,1.508833531,1.496010877,1.484555874,1.472936278,1.469392516,1.463844492,1.453700233,1.44954675,1.442491495,1.437035398,1.433214854,1.42961431,1.42387155,1.419008289,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501,1.413655501 +FY22TechSuccess,electricity_dol_per_kwh,0.12559407,0.237768062,0.265928557,0.270498702,0.261089548,0.253729255,0.253963369,0.256065732,0.256788553,0.257331383,0.257572785,0.256433963,0.257088289,0.257706098,0.258425739,0.258131257,0.255955144,0.25409041,0.252592235,0.251089999,0.249708635,0.24858093,0.247243815,0.246018338,0.24427212,0.242571025,0.24153149,0.2403254,0.238856072,0.237723241,0.236505046,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068,0.234996068 +FY22TechSuccess,hydrogen_dol_per_gge,13.39552294,9.93692531,9.495284185,9.05364306,8.612001935,8.17036081,7.728719685,7.28707856,6.845437436,6.403796311,5.962155186,5.520514061,5.41010378,5.299693498,5.189283217,5.078872936,4.968462655,4.858052374,4.747642092,4.637231811,4.52682153,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249 +FY22TechSuccess,e85_dol_per_gal,2.32936,2.109573042,2.096746027,2.096205346,2.108251382,2.089965149,2.065032595,2.088154934,2.115042298,2.141099462,2.160003,2.216314344,2.276425637,2.305901189,2.319500971,2.358489941,2.372518858,2.375909582,2.386873032,2.417581315,2.416719211,2.435733235,2.453192126,2.45477639,2.478698083,2.502822226,2.511262685,2.532775382,2.541457704,2.535158021,2.537609366,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325,2.537356325 +AEO2023NoTaxes,gasoline_dol_per_gal,,,,3.630191,3.118264,2.786285,2.573572,2.545253,2.530096,2.533875,2.542762,2.556915,2.55617,2.575692,2.58673,2.600774,2.611039,2.647436,2.655259,2.667901,2.684505,2.691646,2.694711,2.705702,2.695939,2.719227,2.721342,2.777465,2.780017,2.808998,2.820143,2.85132,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +AEO2023NoTaxes,diesel_dol_per_gal,,,,4.534457,3.95697,3.73079,3.445461,3.32293,3.199108,3.096978,3.114693,3.122572,3.148627,3.170337,3.191192,3.202062,3.23476,3.239661,3.262592,3.28023,3.289756,3.299955,3.326997,3.331949,3.351907,3.342346,3.351127,3.39162,3.398527,3.408837,3.421015,3.425328,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +FY22HFTOGoal,hydrogen_dol_per_gge,13.39552294,9.93692531,9.495284185,9.05364306,8.612001935,8.17036081,7.728719685,7.28707856,6.845437436,6.403796311,5.962155186,5.520514061,5.299693499,5.078872936,4.858052374,4.637231811,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249,4.416411249 +AEO2023Commercial,electricity_dol_per_kwh,,,,0.125126187,0.122496976,0.117181012,0.1121662,0.109373807,0.107347419,0.105643055,0.104810247,0.104685414,0.104628622,0.104523249,0.105709899,0.106494121,0.10624195,0.106567878,0.106944322,0.107793577,0.108352386,0.108812158,0.109166581,0.109224157,0.109248302,0.10912252,0.108946624,0.108343269,0.107444501,0.107062519,0.106208662,0.10510263,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +AEO2023Commercialx2,electricity_dol_per_kwh,,,,0.250252374,0.244993952,0.234362024,0.2243324,0.218747614,0.214694838,0.21128611,0.209620494,0.209370828,0.209257244,0.209046498,0.211419798,0.212988242,0.2124839,0.213135756,0.213888644,0.215587154,0.216704772,0.217624316,0.218333162,0.218448314,0.218496604,0.21824504,0.217893248,0.216686538,0.214889002,0.214125038,0.212417324,0.21020526,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/src/t3co/resources/cost_toggles.json b/src/t3co/resources/cost_toggles.json index f19e4864..e047633f 100644 --- a/src/t3co/resources/cost_toggles.json +++ b/src/t3co/resources/cost_toggles.json @@ -11,6 +11,7 @@ }, "OperatingCosts": { "fuel_cost": true, + "eia_fuel_prices": true, "maintenance_oper_cost": true, "insurance_cost": true, "purchasing_cost": true, diff --git a/src/t3co/resources/inputs/Demo_FY22_vehicle_model_assumptions.csv b/src/t3co/resources/inputs/Demo_FY22_vehicle_model_assumptions.csv index 37fb81a8..cf350329 100644 --- a/src/t3co/resources/inputs/Demo_FY22_vehicle_model_assumptions.csv +++ b/src/t3co/resources/inputs/Demo_FY22_vehicle_model_assumptions.csv @@ -331,4 +331,6 @@ selection,scenario_name,veh_year,veh_pt_type,drag_coef,frontal_area_m2,veh_overr 330,"Class 8 Sleeper cab high roof (BEV dWPT, 2040, no program)",2040,BEV,0.68,10.4,NA,-1,-1,FALSE,FALSE,11776,-0.46,0.8,5.88,17236,1.2,0,1,0,12.67,0,"[0.,0.005,0.015,0.04,0.06,0.1,0.14,0.2,0.4,0.6,0.8,1.]","[0.04,0.06,0.11,0.2,0.25,0.33,0.37,0.41,0.44,0.45,0.45,0.45]",SI,6,0,0.26,30,0,333.57,"[0.,0.02,0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1.]","[0.83,0.85,0.87,0.89,0.9,0.91,0.93,0.94,0.94,0.93,0.92]",4,0.25,0,349.02,200,2.95,75,0.97,130,-0.6811,0.05,0.95,0,0,11.84,18,0.005229,0.506,0.6,60,0.2,0,NA,NA,0.9,1,0.98,2.86,300,0.98,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 331,"Class 8 Sleeper cab high roof (BEV dWPT, 2040, program success)",2040,BEV,0.68,10.4,NA,-1,-1,FALSE,FALSE,11776,-0.46,0.8,5.88,17236,1.2,0,1,0,12.67,0,"[0.,0.005,0.015,0.04,0.06,0.1,0.14,0.2,0.4,0.6,0.8,1.]","[0.04,0.06,0.11,0.2,0.25,0.33,0.37,0.41,0.44,0.45,0.45,0.45]",SI,6,0,0.26,30,0,333.57,"[0.,0.02,0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1.]","[0.83,0.85,0.87,0.89,0.9,0.91,0.93,0.94,0.94,0.93,0.92]",4,0.17,0,349.02,200,2.57,75,0.97,130,-0.6811,0.05,0.95,0,0,11.84,18,0.005,0.506,0.6,60,0.2,0,NA,NA,0.9,1,0.98,2.86,300,0.98,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 332,"Class 8 Sleeper cab high roof (BEV dWPT, 2030, no program)",2030,BEV,0.68,10.4,NA,-1,-1,FALSE,FALSE,11776,-0.46,0.8,5.88,17236,1.2,0,1,0,12.67,0,"[0.,0.005,0.015,0.04,0.06,0.1,0.14,0.2,0.4,0.6,0.8,1.]","[0.04,0.06,0.11,0.2,0.25,0.33,0.37,0.41,0.44,0.45,0.45,0.45]",SI,6,0,0.26,30,0,337.51,"[0.,0.02,0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1.]","[0.83,0.85,0.87,0.89,0.9,0.91,0.93,0.94,0.94,0.93,0.92]",4,0.33,0,357.54,1492.02,3.67,75,0.97,130,-0.6811,0.05,0.95,0,0,11.84,18,0.005733875,0.506,0.6,60,0.2,0,NA,NA,0.9,1,0.98,3.03,300,0.98,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -333,"Class 8 Sleeper cab high roof (BEV dWPT, 2030, program success)",2030,BEV,0.68,10.4,NA,-1,-1,FALSE,FALSE,11776,-0.46,0.8,5.88,17236,1.2,0,1,0,12.67,0,"[0.,0.005,0.015,0.04,0.06,0.1,0.14,0.2,0.4,0.6,0.8,1.]","[0.04,0.06,0.11,0.2,0.25,0.33,0.37,0.41,0.44,0.45,0.45,0.45]",SI,6,0,0.26,30,0,337.51,"[0.,0.02,0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1.]","[0.83,0.85,0.87,0.89,0.9,0.91,0.93,0.94,0.94,0.93,0.92]",4,0.22,0,357.54,1492.02,3.3,75,0.97,130,-0.6811,0.05,0.95,0,0,11.84,18,0.005721875,0.506,0.6,60,0.2,0,NA,NA,0.9,1,0.98,3.03,300,0.98,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file +333,"Class 8 Sleeper cab high roof (BEV dWPT, 2030, program success)",2030,BEV,0.68,10.4,NA,-1,-1,FALSE,FALSE,11776,-0.46,0.8,5.88,17236,1.2,0,1,0,12.67,0,"[0.,0.005,0.015,0.04,0.06,0.1,0.14,0.2,0.4,0.6,0.8,1.]","[0.04,0.06,0.11,0.2,0.25,0.33,0.37,0.41,0.44,0.45,0.45,0.45]",SI,6,0,0.26,30,0,337.51,"[0.,0.02,0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1.]","[0.83,0.85,0.87,0.89,0.9,0.91,0.93,0.94,0.94,0.93,0.92]",4,0.22,0,357.54,1492.02,3.3,75,0.97,130,-0.6811,0.05,0.95,0,0,11.84,18,0.005721875,0.506,0.6,60,0.2,0,NA,NA,0.9,1,0.98,3.03,300,0.98,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +334,"Class 8 Sleeper cab low roof (Diesel, 2035, EIA commercial)",2035,Conv,0.466877368,6.9,NA,-1,-1,FALSE,FALSE,11275.32261,-0.46,0.8,5.88,17236,1.2,5000,1,11385,12.67,332.5794028,"[0.,0.005,0.015,0.04,0.06,0.1,0.14,0.2,0.4,0.6,0.8,1.]","[0.04535994, 0.06803991000000001, 0.12473983500000001, 0.2267997, 0.283499625, 0.374219505, 0.41957944999999996, 0.46493938999999995, 0.498959345, 0.51029933, 0.51029933, 0.51029933]",HD_Diesel,6,0,0.26,5,0,0,"[0.,0.02,0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1.]","[0.83,0.85,0.87,0.89,0.9,0.91,0.93,0.94,0.94,0.93,0.92]",1,0.29,0,0,0,3.31,75,0.97,130,-0.6811,0.05,0.95,0,0,11.84,18,0.005659208,0.506,0.6,60,0.2,0,55,9999,0.9,1,0.98,2.945,300,0.98,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +335,"Class 8 Sleeper cab high roof (BEV, 2035, EIA commercial)",2035,BEV,0.68,10.4,NA,-1,-1,FALSE,FALSE,11776,-0.46,0.8,5.88,17236,1.2,0,1,0,12.67,0,"[0.,0.005,0.015,0.04,0.06,0.1,0.14,0.2,0.4,0.6,0.8,1.]","[0.04,0.06,0.11,0.2,0.25,0.33,0.37,0.41,0.44,0.45,0.45,0.45]",SI,6,0,0.26,5,0,344.63,"[0.,0.02,0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1.]","[0.83,0.85,0.87,0.89,0.9,0.91,0.93,0.94,0.94,0.93,0.92]",1,0.58,0,366.75,1628.14,4.39,75,0.97,130,-0.6811,0.05,0.95,0,0,11.84,18,0.005931667,0.506,0.6,60,0.2,0,NA,9999,0.9,1,0.98,3.23,300,0.97,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/src/t3co/utils/__init__.py b/src/t3co/utils/__init__.py index e69de29b..85b753c5 100644 --- a/src/t3co/utils/__init__.py +++ b/src/t3co/utils/__init__.py @@ -0,0 +1,92 @@ +from typing import Dict + + +STATE_TO_FUEL_PRICE_REGION: Dict[str, str] = { + "CT": "New England", + "ME": "New England", + "MA": "New England", + "NH": "New England", + "RI": "New England", + "VT": "New England", + "NJ": "Middle Atlantic", + "NY": "Middle Atlantic", + "PA": "Middle Atlantic", + "IL": "East North Central", + "IN": "East North Central", + "MI": "East North Central", + "OH": "East North Central", + "WI": "East North Central", + "IA": "West North Central", + "KS": "West North Central", + "MN": "West North Central", + "MO": "West North Central", + "NE": "West North Central", + "ND": "West North Central", + "SD": "West North Central", + "DE": "South Atlantic", + "DC": "South Atlantic", + "FL": "South Atlantic", + "GA": "South Atlantic", + "MD": "South Atlantic", + "NC": "South Atlantic", + "SC": "South Atlantic", + "VA": "South Atlantic", + "WV": "South Atlantic", + "AL": "East South Central", + "KY": "East South Central", + "MS": "East South Central", + "TN": "East South Central", + "AR": "West South Central", + "LA": "West South Central", + "OK": "West South Central", + "TX": "West South Central", + "AZ": "Mountain", + "CO": "Mountain", + "ID": "Mountain", + "MT": "Mountain", + "NM": "Mountain", + "NV": "Mountain", + "UT": "Mountain", + "WY": "Mountain", + "AK": "Pacific", + "CA": "Pacific", + "HI": "Pacific", + "OR": "Pacific", + "WA": "Pacific", +} + + +def resolve_fuel_price_region_from_zipcode(zipcode: str) -> str: + """ + Resolves a 5-digit US zipcode to the configured fuel price region. + """ + zipcode_details = lookup_zipcode(zipcode) + state_code = zipcode_details.get("state") + if not state_code: + raise ValueError(f"Zipcode '{zipcode}' could not be resolved to a US state") + + try: + return STATE_TO_FUEL_PRICE_REGION[state_code] + except KeyError as exc: + raise ValueError( + f"Zipcode '{zipcode}' resolved to unsupported state '{state_code}'" + ) from exc + + +def lookup_zipcode(zipcode: str) -> dict: + """ + Uses the external zipcode dataset to resolve a US zipcode record. + """ + try: + import zipcodes + except ImportError as exc: + raise ImportError( + "The 'zipcodes' package is required for zipcode-based fuel price overrides. " + "Install T3CO with its default dependencies to enable this feature." + ) from exc + + matches = zipcodes.filter_by(zipcodes.list_all(), zip_code=zipcode) + if not matches: + raise ValueError(f"Zipcode '{zipcode}' was not found in the zipcode dataset") + + return matches[0] diff --git a/tests/cli/test_sweep.py b/tests/cli/test_sweep.py index a7e65e11..4d1a6f5d 100644 --- a/tests/cli/test_sweep.py +++ b/tests/cli/test_sweep.py @@ -1,9 +1,14 @@ from pathlib import Path +from types import SimpleNamespace +from unittest.mock import patch import pandas as pd import pytest from t3co.cli.sweep import ( + _build_optimization_algorithm, + _build_optimization_termination, + apply_cli_overrides, create_results_filepath, export_results_to_csv, generate_ledger, @@ -51,7 +56,7 @@ def scenario(config, toggles): scenario.fuel_prices_df = pd.DataFrame( { - "Fuel": ["dieselDolPerGal"], + "Fuel": ["diesel_dol_per_gal"], "Region": ["US"], "2020": [0.1], "2021": [0.1], @@ -97,9 +102,6 @@ def config(toggles): return config -from unittest.mock import patch - - def test_load_vehicle_scenario_energy(config, vehicle, scenario, energy): with ( patch("t3co.input_data.vehicle.Vehicle.from_config", return_value=vehicle), @@ -120,14 +122,27 @@ def test_load_vehicle_scenario_energy(config, vehicle, scenario, energy): def test_generate_ledger(config, vehicle, scenario, energy): + config.skip_all_opt = False + optimized_vehicle = Vehicle() + optimized_energy = Energy(mpgge=8.5, primary_fuel_range_mi=2500.0) + with ( patch( "t3co.cli.sweep.load_vehicle_scenario_energy", return_value=(vehicle, scenario, energy), ), - patch("t3co.tco.ledger.Ledger.to_dict", return_value={"key": "value"}), + patch( + "t3co.cli.sweep.run_optimization", + return_value=(optimized_vehicle, optimized_energy), + ), + patch("t3co.cli.sweep.Ledger") as mock_ledger, ): + mock_ledger.return_value.to_dict.return_value = {"key": "value"} result = generate_ledger(selection=1, config=config) + + ledger_kwargs = mock_ledger.call_args.kwargs + assert ledger_kwargs["vehicle"] is optimized_vehicle + assert ledger_kwargs["energy"] is optimized_energy assert result == {"key": "value"} @@ -173,13 +188,90 @@ def test_run_t3co(config): assert mock_generate_ledger.called assert mock_export.called -def test_load_vehicle_scenario_energy_no_fastsim_missing_data(config, vehicle, scenario): + +def test_apply_cli_overrides_updates_explicit_runtime_args(config): + args = SimpleNamespace( + vehicles="/tmp/vehicle.csv", + scenarios="/tmp/scenario.csv", + eng_curves="/tmp/eng.csv", + lw_curves="/tmp/lw.csv", + aero_curves="/tmp/aero.csv", + dst_dir="/tmp/results", + algorithms=["NSGA2"], + x_tol=0.01, + f_tol=0.02, + n_max_gen=12, + pop_size=44, + nth_gen=3, + n_last=7, + selections=[[99]], + drive_cycle=["/tmp/cycle.csv"], + skip_all_opt=True, + ) + + apply_cli_overrides( + config=config, + args=args, + argv=[ + "--vehicles", + "--scenarios", + "--dst-dir", + "--algorithms", + "--x-tol", + "--f-tol", + "--n-max-gen", + "--pop-size", + "--nth-gen", + "--n-last", + "--selections", + "--drive-cycle", + "--skip-all-opt", + ], + ) + + assert config.vehicle_file == "/tmp/vehicle.csv" + assert config.scenario_file == "/tmp/scenario.csv" + assert config.dst_dir == "/tmp/results" + assert config.algorithms == ["NSGA2"] + assert config.x_tol == pytest.approx(0.01) + assert config.f_tol == pytest.approx(0.02) + assert config.n_max_gen == 12 + assert config.pop_size == 44 + assert config.nth_gen == 3 + assert config.n_last == 7 + assert config.selections == [99] + assert config.drive_cycle == "/tmp/cycle.csv" + assert config.skip_all_opt is True + + +def test_build_optimization_settings_use_config_values(config): + config.algorithms = ["NSGA2"] + config.pop_size = 17 + config.x_tol = 0.015 + config.f_tol = 0.025 + config.nth_gen = 2 + config.n_last = 6 + config.n_max_gen = 33 + + algorithm = _build_optimization_algorithm(config) + termination = _build_optimization_termination(config) + + assert algorithm.__class__.__name__ == "NSGA2" + assert algorithm.pop_size == 17 + assert termination.criteria[0].termination.tol == pytest.approx(0.015) + assert termination.criteria[2].termination.tol == pytest.approx(0.025) + assert termination.max_gen.n_max_gen == 33 + + +def test_load_vehicle_scenario_energy_no_fastsim_missing_data( + config, vehicle, scenario +): # Ensure run_fastsim is False scenario.cost_toggles.run_fastsim = False # Ensure scenario has no energy data scenario.mpgge = None scenario.primary_fuel_range_mi = None - + with ( patch("t3co.input_data.vehicle.Vehicle.from_config", return_value=vehicle), patch("t3co.input_data.scenario.Scenario.from_csv", return_value=scenario), @@ -191,7 +283,7 @@ def test_load_vehicle_scenario_energy_no_fastsim_missing_data(config, vehicle, s scenario=scenario, energy=None, ) - + assert veh == vehicle assert scen == scenario # Check that we got an empty Energy object (or default values) diff --git a/tests/cost_models/test_operating_costs.py b/tests/cost_models/test_operating_costs.py index 95d80bdd..00968e59 100644 --- a/tests/cost_models/test_operating_costs.py +++ b/tests/cost_models/test_operating_costs.py @@ -90,7 +90,7 @@ def scenario(toggles): activate_mr_downtime_cost=False, fuel_prices_df=pd.DataFrame( { - "Fuel": ["dolPerKwh"], + "Fuel": ["electricity_dol_per_kwh"], "Region": ["US"], "2020": [0.1], "2021": [0.1], @@ -268,6 +268,29 @@ def test_set_purchasing_payment_cost_loan(scenario, cap_costs): assert operating_costs.purchasing_cost_dol_per_yr == pytest.approx(4547.56, 0.01) +def test_set_purchasing_payment_cost_loan_with_missing_terms(scenario, cap_costs): + scenario.purchasing_method = "loan" + scenario.purchasing_interest_apr_pct_per_yr = 0.05 + scenario.purchasing_payment_frequency_months = 0 + scenario.purchasing_term_yr = 0 + operating_costs = OperatingCosts.__new__( + OperatingCosts, + year_number=1, + cap_costs=cap_costs, + vehicle=None, + scenario=scenario, + energy=None, + oppy_costs=None, + ) + + operating_costs.set_purchasing_payment_cost( + year_number=1, scenario=scenario, cap_costs=cap_costs + ) + + assert operating_costs.purchasing_payment_dol_per_yr == pytest.approx(0.0, 0.01) + assert operating_costs.purchasing_cost_dol_per_yr == pytest.approx(0.0, 0.01) + + def test_set_purchasing_payment_cost_lease(scenario, cap_costs): scenario.purchasing_method = "lease" scenario.purchasing_term_yr = 3 @@ -295,6 +318,31 @@ def test_set_purchasing_payment_cost_lease(scenario, cap_costs): assert operating_costs.purchasing_cost_dol_per_yr == pytest.approx(700.60, 0.01) +def test_set_purchasing_payment_cost_lease_with_missing_term(scenario, cap_costs): + scenario.purchasing_method = "lease" + scenario.purchasing_term_yr = 0 + scenario.leasing_money_factor = 0.002 + operating_costs = OperatingCosts.__new__( + OperatingCosts, + year_number=1, + cap_costs=cap_costs, + vehicle=None, + scenario=scenario, + energy=None, + oppy_costs=None, + ) + + operating_costs.set_purchasing_payment_cost( + year_number=1, scenario=scenario, cap_costs=cap_costs + ) + + assert operating_costs.purchasing_payment_dol_per_yr == pytest.approx(0.0, 0.01) + assert operating_costs.purchasing_cost_dol_per_yr == pytest.approx(0.0, 0.01) + assert operating_costs.purchasing_tax_amount_dol_per_year == pytest.approx( + 0.0, 0.01 + ) + + def test_set_net_oper_cost(vehicle, scenario, energy, cap_costs, oppy_costs): scenario.fuel_prices_df.set_index("Fuel", inplace=True) diff --git a/tests/data_fetching/__init__.py b/tests/data_fetching/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/data_fetching/test_eia_client.py b/tests/data_fetching/test_eia_client.py new file mode 100644 index 00000000..e73d62fb --- /dev/null +++ b/tests/data_fetching/test_eia_client.py @@ -0,0 +1,347 @@ +"""Tests for the EIA API client module.""" + +import json +from unittest.mock import MagicMock, patch + +import numpy as np +import pandas as pd +import pytest + +from t3co.data_fetching.eia_client import ( + AEO_REGION_ID_TO_T3CO, + AEO_SERIES_TO_FUEL, + EIAClient, + EIAClientError, + T3CO_YEAR_RANGE, + build_fuel_prices_df_from_eia, +) + + +# ── Fixtures ───────────────────────────────────────────────────────────────── + +FAKE_API_KEY = "test_key_12345" + + +def _make_aeo_record(series_id: str, region_id: str, period: str, value: float) -> dict: + """Helper to build a single AEO API data record.""" + return { + "seriesId": series_id, + "regionId": region_id, + "period": period, + "value": value, + "tableId": "3", + } + + +def _make_api_response(records: list) -> dict: + """Wraps records in EIA API v2 response envelope.""" + return {"response": {"data": records, "total": len(records)}} + + +@pytest.fixture +def eia_client(tmp_path): + """EIAClient with caching disabled (TTL=0).""" + return EIAClient( + api_key=FAKE_API_KEY, + cache_dir=tmp_path / "cache", + cache_ttl_seconds=0, + ) + + +# ── Constructor tests ──────────────────────────────────────────────────────── + + +def test_missing_api_key_raises(): + with pytest.raises(ValueError, match="EIA API key is required"): + EIAClient(api_key="") + + +def test_missing_requests_raises(): + with patch("t3co.data_fetching.eia_client.requests", None): + with pytest.raises(ImportError, match="requests"): + EIAClient(api_key=FAKE_API_KEY) + + +# ── _transform_aeo_to_t3co tests ──────────────────────────────────────────── + + +def test_transform_converts_mmbtu_to_native_units(eia_client): + """Verify $/MMBtu → $/gal conversion for diesel.""" + diesel_prefix = "prce_nom_trn_NA_dfu_NA_" + diesel_sid = diesel_prefix + "neengl_ndlrpmbtu" + mmbtu_per_gal = AEO_SERIES_TO_FUEL[diesel_prefix]["mmbtu_per_unit"] + price_mmbtu = 20.0 # $20/MMBtu + expected_per_gal = round(price_mmbtu * mmbtu_per_gal, 9) + + records = [_make_aeo_record(diesel_sid, "1-1", "2030", price_mmbtu)] + rows = eia_client._transform_aeo_to_t3co(records, "New England") + + assert len(rows) == 1 + assert rows[0]["Region"] == "New England" + assert rows[0]["Fuel"] == "diesel_dol_per_gal" + assert rows[0]["2030"] == expected_per_gal + + +def test_transform_handles_multiple_fuels(eia_client): + """Multiple fuel series in same region produce separate rows.""" + records = [ + _make_aeo_record("prce_nom_trn_NA_dfu_NA_neengl_ndlrpmbtu", "1-1", "2025", 18.0), + _make_aeo_record("prce_nom_comm_NA_elc_NA_neengl_ndlrpmbtu", "1-1", "2025", 35.0), + ] + rows = eia_client._transform_aeo_to_t3co(records, "New England") + fuels = {r["Fuel"] for r in rows} + assert "diesel_dol_per_gal" in fuels + assert "electricity_dol_per_kwh" in fuels + + +def test_transform_skips_unknown_series(eia_client): + """Series IDs not in AEO_SERIES_TO_FUEL are silently skipped.""" + records = [ + _make_aeo_record("unknown_series", "1-1", "2025", 10.0), + _make_aeo_record("prce_nom_trn_NA_dfu_NA_neengl_ndlrpmbtu", "1-1", "2025", 18.0), + ] + rows = eia_client._transform_aeo_to_t3co(records, "New England") + assert len(rows) == 1 + assert rows[0]["Fuel"] == "diesel_dol_per_gal" + + +def test_transform_skips_null_values(eia_client): + """Records with None value are skipped.""" + records = [ + _make_aeo_record("prce_nom_trn_NA_dfu_NA_neengl_ndlrpmbtu", "1-1", "2025", None), + ] + rows = eia_client._transform_aeo_to_t3co(records, "New England") + assert len(rows) == 0 + + +# ── _extrapolate_years tests ───────────────────────────────────────────────── + + +def test_extrapolate_backfills_early_years(): + """Years before the first available data are filled with the earliest value.""" + df = pd.DataFrame( + [ + { + "Region": "Test", + "Fuel": "diesel_dol_per_gal", + "2020": np.nan, + "2021": np.nan, + "2022": 3.0, + "2023": 3.1, + "2024": 3.2, + } + ] + ) + result = EIAClient._extrapolate_years(df) + assert result.loc[0, "2020"] == 3.0 + assert result.loc[0, "2021"] == 3.0 + + +def test_extrapolate_forward_grows(): + """Years after the last available data use CAGR-based growth.""" + df = pd.DataFrame( + [ + { + "Region": "Test", + "Fuel": "diesel_dol_per_gal", + "2020": 2.0, + "2021": 2.1, + "2022": 2.2, + "2023": 2.3, + "2024": 2.4, + "2025": np.nan, + "2026": np.nan, + } + ] + ) + result = EIAClient._extrapolate_years(df) + # 2025 and 2026 should be filled and > 2.4 + assert result.loc[0, "2025"] > 2.4 + assert result.loc[0, "2026"] > result.loc[0, "2025"] + + +# ── fetch_aeo_fuel_prices (mocked HTTP) ───────────────────────────────────── + + +def test_fetch_aeo_fuel_prices_returns_t3co_schema(eia_client): + """Mocked API call returns DataFrame with correct schema.""" + # Build fake API response for one region, one fuel, a few years + records = [] + for year in range(2022, 2051): + records.append( + _make_aeo_record( + "prce_nom_trn_NA_dfu_NA_soatl_ndlrpmbtu", "1-5", str(year), 20.0 + year * 0.01 + ) + ) + records.append( + _make_aeo_record( + "prce_nom_comm_NA_elc_NA_soatl_ndlrpmbtu", "1-5", str(year), 35.0 + ) + ) + + with patch.object(eia_client, "_request", return_value=_make_api_response(records)): + df = eia_client.fetch_aeo_fuel_prices( + aeo_year="2023", + scenario="aeo2022ref", + region_ids=["1-5"], + ) + + assert "Region" in df.columns + assert "Fuel" in df.columns + assert df["Region"].iloc[0] == "South Atlantic" + # All T3CO year columns should exist (2019-2100) + year_cols = [str(y) for y in T3CO_YEAR_RANGE] + for yc in year_cols: + assert yc in df.columns, f"Missing year column: {yc}" + # No NaN should remain after extrapolation + fuel_rows = df[df["Fuel"] == "diesel_dol_per_gal"] + assert not fuel_rows[year_cols].isna().any().any() + + +def test_fetch_empty_response_raises(eia_client): + """Empty API data raises EIAClientError.""" + with patch.object(eia_client, "_request", return_value=_make_api_response([])): + with pytest.raises(EIAClientError, match="No fuel price data"): + eia_client.fetch_aeo_fuel_prices( + aeo_year="2023", + scenario="aeo2022ref", + region_ids=["1-1"], + ) + + +# ── build_fuel_prices_df_from_eia ──────────────────────────────────────────── + + +def test_build_fuel_prices_df_includes_hydrogen_fallback(): + """Hydrogen rows from fallback DF are merged into EIA result.""" + # Create a fake EIA response DataFrame + eia_df = pd.DataFrame( + [ + {"Region": "South Atlantic", "Fuel": "diesel_dol_per_gal", "2025": 3.5}, + ] + ) + # Create a hydrogen fallback DataFrame + h2_df = pd.DataFrame( + [ + {"Region": "South Atlantic", "Fuel": "hydrogen_dol_per_gge", "2025": 8.0}, + {"Region": "New England", "Fuel": "hydrogen_dol_per_gge", "2025": 8.5}, + ] + ) + + with patch( + "t3co.data_fetching.eia_client.EIAClient.fetch_aeo_fuel_prices", + return_value=eia_df, + ): + result = build_fuel_prices_df_from_eia( + api_key=FAKE_API_KEY, + hydrogen_fallback_df=h2_df, + ) + + # Only South Atlantic hydrogen should be merged (matches EIA regions) + h2_rows = result[result["Fuel"] == "hydrogen_dol_per_gge"] + assert len(h2_rows) == 1 + assert h2_rows.iloc[0]["Region"] == "South Atlantic" + + +# ── Caching tests ──────────────────────────────────────────────────────────── + + +def test_cache_write_and_read(tmp_path): + """Cached responses are reused within TTL.""" + client = EIAClient( + api_key=FAKE_API_KEY, + cache_dir=tmp_path / "cache", + cache_ttl_seconds=3600, + ) + test_data = {"response": {"data": [], "total": 0}} + key = client._cache_key("http://test", {"a": "1"}) + + # Write + client._write_cache(key, test_data) + # Read back + cached = client._read_cache(key) + assert cached == test_data + + +# ── AEO discovery tests ────────────────────────────────────────────────────── + + +def test_discover_latest_aeo_year(eia_client): + """discover_latest_aeo_year returns the highest numeric year from routes.""" + fake_response = { + "response": { + "routes": [ + {"id": "2025", "name": "2025"}, + {"id": "2023", "name": "2023"}, + {"id": "2022", "name": "2022"}, + {"id": "2014-er", "name": "2014-er"}, + ] + } + } + with patch.object(eia_client, "_request", return_value=fake_response): + year = eia_client.discover_latest_aeo_year() + assert year == "2025" + + +def test_discover_latest_aeo_year_empty_raises(eia_client): + fake_response = {"response": {"routes": []}} + with patch.object(eia_client, "_request", return_value=fake_response): + with pytest.raises(EIAClientError, match="Could not discover"): + eia_client.discover_latest_aeo_year() + + +def test_discover_reference_scenario(eia_client): + fake_response = _make_api_response([ + {"scenario": "aeo2023ref", "scenarioDescription": "AEO2023 Reference case"}, + ]) + with patch.object(eia_client, "_request", return_value=fake_response): + scenario = eia_client.discover_reference_scenario("2025") + assert scenario == "aeo2023ref" + + +def test_auto_resolve_latest_aeo(eia_client): + """fetch_aeo_fuel_prices with defaults auto-discovers year and scenario.""" + discovery_calls = [] + + def mock_request(route, params=None): + discovery_calls.append(route) + if route == "aeo/": + return { + "response": { + "routes": [ + {"id": "2025", "name": "2025"}, + {"id": "2023", "name": "2023"}, + ] + } + } + # Both scenario discovery and table-3 data requests hit aeo//data/ + records = [] + for year in range(2022, 2051): + records.append( + _make_aeo_record( + "prce_nom_trn_NA_dfu_NA_pcf_ndlrpmbtu", + "1-9", str(year), 20.0, + ) + ) + resp = _make_api_response(records) + if records: + records[0]["scenario"] = "aeo2023ref" + return resp + + with patch.object(eia_client, "_request", side_effect=mock_request): + df = eia_client.fetch_aeo_fuel_prices(region_ids=["1-9"]) + + assert "aeo/" in discovery_calls + assert "Region" in df.columns + assert df["Region"].iloc[0] == "Pacific" + + +# ── Region mapping test ────────────────────────────────────────────────────── + + +def test_region_mapping_covers_nine_divisions(): + """AEO_REGION_ID_TO_T3CO maps all nine US Census divisions plus national.""" + assert len(AEO_REGION_ID_TO_T3CO) == 10 + assert "1-0" in AEO_REGION_ID_TO_T3CO # United States total + for i in range(1, 10): + assert f"1-{i}" in AEO_REGION_ID_TO_T3CO diff --git a/tests/input_data/test_config.py b/tests/input_data/test_config.py index 1634fe7f..9a913e23 100644 --- a/tests/input_data/test_config.py +++ b/tests/input_data/test_config.py @@ -2,6 +2,7 @@ import pytest from pathlib import Path +from t3co import utils from t3co.input_data.config import Config @@ -110,9 +111,9 @@ def test_config_from_csv(mock_config_file): assert config.fs_fueling_rate_kg_per_min == 200 assert config.fs_fueling_rate_gasoline_gpm == 300 assert config.fs_fueling_rate_diesel_gpm == 400 - assert config.insurance_rates_file == "insurance.csv" - assert config.fuel_prices_file == "fuel.csv" - assert config.plf_weight_dist_file == "weight_dist.csv" + assert Path(config.insurance_rates_file).name == "insurance.csv" + assert Path(config.fuel_prices_file).name == "fuel.csv" + assert Path(config.plf_weight_dist_file).name == "weight_dist.csv" assert config.TCO_method == "DIRECT" assert config.algorithms == "algorithms" assert config.lw_imp_curves == "lw_imp_curves" @@ -179,6 +180,108 @@ def test_read_auxiliary_files(mock_config_file, tmp_path): assert not config.fuel_prices_df.empty +def test_read_auxiliary_files_creates_temp_region_from_json(mock_config_file, tmp_path): + fuel_prices_data = """Region,Fuel,2020,2021 +Mountain,diesel_dol_per_gal,3.0,3.1 +Mountain,electricity_dol_per_kwh,0.12,0.13 +""" + fuel_prices_file = tmp_path / "fuel_prices.csv" + fuel_prices_file.write_text(fuel_prices_data) + + cost_toggles_file = tmp_path / "cost_toggles.json" + cost_toggles_file.write_text("{}") + + config = Config( + config_filename=mock_config_file, + fuel_prices_file=fuel_prices_file, + cost_toggles_file=cost_toggles_file, + fuel_prices_json={ + "zipcode": "80302", + "fuel_prices": { + "diesel_dol_per_gal": {"2021": 4.25}, + "electricity_dol_per_kwh": {"2020": 0.2}, + }, + }, + ) + original_lookup = utils.lookup_zipcode + utils.lookup_zipcode = lambda zipcode: {"zip_code": zipcode, "state": "CO"} + + try: + config.read_auxiliary_files() + finally: + utils.lookup_zipcode = original_lookup + + assert config.fuel_prices_source_region == "Mountain" + assert config.fuel_prices_region.startswith("zip_80302_") + assert config.fuel_prices_file != fuel_prices_file + assert Path(config.fuel_prices_file).exists() + temp_region_rows = config.fuel_prices_df[ + config.fuel_prices_df["Region"] == config.fuel_prices_region + ] + assert temp_region_rows.loc["diesel_dol_per_gal", "2021"] == pytest.approx(4.25) + assert temp_region_rows.loc["electricity_dol_per_kwh", "2020"] == pytest.approx(0.2) + + Path(config.fuel_prices_file).unlink(missing_ok=True) + + +def test_read_auxiliary_files_rejects_invalid_fuel_price_payload( + mock_config_file, tmp_path +): + fuel_prices_data = """Region,Fuel,2025 +Mountain,diesel_dol_per_gal,3.0 +""" + fuel_prices_file = tmp_path / "fuel_prices.csv" + fuel_prices_file.write_text(fuel_prices_data) + + cost_toggles_file = tmp_path / "cost_toggles.json" + cost_toggles_file.write_text("{}") + + config = Config( + config_filename=mock_config_file, + fuel_prices_file=fuel_prices_file, + cost_toggles_file=cost_toggles_file, + fuel_prices_json={ + "zipcode": "80A02", + "region": "should_not_be_allowed", + "fuel_prices": {"diesel_dol_per_gal": {"2025": 4.25}}, + }, + ) + + with pytest.raises(ValueError): + config.read_auxiliary_files() + + +def test_read_auxiliary_files_rejects_unknown_zipcode_dataset_result( + mock_config_file, tmp_path +): + fuel_prices_data = """Region,Fuel,2025 +Mountain,diesel_dol_per_gal,3.0 +""" + fuel_prices_file = tmp_path / "fuel_prices.csv" + fuel_prices_file.write_text(fuel_prices_data) + + cost_toggles_file = tmp_path / "cost_toggles.json" + cost_toggles_file.write_text("{}") + + config = Config( + config_filename=mock_config_file, + fuel_prices_file=fuel_prices_file, + cost_toggles_file=cost_toggles_file, + fuel_prices_json={ + "zipcode": "80302", + "fuel_prices": {"diesel_dol_per_gal": {"2025": 4.25}}, + }, + ) + original_lookup = utils.lookup_zipcode + utils.lookup_zipcode = lambda zipcode: {"zip_code": zipcode, "state": "PR"} + + try: + with pytest.raises(ValueError, match="unsupported state 'PR'"): + config.read_auxiliary_files() + finally: + utils.lookup_zipcode = original_lookup + + def test_delete_dataframes(): config = Config() config.df_attr = pd.DataFrame({"A": [1, 2, 3]}) diff --git a/tests/input_data/test_scenario.py b/tests/input_data/test_scenario.py index 0e3b8366..001dd13a 100644 --- a/tests/input_data/test_scenario.py +++ b/tests/input_data/test_scenario.py @@ -3,6 +3,7 @@ import pandas as pd import pytest +from t3co import utils from t3co.input_data.config import Config from t3co.input_data.scenario import Scenario @@ -93,6 +94,86 @@ def test_scenario_override_from_config(config, mock_scenario_db): assert scenario.fs_fueling_rate_kg_per_min == config.fs_fueling_rate_kg_per_min +def test_scenario_from_dict_uses_defaults_for_missing_fields(): + scenario = Scenario.from_dict( + { + "selection": 1, + "scenario_name": "Legacy Scenario", + "vehicle_life_yr": 2, + "vmt": "[10000, 9000]", + "shifts_per_year": "[250, 250]", + "mr_unplanned_downtime_hr_per_mi": "[0.01, 0.01]", + "maint_oper_cost_dol_per_mi": "[0.2, 0.2]", + } + ) + + assert scenario.depreciation_rates_pct_per_yr == [0.0, 0.0] + assert scenario.fuel_prices_file == "./auxiliary/FuelPrices.csv" + assert scenario.mpgge == 0.0 + assert scenario.primary_fuel_range_mi == 0.0 + + +@pytest.mark.parametrize("analysis_id", [0, 1, 2, 3, 4, 5]) +def test_demo_analysis_ids_use_temp_fuel_price_region(analysis_id): + config = Config().from_csv(analysis_id=analysis_id) + config.fuel_prices_json = { + "zipcode": "80302", + "fuel_prices": {"diesel_dol_per_gal": {"2025": 9.99}}, + } + original_lookup = utils.lookup_zipcode + utils.lookup_zipcode = lambda zipcode: {"zip_code": zipcode, "state": "CO"} + + try: + config.read_auxiliary_files() + finally: + utils.lookup_zipcode = original_lookup + + selection = ( + config.selections[0] + if isinstance(config.selections, list) + else config.selections + ) + scenario = Scenario.from_csv( + selection=selection, scenario_file=config.scenario_file + ) + scenario.override_from_config(config=config) + + assert config.fuel_prices_source_region == "Mountain" + assert scenario.region.startswith("zip_80302_") + temp_region_rows = scenario.fuel_prices_df[ + scenario.fuel_prices_df["Region"] == scenario.region + ] + assert temp_region_rows.loc["diesel_dol_per_gal", "2025"] == pytest.approx(9.99) + + Path(config.fuel_prices_file).unlink(missing_ok=True) + + +def test_demo_analysis_id_5_uses_eia_region(): + """Analysis 5 has region=90210 which should trigger EIA and resolve to Pacific.""" + config = Config().from_csv(analysis_id=5) + + original_lookup = utils.lookup_zipcode + utils.lookup_zipcode = lambda zipcode: {"zip_code": zipcode, "state": "CA"} + try: + config.read_auxiliary_files() + finally: + utils.lookup_zipcode = original_lookup + + selection = ( + config.selections[0] + if isinstance(config.selections, list) + else config.selections + ) + scenario = Scenario.from_csv( + selection=selection, scenario_file=config.scenario_file + ) + scenario.override_from_config(config=config) + + assert selection == 12 + assert config.fuel_prices_region == "Pacific" + assert scenario.region == "Pacific" + + def test_get_discounted_value(): scenario = Scenario(discount_rate_pct_per_yr=0.05) discounted_value = scenario.get_discounted_value(value=1000, year_number=2) diff --git a/tests/tco/test_ledger.py b/tests/tco/test_ledger.py index 8c43c9ef..d88187d2 100644 --- a/tests/tco/test_ledger.py +++ b/tests/tco/test_ledger.py @@ -98,7 +98,7 @@ def scenario(toggles): maint_oper_cost_dol_per_mi=[0.05] * 10, fuel_prices_df=pd.DataFrame( { - "Fuel": ["dolPerKwh"], + "Fuel": ["electricity_dol_per_kwh"], "Region": ["US"], "2020": [0.1], "2021": [0.1], diff --git a/tests/tco/test_tcocalc.py b/tests/tco/test_tcocalc.py index 303d5656..31d82f93 100644 --- a/tests/tco/test_tcocalc.py +++ b/tests/tco/test_tcocalc.py @@ -95,7 +95,7 @@ def scenario(toggles): maint_oper_cost_dol_per_mi=[0.05] * 10, fuel_prices_df=pd.DataFrame( { - "Fuel": ["dolPerKwh"], + "Fuel": ["electricity_dol_per_kwh"], "Region": ["US"], "2020": [0.1], "2021": [0.1],