PortWatch Chokepoint Activity
Daily ship transits through major maritime chokepoints (Suez, Panama, Hormuz and others), from IMF PortWatch.
portwatch_chokepoint_activity — the dataset name to pass to the Obscura API.
What one row means
One row is a single maritime chokepoint's (e.g. Panama Canal, Suez Canal, Strait of Hormuz, Bosporus Strait, Bab-el-Mandeb, Strait of Malacca) AIS-derived vessel-transit and cargo-capacity summary for one calendar day: how many ships of each class (container, dry bulk, general cargo, ro-ro, tanker) passed through, plus IMF PortWatch's model-estimated total cargo-carrying capacity (metric tons) those vessels represented, by class and in aggregate. Source: the IMF PortWatch ArcGIS FeatureServer (`Daily_Chokepoints_Data`), keyless, daily since 2019-01-01.
One row per (portid, occurred_on).
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For portwatch_chokepoint_activity: release_calendar: available_date = occurred_on (the AIS transit day) + 8 calendar days, the IMF PortWatch dissemination lag; a STORED generated column.
Refresh cadence
Obscura refreshes portwatch_chokepoint_activity daily — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 18 columns
The full public column list for portwatch_chokepoint_activity, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/portwatch_chokepoint_activity.
| Column | Type | Description |
|---|---|---|
| portid | text · not null | IMF PortWatch's own chokepoint identifier (source `portid`, e.g. "chokepoint2" = Panama Canal, "chokepoint3" = Bosporus Strait). Stable across days; part of the composite primary key with occurred_on. Not a global standard code (no ISO/UN/LOCODE mapping) — resolve chokepoint identity via portname. |
| occurred_on | date · not null | The calendar day the ships transited this chokepoint (source `date` attribute on the AIS-derived FeatureServer layer, parsed as ISO string or epoch-ms). Also the gap-deterministic watermark the collector's `where=date > MAX(occurred_on)` query uses to fetch only new days. |
| portname | text | Human-readable chokepoint name (source `portname`), e.g. "Panama Canal", "Bosporus Strait", "Suez Canal", "Bab-el-Mandeb Strait". Nullable — a small fraction of ArcGIS features omit it; joins/display should tolerate NULL and fall back to portid. |
| n_container | double precision | Count of container vessels that transited this chokepoint on this day, from AIS ship-tracking classified by vessel type. Stored as float (not int) because PortWatch's pipeline treats these as model-estimated counts subject to future revision. |
| n_dry_bulk | double precision | Count of dry-bulk carrier vessels (grain, ore, coal, etc.) that transited this chokepoint on this day. |
| n_general_cargo | double precision | Count of general-cargo (breakbulk) vessels that transited this chokepoint on this day. |
| n_roro | double precision | Count of roll-on/roll-off (vehicle-carrier) vessels that transited this chokepoint on this day. |
| n_tanker | double precision | Count of tanker vessels (oil/chemical/LNG) that transited this chokepoint on this day. |
| n_cargo | double precision | Sum of the four non-tanker vessel-class counts (n_container + n_dry_bulk + n_general_cargo + n_roro) for this chokepoint/day — PortWatch's precomputed "all cargo vessels" subtotal. |
| n_total | double precision | Total vessel transits of every tracked class for this chokepoint/day: n_cargo + n_tanker. |
| capacity_container | double precision | PortWatch's estimated aggregate cargo-carrying capacity (metric tons) of the container vessels that transited this chokepoint on this day, derived from each AIS-tracked vessel's registry-known deadweight/capacity. |
| capacity_dry_bulk | double precision | Estimated aggregate cargo capacity (metric tons) of transiting dry-bulk vessels for this chokepoint/day. |
| capacity_general_cargo | double precision | Estimated aggregate cargo capacity (metric tons) of transiting general-cargo vessels for this chokepoint/day. |
| capacity_roro | double precision | Estimated aggregate cargo capacity (metric tons) of transiting ro-ro vessels for this chokepoint/day. |
| capacity_tanker | double precision | Estimated aggregate cargo capacity (metric tons) of transiting tanker vessels for this chokepoint/day. |
| capacity_cargo | double precision | Sum of the four non-tanker capacity fields (capacity_container + capacity_dry_bulk + capacity_general_cargo + capacity_roro) for this chokepoint/day — the "all cargo vessels" capacity subtotal, matching PortWatch's n_cargo grouping. |
| capacity | double precision | Total estimated transiting cargo capacity (metric tons) across every vessel class for this chokepoint/day: capacity_cargo + capacity_tanker. |
| available_date | date | PUBLIC-availability date = occurred_on (the AIS transit day) shifted by the declared IMF PortWatch dissemination lag of 8 calendar days. DB-generated (STORED, `occurred_on + 8`), read-only; the point-in-time column to filter/join on — NEVER the transit day itself. |
Access portwatch_chokepoint_activity
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="portwatch_chokepoint_activity",
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the portwatch_chokepoint_activity dataset?
Daily ship transits through major maritime chokepoints (Suez, Panama, Hormuz and others), from IMF PortWatch. One row is a single maritime chokepoint's (e.g. Panama Canal, Suez Canal, Strait of Hormuz, Bosporus Strait, Bab-el-Mandeb, Strait of Malacca) AIS-derived vessel-transit and cargo-capacity summary for one calendar day: how many ships of each class (container, dry bulk, general cargo, ro-ro, tanker) passed through, plus IMF PortWatch's model-estimated total cargo-carrying capacity (metric tons) those vessels represented, by class and in aggregate. Source: the IMF PortWatch ArcGIS FeatureServer (`Daily_Chokepoints_Data`), keyless, daily since 2019-01-01.
How do I avoid look-ahead bias with portwatch_chokepoint_activity?
Filter on portwatch_chokepoint_activity.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — release_calendar: available_date = occurred_on (the AIS transit day) + 8 calendar days, the IMF PortWatch dissemination lag; a STORED generated column. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get portwatch_chokepoint_activity?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="portwatch_chokepoint_activity". The column schema is public at https://api.obscura.trade/v1/catalog/portwatch_chokepoint_activity.
How often is portwatch_chokepoint_activity updated?
Obscura refreshes portwatch_chokepoint_activity on a daily schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.