opensemantic.characteristics.quantitative
Library with Python models derived from the page package world.opensemantic.characteristics.quantitative
Quantities and units generated from QUDT. pint mapping was done with support from ucumvert
Usage
from opensemantic.characteristics.quantitative import (
Length, LengthUnit, Width, Area, AreaUnit, QuantityValue,
)
# Create typed quantity values
length = Length(value=1.0, unit=LengthUnit.meter)
width = Width(value=200, unit=LengthUnit.milli_meter)
# Arithmetic — units are tracked automatically via pint
area = length * width
print(area.value, area.unit.name) # 200000.0 milli_meter_squared
assert isinstance(area, Area)
# Unit conversion
area_cm2 = area.to_unit(AreaUnit.centi_meter_squared)
print(area_cm2.value) # 2000.0
assert area == area_cm2 # physical equality across units
# Addition with automatic unit conversion
l1 = Length(value=1.0, unit=LengthUnit.milli_meter)
l2 = Length(value=1.0, unit=LengthUnit.meter)
print((l1 + l2).value) # 1.001 (in meters)
# pint interop: round-trip to/from pint.Quantity
q_pint = l1.to_pint() # -> 1.0 millimeter
restored = QuantityValue.from_pint(q_pint) # -> Length(1.0, milli_meter)
assert l1 == restored
# JSON serialization (via oold's unified API)
print(l1.to_json())
# {'type': ['Category:OSWee9c7e5c...'], 'value': 1.0, 'unit': 'Item:OSWf101d25e...'}
Round-tripping derived units
from_pint recovers a typed QuantityValue even when the exact unit symbol is
not in the registry - e.g. derived units (watt, joule, ohm) or composed
results such as volt * ampere. When the symbol is unknown it falls back to the
quantity's dimensionality, mapping it to a representative SI-coherent unit via
DIMENSION_TO_UNIT (generated into _dimensions.py by scripts/post_process.py):
from opensemantic.characteristics.quantitative import (
Voltage, VoltageUnit, ElectricCurrent, ElectricCurrentUnit, Power,
)
power = Voltage(value=3.7, unit=VoltageUnit.volt) * ElectricCurrent(
value=2.0, unit=ElectricCurrentUnit.ampere
)
assert isinstance(power, Power) # volt * ampere -> watt
Compact export
exclude_defaults=True omits values left at their default (e.g. the default
unit) for a minimal, portable representation:
length = Length(value=1.0, unit=LengthUnit.meter)
print(length.to_json(exclude_defaults=True)) # {'value': 1.0}
See examples/ for more, including tabular data with pandas and a tensile test analysis.
TODO: Unit Name Conflicts in _collection.py
18 unit member names appear in multiple *Unit enum classes with different OSW IDs.
The first occurrence goes into _collection.py; conflicting entries remain hardcoded in _model.py.
These likely stem from upstream QUDT modeling where the same unit name maps to different physical quantities.
| Name | Classes (conflicting OSW IDs) |
|---|---|
day |
TimeUnit vs HydraulicPermeabilityUnit |
kilo_newton |
ForceUnit vs TorquePerLengthUnit |
kilo_newton_per_meter |
EnergyPerAreaUnit vs ForcePerLengthUnit |
liter_per_meter_squared_per_second |
VolumetricFluxUnit vs VentilationRatePerFloorAreaUnit |
meter |
LengthUnit vs AreaPerLengthUnit vs VolumePerUnitAreaUnit |
meter_pascal |
StressIntensityFactorUnit vs UnknownUnit |
milli_newton_per_meter |
EnergyPerAreaUnit vs ForcePerLengthUnit |
minute |
TimeUnit vs PlaneAngleUnit |
newton |
ForceUnit vs TorquePerLengthUnit |
newton_per_meter |
EnergyPerAreaUnit vs ForcePerLengthUnit |
pH_value |
InductanceUnit vs BasicityUnit |
per_centi_meter |
InverseLengthUnit vs UnknownUnit |
per_day |
FrequencyUnit vs UnknownUnit vs MassSpecificBiogeochemicalRateUnit |
per_hour |
FrequencyUnit vs MassSpecificBiogeochemicalRateUnit |
per_meter |
InverseLengthUnit vs UnknownUnit |
per_meter_1 |
InverseLengthUnit vs UnknownUnit |
per_minute |
FrequencyUnit vs RotationalFrequencyUnit |
year |
AreaUnit vs TimeUnit |
Status
pint round-trip (full inventory): 0 unit_registry misses
tests/conversion_test.py::test_full_inventory_test round-trips every
QuantityValue x unit through to_pint() / from_pint() and now asserts
zero unit_registry misses (v2: 2089 ok / 282 errors; v1: 3181 ok / 442
errors). from_pint resolves every unit whose symbol pint can parse - derived
units fall back to the dimensionality map in _dimensions.py. The remaining
errors are all UndefinedUnitError (units pint itself does not define, e.g.
astronomical_unit, electron_volt, metric_ton, sidereal time units); the
critical warnings are units shared by several quantities of the same
dimensionality (value + unit still round-trip, but the class may resolve to a
sibling).
Note
This project has been set up using PyScaffold 4.6. For details and usage information on PyScaffold see https://pyscaffold.org/.
Metadata
Release files for opensemantic.characteristics.quantitative 0.8.0.post1000004005000
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| opensemantic_characteristics_quantitative-0.8.0.post1000004005000.tar.gz | 663.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| opensemantic_characteristics_quantitative-0.8.0.post1000004005000-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.3 MB
Release files / opensemantic_characteristics_quantitative-0.8.0.post1000004005000.tar.gz
| Download URL | opensemantic_characteristics_quantitative-0.8.0.post1000004005000.tar.gz |
|---|---|
| Size | 663.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6d18f270313eb6ae54b1a2b8415b66018019501eb107c432d9c7de8406020ffa
|
|
BLAKE2b-256 checksum How to use checksums |
d234da2d8b94c9aa1b937cc3bfb00f1c2fa8c40488fb4d2645fe38b68c3d9a9a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / opensemantic_characteristics_quantitative-0.8.0.post1000004005000-py3-none-any.whl
| Download URL | opensemantic_characteristics_quantitative-0.8.0.post1000004005000-py3-none-any.whl |
|---|---|
| Size | 596.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
069b9e6a34303463ff396ae63cef27fcb1d92070ea518602bebef085d338017c
|
|
BLAKE2b-256 checksum How to use checksums |
e2eb1e6df97c8e2dcfdd68e2480c0e42f046781bfea45e823b709212c741697e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|