Let's find some laden vessel movements

The below script returns:

vessel.name vessel.imo vessel.mmsi vessel.cubic_capacity vessel.dwt vessel.vessel_class origin.location.port.label origin.location.sts_zone.label origin.from_vessel.label origin.to_vessel.label destination.location.port.label destination.location.sts_zone.label destination.from_vessel.label destination.to_vessel.label origin.start_timestamp destination.end_timestamp cargoes.0.product.group.label cargoes.0.product.grade.label cargoes.0.product.grade.probability vessel.corporate_entities.charterer.label vessel.corporate_entities.time_charterer.label vessel.corporate_entities.effective_controller.label
0 17 FEBRUARY 9.38089e+06 248896000 172092 160391 suezmax Ras Tanura [SA] nan nan nan Malacca (Melaka) [MY] nan nan nan 2017-09-29T18:30:01+0000 2017-10-16T04:06:03+0000 Crude Arab Light 0.299732 nan nan CORE PETROLEUM
3 A MELODY 9.24931e+06 636019335 169352 149995 suezmax Ras Tanura [SA] nan nan nan Rayong [TH] nan nan nan 2017-09-20T09:15:15+0000 2017-10-09T20:07:28+0000 Crude Arab Light 0.903729 THAI OIL nan LMCS Maritime
4 A STAR 9.00660e+06 511801000 333924 291381 vlcc_plus nan nan nan nan nan nan nan nan nan 2017-10-08T14:50:01+0000 Crude nan nan nan nan nan
5 A STAR 9.15982e+06 356206000 9716 11047 general_purpose Shahid Rajaee Port (Bandar Abbas) [IR] nan nan nan Haldia [IN] nan nan nan 2017-09-23T23:59:30+0000 2017-10-16T01:49:00+0000 Dirty products Bitumen 1 nan nan nan
10 ABDIAS NASCIMENTO 9.4539e+06 710032990 171000 157055 suezmax Marlim Sul Field [BR] nan nan nan Sao Francisco Do Sul, SC [BR] nan nan nan 2017-09-28T18:29:45+0000 2017-10-04T23:05:32+0000 Crude nan nan nan nan PETROBRAS
11 ABIOLA 8.61943e+06 657995000 47261 35644 handysize Port Harcourt [NG] nan nan nan nan nan nan nan 2014-12-02T10:20:03+0000 nan Clean products Full Range 0.490481 nan nan nan
13 ABLIANI 9.69307e+06 256903000 124518 109999 aframax Ceyhan [TR] nan nan nan Sarroch (Porto Foxi) [IT] nan nan nan 2017-09-26T21:33:43+0000 2017-10-03T15:45:15+0000 Crude Azeri Light 1 nan nan Eastern Mediterranean Maritime Ltd
19 AC-D 9.42844e+06 256934000 8628 7842 tiny_tanker Varna [BG] nan nan nan Valencia [ES] nan nan nan 2017-09-20T08:00:58+0000 2017-10-06T15:49:00+0000 Clean products Finished Biodiesel 0.868073 nan nan nan
20 ACACIA 9.4766e+06 371044000 14570 13566 general_purpose Bontang, KL [ID] nan nan nan Lianyungang [CN] nan nan nan 2017-09-28T13:13:57+0000 2017-10-07T00:30:46+0000 Clean products Chemicals 0.999186 nan nan KOKUKA SANGYO
22 ACACIA RUBRA 9.46853e+06 249374000 6000 6065 tiny_tanker Mosjoen [NO] nan nan nan Sigerfjord [NO] nan nan nan 2017-10-01T00:01:53+0000 2017-10-06T10:53:20+0000 Dirty products nan nan nan nan nan
from datetime import datetime

from vortexasdk import VesselMovements

if __name__ == "__main__":
    # Query the API
    search_result = VesselMovements().search(
        filter_time_min=datetime(2017, 10, 1, 0),
        filter_time_max=datetime(2017, 10, 1, 1),
    )

    # A complete list of available columns can be found at https://vortechsa.github.io/python-sdk/endpoints/vessel_movements/#notes
    # We only require a subset of available columns here
    required_columns = [
        # Show metadata about the vessel
        "vessel.name",
        "vessel.imo",
        "vessel.mmsi",
        "vessel.cubic_capacity",
        "vessel.dwt",
        "vessel.vessel_class",
        # Show any corporate information associated with the vessel
        "vessel.corporate_entities.charterer.label",
        "vessel.corporate_entities.time_charterer.label",
        "vessel.corporate_entities.effective_controller.label",
        # Show the port, sts_zone, or vessel at the start of the vessel movement
        "origin.location.port.label",
        "origin.location.sts_zone.label",
        "origin.from_vessel.label",
        "origin.to_vessel.label",
        # Show the port, sts_zone, or vessel at the end of the vessel movement
        "destination.location.port.label",
        "destination.location.sts_zone.label",
        "destination.from_vessel.label",
        "destination.to_vessel.label",
        # The start and end timestamps of the movement
        "origin.start_timestamp",
        "destination.end_timestamp",
        # The cargo (if any), onboard the vessel during the vessel movement.
        # If the vessel was balast, then the cargo will be empty.
        "cargoes.0.product.group.label",
        "cargoes.0.product.grade.label",
        "cargoes.0.product.grade.probability",
    ]

    # Convert the search result to a dataframe
    vessel_movements = search_result.to_df(columns=required_columns)

    # Laden vessel movements are movements with a cargo (unlike ballast movements, where the vessel isn't carrying any cargo).
    is_laden_mask = vessel_movements["cargoes.0.product.group.label"].notna()

    # Let's find the laden vessel movements.
    laden_vessel_movements = vessel_movements[is_laden_mask]