carculator_two_wheeler
Prospective environmental and economic life cycle assessment of bicycles, scooters, mopeds and motorcycles.
Developed at the Paul Scherrer Institute. This checkout prepares the unpublished release 0.1.1; see CHANGELOG.md for release status and changes.
Installation
Use Python 3.12 (>=3.12,<3.13) and a fresh environment. The shared runtime
requires NumPy >=1.26.4,<2.
python3.12 -m venv .venv
source .venv/bin/activate
On Windows, activate with .venv\Scripts\activate. After publication, install
this release from PyPI:
python -m pip install "carculator_two_wheeler==0.1.1"
Before publication, use the matching source checkouts as described under development.
Core calculations use bundled resources and need no Brightway project, ecoinvent
installation or network access. The matching carculator_utils runtime installs
brightpath>=1.0.0a6,<1.1 for Brightway Excel, SimaPro CSV and openLCA JSON-LD
exports. It uses Brightpath's v1 API, currently an alpha; model and LCIA
calculations do not import Brightpath or Brightway.
The excel extra remains a compatibility alias. To select the tested legacy
Brightway stack (bw2io<0.9, bw2data<4, bw2calc<2), use:
python -m pip install "carculator_two_wheeler[brightway]==0.1.1"
Brightpath also installs bw2io without that extra. Export targets ecoinvent
3.12 cut-off by default; legacy 3.9/3.10 targets reject suppliers without
verified older links. External suppliers must be matched to the corresponding
background in the destination tool. See inventory export.
Quick start
from carculator_two_wheeler import (
TwoWheelerInputParameters,
TwoWheelerModel,
InventoryTwoWheeler,
fill_xarray_from_input_parameters,
)
inputs = TwoWheelerInputParameters()
inputs.static()
_, array = fill_xarray_from_input_parameters(
inputs,
scope={
"size": ["Motorcycle 11-35kW"],
"powertrain": ["ICEV-p", "BEV"],
"year": [2025],
},
)
model = TwoWheelerModel(array)
model.set_all()
print(model["TtW energy"]) # kJ per vehicle-kilometre
inventory = InventoryTwoWheeler(model, functional_unit="vkm")
impacts = inventory.calculate_impacts()
print(impacts.sel(impact_category="climate change").sum("impact"))
The example reports impacts per vehicle-kilometre. The petrol motorcycle now returns about 1.797 MJ/km (5.646 L/100 km) after restoring the historical engine-efficiency prior. This fixes the former 1% efficiency defect; the prior remains provisional, with substantial differences from unmatched manufacturer consumption figures. See the correction and sources. Release 0.1.1 remains unpublished pending review of the remaining known issues.
Inventory export
With the completed inventory from the quick start:
workbook = inventory.export_lci(software="brightway2", format="file", directory="exports")
simapro_csv = inventory.export_lci(software="simapro", format="file", directory="exports")
foreground_zip = inventory.export_lci(software="openlca", format="file", directory="exports")
Retain exactly one sample before constructing the model and inventory. Each year
gets its own export; multiple years return a list. Exports preserve the original
inventory and calculated impacts. The default export_lci() returns an unlinked
Brightway importer.
The openLCA ZIP contains foreground processes, without an ecoinvent background or LCIA methods; map external providers and elementary flows before calculation. SimaPro CSV uses Latin-1 and warns when omitting custom noise flows. See the export guide for return types, sample selection and format-specific limitations.
Modelling and validation
For a guided explanation of the inputs, units and assumptions, read Understanding inputs and results. The validation examples include bar charts, source records and the limits of each comparison. Measured energy comparisons are separate from the model-to-model comparison of the background database update.
Battery unit prices supplied by users now survive chemistry selection and cost
adjustment. Use battery_costs for explicit prices scoped by vehicle, year and
sample; see battery-cost inputs.
The vehicle models include tabulated 2025 parameters and documented temporal extensions. These combine engineering assumptions and selected calibration evidence; they are not independent measurements for every vehicle configuration.
TtW energy is in kJ/km. For BEVs it is net stored-energy depletion;
model.battery_terminal_energy reports terminal DC separately, while
electricity consumption is grid electricity in kWh/km. Identify the measurement
boundary before comparing energy outputs. Availability-masked zeroes do not
represent physically zero consumption.
BEV range targets now converge battery capacity, vehicle mass and cycle energy together. Fixed-capacity and pack-mass scenarios also propagate through range, consumption and inventories; see battery sizing and override examples.
Two-wheelers no longer force a replacement battery: replacement fractions follow lifetime energy throughput and can be zero. Initial battery supply is retained; see replacement accounting and limits.
Supported background scenarios are SSP2-NPi, SSP2-PkBudg1000,
SSP2-PkBudg650, and static. ReCiPe supports midpoint/endpoint and EF midpoint.
Use fresh model instances for independent cases. inputs.stochastic(n, seed=...)
seeds parameter draws and the projected-cost factors used by the current
array builder. Keep its auxiliary sample coordinates; older hand-built arrays
do not recover that seed automatically.
See validation and limitations, migration notes and the documentation.
Electric-bicycle glider and maintenance costs now use a positive mechanical-bicycle prior supported by published market data. Complete e-bike prices remain uncalibrated. Kick-scooter, moped and small-scooter negative glider costs now use source-based provisional priors as well. The inherited BEV cabin heat-pump charge is now zero by default; explicit cost overrides remain supported. The electric kick-scooter charger uses a provisional EUR 70 retail-price proxy; charger assumptions for other classes still need review. See the bicycle correction, small-vehicle costs, heat-pump correction and kick-scooter charger evidence.
Development and release
Use matching sibling checkouts, especially carculator_utils 1.3.7 or newer:
python -m pip install -e "../carculator_utils[test,excel,brightway]" -e ".[test,docs,excel,brightway]"
python -m pip check
python -m pytest
python -m sphinx -b html docs docs/_build/html
The docs extra includes the extensions used by this repository.
See RELEASING.md for artifact verification, release order and publication.
Support and license
Contact carculator@psi.ch or open an issue. Maintained by Romain Sacchi, with contributions from the carculator development team. See contributing. Licensed under BSD-3-Clause.
Scientific background: Cox et al. (2018).
The shared LCA background now uses premise 2.5.4 and ecoinvent 3.12 cutoff.
The former NMC-523 option is replaced by NMC-532 (actual Ni:Mn:Co 5:3:2
inventory); update custom chemistry selections. See docs/release.rst.
Metadata
Release files for carculator-two-wheeler 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| carculator_two_wheeler-0.1.1.tar.gz | 722.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| carculator_two_wheeler-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 822.1 kB
Release files / carculator_two_wheeler-0.1.1.tar.gz
| Download URL | carculator_two_wheeler-0.1.1.tar.gz |
|---|---|
| Size | 722.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a3e6a14b1ad163fb04c34fd6e4a795c069e923e0abdd04b6e0474685c898593e
|
|
BLAKE2b-256 checksum How to use checksums |
dac24006d97f68458cdabd11fbfe301c88a81275c28418857c5550ee478d47f0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / carculator_two_wheeler-0.1.1-py3-none-any.whl
| Download URL | carculator_two_wheeler-0.1.1-py3-none-any.whl |
|---|---|
| Size | 99.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
aec11550086002473c4bd43d0f359eff7dde72922051d1a7944736b6da3f2035
|
|
BLAKE2b-256 checksum How to use checksums |
de3ac7ed969758d7c49bc745e50248316945ea09c20675fb533d765d441655d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|