Obscura

PortWatch Port Activity

Daily port calls and estimated trade volumes at ports worldwide, from IMF PortWatch.

portwatch_port_activity — the dataset name to pass to the Obscura API.

Category Markets Columns 27 Refresh Daily Entity key portid Point-in-time available_date

What one row means

One row is a single IMF PortWatch port's AIS-derived shipping-activity estimate for one calendar day: vessel port-call counts and estimated import/export cargo volumes at that port on that day, broken out by vessel type (container, dry bulk, general cargo, roro, tanker) plus cargo/all-type totals. Source: the IMF PortWatch ArcGIS FeatureServer (`Daily_Ports_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_port_activity: release_calendar: available_date = occurred_on + 14 calendar days (PortWatch AIS aggregation, modeling pipeline, and revision-delay lag), STORED generated column.

Refresh cadence

Obscura refreshes portwatch_port_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 — 27 columns

The full public column list for portwatch_port_activity, with the meaning of every field. The same schema is served unauthenticated at https://api.obscura.trade/v1/catalog/portwatch_port_activity.

ColumnTypeDescription
portidtext · not nullIMF PortWatch's stable identifier for the port (ArcGIS attribute `portid`, e.g. 'port1325'). Half of the composite primary key; joining 1:1 to the same portid in portwatch_chokepoint_activity is NOT guaranteed (ports and chokepoints are separate ID spaces).
occurred_ondate · not nullThe calendar day the port-call/import/export activity occurred (ArcGIS `date` attribute, parsed as ISO string or epoch-ms). Other half of the composite primary key with portid; the real event/period date this table's activity metrics describe.
portnametextHuman-readable port display name from the ArcGIS `portname` attribute (e.g. 'Tsuruga'). Nullable — dropped when blank/whitespace-only.
countrytextFull country name hosting the port, from the ArcGIS `country` attribute (e.g. 'Japan'). Nullable.
iso3textISO 3166-1 alpha-3 country code, from the ArcGIS `ISO3` attribute (e.g. 'JPN'). Nullable.
portcalls_containerdouble precisionEstimated count of container-vessel port calls at this port on this day, from ArcGIS attribute `portcalls_container`. Stored as float (model-estimated volume, not raw count). Nullable.
portcalls_dry_bulkdouble precisionEstimated dry-bulk-carrier port calls this day, from ArcGIS attribute `portcalls_dry_bulk`. Nullable.
portcalls_general_cargodouble precisionEstimated general-cargo-vessel port calls this day, from ArcGIS attribute `portcalls_general_cargo`. Nullable.
portcalls_rorodouble precisionEstimated roll-on/roll-off (roro) vessel port calls this day, from ArcGIS attribute `portcalls_roro`. Nullable.
portcalls_tankerdouble precisionEstimated tanker port calls this day, from ArcGIS attribute `portcalls_tanker`. Nullable.
portcalls_cargodouble precisionEstimated port calls summed across all cargo-carrying vessel types (container + dry bulk + general cargo + roro + tanker) this day, from ArcGIS attribute `portcalls_cargo`. A subtotal, not necessarily reconciled with `portcalls`. Nullable.
portcallsdouble precisionEstimated total port calls across ALL vessel types (including non-cargo) at this port this day, from ArcGIS attribute `portcalls`. The dataset's grand-total activity metric. Nullable.
import_containerdouble precisionEstimated import cargo volume carried by container vessels at this port this day, from ArcGIS attribute `import_container`; PortWatch's internal AIS-derived volume estimate (not raw TEU/tonnage). Nullable.
import_dry_bulkdouble precisionEstimated import volume via dry-bulk carriers this day, from ArcGIS attribute `import_dry_bulk`. Nullable.
import_general_cargodouble precisionEstimated import volume via general-cargo vessels this day, from ArcGIS attribute `import_general_cargo`. Nullable.
import_rorodouble precisionEstimated import volume via roro vessels this day, from ArcGIS attribute `import_roro`. Nullable.
import_tankerdouble precisionEstimated import volume via tankers this day, from ArcGIS attribute `import_tanker`. Nullable.
import_cargodouble precisionEstimated import volume summed across all cargo vessel types this day, from ArcGIS attribute `import_cargo`; a subtotal, not necessarily reconciled with `import`. Nullable.
importdouble precisionEstimated total import cargo volume across all vessel types at this port this day, from ArcGIS attribute `import`. The dataset's headline import metric. Nullable.
export_containerdouble precisionEstimated export cargo volume via container vessels this day, from ArcGIS attribute `export_container`. Nullable.
export_dry_bulkdouble precisionEstimated export volume via dry-bulk carriers this day, from ArcGIS attribute `export_dry_bulk`. Nullable.
export_general_cargodouble precisionEstimated export volume via general-cargo vessels this day, from ArcGIS attribute `export_general_cargo`. Nullable.
export_rorodouble precisionEstimated export volume via roro vessels this day, from ArcGIS attribute `export_roro`. Nullable.
export_tankerdouble precisionEstimated export volume via tankers this day, from ArcGIS attribute `export_tanker`. Nullable.
export_cargodouble precisionEstimated export volume summed across all cargo vessel types this day, from ArcGIS attribute `export_cargo`; a subtotal, not necessarily reconciled with `export`. Nullable.
exportdouble precisionEstimated total export cargo volume across all vessel types at this port this day, from ArcGIS attribute `export`. The dataset's headline export metric. Nullable.
available_datedate · not nullPUBLIC-availability date = occurred_on + 14 calendar days (release-calendar dissemination lag). STORED generated column, DB-generated and read-only; the point-in-time column to filter/join on — NEVER the activity day itself.

Access portwatch_port_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_port_activity",
    symbols=["NVDA", "AAPL"],
    start="2024-01-01",
)

Create a free account Browse all 95 datasets

Frequently asked questions

What is in the portwatch_port_activity dataset?

Daily port calls and estimated trade volumes at ports worldwide, from IMF PortWatch. One row is a single IMF PortWatch port's AIS-derived shipping-activity estimate for one calendar day: vessel port-call counts and estimated import/export cargo volumes at that port on that day, broken out by vessel type (container, dry bulk, general cargo, roro, tanker) plus cargo/all-type totals. Source: the IMF PortWatch ArcGIS FeatureServer (`Daily_Ports_Data`), keyless, daily since 2019-01-01.

How do I avoid look-ahead bias with portwatch_port_activity?

Filter on portwatch_port_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 + 14 calendar days (PortWatch AIS aggregation, modeling pipeline, and revision-delay lag), 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_port_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_port_activity". The column schema is public at https://api.obscura.trade/v1/catalog/portwatch_port_activity.

Can I filter portwatch_port_activity by company or symbol?

Yes. portwatch_port_activity carries portid, the column the API's symbols filter resolves against.

How often is portwatch_port_activity updated?

Obscura refreshes portwatch_port_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.

Related datasets

Cboe IndicesDaily history of Cboe's volatility indices, including VIX, sourced directly from Cboe. Crypto MarketsPer-coin market data from CoinGecko: price, market cap and volume across thousands of cryptocurrencies. DeFiLlama ProtocolsTotal value locked in each DeFi protocol, tracked by DeFiLlama. DeFiLlama StablecoinsCirculating supply of each stablecoin over time, from DeFiLlama. DeFiLlama TVLTotal value locked on each blockchain, from DeFiLlama. Flow MetricsTrade-flow metrics per symbol in fixed time windows: taker (aggressor) buy versus sell volume and trade counts, broken o… Forex OrderbookOANDA's order book and position book by currency pair: where retail traders' open orders and positions sit relative to p… Forex PositionsRetail forex positioning by pair (share of traders long versus short), collected from several broker sentiment feeds.