Skip to main content

A Python toolkit for logistics and supply chain calculations

Project description

logisticspy

A Python toolkit for logistics and supply chain calculations.

logisticspy is a growing collection of clean, well-tested tools for common logistics and supply chain problems. The first module, logisticspy.weight, calculates volumetric (dimensional) weight and chargeable weight for air, courier, sea, road, and rail freight shipments. More tools (volume, freight, inventory, and others) will be added over time.

Install

pip install logisticspy

Quick start

You can use the chargeable weight tools either via the top-level package or via the weight module:

# Option 1: top-level import
import logisticspy

result = logisticspy.calculate(
    length=60, width=40, height=40, unit="cm",
    actual_weight=18, weight_unit="kg",
    mode="air",
)

# Option 2: import the weight module
from logisticspy.weight import chargeable_weight

result = chargeable_weight.calculate(
    length=60, width=40, height=40, unit="cm",
    actual_weight=18, weight_unit="kg",
    mode="air",
)

print(result.volumetric_weight_kg)   # 19.2
print(result.chargeable_weight_kg)   # 19.2
print(result.basis)                  # "volumetric"

The weight module: chargeable weight

Carriers bill shipments based on whichever is greater: the actual weight or the volumetric weight (calculated from package dimensions). This module implements that calculation cleanly, with support for multiple units, transport modes, named divisor presets, and multi-package consignments.

Supported modes and default divisors

Mode Default divisor (cm³/kg)
air 6000
courier 5000
road 3000
rail 3000
sea N/A (uses CBM × 1000, see below)

These are sensible starting defaults based on common conventions seen across the freight and parcel industry. They are not tied to any specific carrier - always confirm the applicable divisor with your own carrier or contract for billing-critical calculations.

Divisor presets

Two divisor values - 5000 and 6000 - are both widely used across the industry, often for different services, regions, or contracts (sometimes even by the same carrier depending on the product). Rather than guessing which one applies to your situation, you can refer to them by generic preset labels and swap between them easily:

Preset Divisor
"a" 5000
"b" 6000
import logisticspy

# Same package, two different divisor conventions
pkg = dict(length=60, width=40, height=40, actual_weight=10, mode="air")

result_a = logisticspy.calculate(**pkg, divisor_preset="a")  # divisor 5000
result_b = logisticspy.calculate(**pkg, divisor_preset="b")  # divisor 6000

print(result_a.volumetric_weight_kg)  # 19.2
print(result_b.volumetric_weight_kg)  # 16.0

This makes it easy to compare "what would this shipment cost under each convention" without hardcoding either value, and to plug in your own carrier's documented divisor (whether that happens to be 5000, 6000, or something else entirely) via divisor_preset or a raw divisor= value.

You can also pass an explicit divisor directly, which overrides any preset:

result = logisticspy.calculate(**pkg, divisor=4500)

Units

Input units

Dimensions accept cm, m, mm, in, ft (default cm). Weights accept kg, g, lb, oz (default kg).

result = logisticspy.calculate(
    length=20, width=15, height=10, unit="in",
    actual_weight=5, weight_unit="lb",
    mode="courier",
)

Output units (always normalized)

Regardless of the input units you choose, all results are returned in a single fixed unit system:

Field Unit
actual_weight_kg, volumetric_weight_kg, chargeable_weight_kg kilograms (kg)
volume_m3 cubic meters (m³)

The input units (unit, weight_unit) are only used to interpret the numbers you pass in - they are converted to centimeters and kilograms internally before any calculation happens. The output is never expressed back in the input units.

If you need the result in a different unit (e.g. pounds), convert the returned kg value yourself - the library does not provide unit conversion on outputs.

Sea freight (CBM)

Sea freight chargeable weight is derived from volume in cubic meters (CBM), using the common 1 CBM ≈ 1000 kg convention:

result = logisticspy.calculate(
    length=1, width=1, height=1, unit="m",
    actual_weight=500, mode="sea",
)
print(result.volumetric_weight_kg)  # 1000.0

Divisor presets are ignored for sea mode, since it uses a CBM-based calculation rather than a divisor.

Multi-package consignments

import logisticspy

packages = [
    {"length": 50, "width": 40, "height": 40, "actual_weight": 10},
    {"length": 60, "width": 40, "height": 40, "actual_weight": 25, "quantity": 2},
]

result = logisticspy.calculate_consignment(packages, mode="air")

print(result.total_actual_weight_kg)
print(result.total_volumetric_weight_kg)
print(result.total_chargeable_weight_kg)

By default, totals are compared (sum(actual) vs sum(volumetric)). Some couriers calculate chargeable weight per package and sum those - use per_piece=True for that behavior:

result = logisticspy.calculate_consignment(packages, mode="air", per_piece=True)

Roadmap

logisticspy is designed to grow into a broader logistics toolkit. chargeable_weight is the first module; additional tools (e.g. volume, freight, and inventory calculations) will be added over time.

Disclaimer

This library implements widely-used industry conventions for illustrative and estimation purposes. Divisors and CBM ratios vary by carrier, service level, region, and contract terms. Always confirm exact billing methodology with your carrier or freight forwarder for invoicing-critical calculations.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

logisticspy-0.1.0.tar.gz (12.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

logisticspy-0.1.0-py3-none-any.whl (9.8 kB view details)

Uploaded Python 3

File details

Details for the file logisticspy-0.1.0.tar.gz.

File metadata

  • Download URL: logisticspy-0.1.0.tar.gz
  • Upload date:
  • Size: 12.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for logisticspy-0.1.0.tar.gz
Algorithm Hash digest
SHA256 99bdf3833cb7bfd0f0cce8b17c3f205924f796958b618450a404f6b28e829602
MD5 77037b77e71b36ffd27119b935031d48
BLAKE2b-256 9fd5d1a39208b7dbdd8b507aa2a6af2192b3209ab7909a0a35245639db2b887f

See more details on using hashes here.

Provenance

The following attestation bundles were made for logisticspy-0.1.0.tar.gz:

Publisher: publish.yml on krishnanz550i-cmyk/logisticspy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file logisticspy-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: logisticspy-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for logisticspy-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bb61082eb782faa2280a1005d4b64de8dbde9c24d5052ecef2c0b9aa65990947
MD5 ffc390b9603a5661d8893e6e57716e14
BLAKE2b-256 346c81ba42bde57de9b1b2306cf236b6a7d139a5339e64b9b70c99f8b66046c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for logisticspy-0.1.0-py3-none-any.whl:

Publisher: publish.yml on krishnanz550i-cmyk/logisticspy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page