Supply trend with market rates¶
This is an example combining functionality from our Voyages, Market Rates and Tonnage List APIs. The aim of the example is to plot a supply trend with superimposed, predicted market rates, in order to get a hollistic view of market behaviour during a specific period, for a specific load port, and a specific vessel class.
Run this example in Colab¶
Setup¶
Install the Signal Ocean SDK:
!pip install signal-ocean
Requirement already satisfied: signal-ocean in c:\users\kimon\workspace\signalsdk (2.0.0) Requirement already satisfied: requests<3,>=2.23.0 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from signal-ocean) (2.28.1) Requirement already satisfied: python-dateutil<3,>=2.8.1 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from signal-ocean) (2.8.2) Requirement already satisfied: pandas<2,>=1.0.3 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from signal-ocean) (1.3.0) Requirement already satisfied: numpy>=1.18.5 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from signal-ocean) (1.23.5) Requirement already satisfied: strictly-typed-pandas==0.1.4 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from signal-ocean) (0.1.4) Requirement already satisfied: typeguard>=2.13.3 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from signal-ocean) (2.13.3) Requirement already satisfied: pandas-stubs in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from strictly-typed-pandas==0.1.4->signal-ocean) (1.4.3.220718) Requirement already satisfied: pytz>=2017.3 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from pandas<2,>=1.0.3->signal-ocean) (2020.1) Requirement already satisfied: six>=1.5 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from python-dateutil<3,>=2.8.1->signal-ocean) (1.15.0) Requirement already satisfied: charset-normalizer<3,>=2 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from requests<3,>=2.23.0->signal-ocean) (2.1.1) Requirement already satisfied: certifi>=2017.4.17 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from requests<3,>=2.23.0->signal-ocean) (2020.4.5.1) Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from requests<3,>=2.23.0->signal-ocean) (1.25.9) Requirement already satisfied: idna<4,>=2.5 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from requests<3,>=2.23.0->signal-ocean) (2.9) Requirement already satisfied: types-pytz>=2022.1.1 in c:\users\kimon\workspace\signalsdk\venv2\lib\site-packages (from pandas-stubs->strictly-typed-pandas==0.1.4->signal-ocean) (2022.1.2) [notice] A new release of pip available: 22.2 -> 22.3.1 [notice] To update, run: python.exe -m pip install --upgrade pip
Import required dependencies:
from datetime import date, timedelta
import pandas as pd
import matplotlib.pyplot as plt
from signal_ocean import Connection
from signal_ocean.voyages import VoyagesAPI
from signal_ocean.market_rates import MarketRatesAPI, CargoId
from signal_ocean.tonnage_list import (
TonnageListAPI,
VesselClassFilter,
PortFilter,
VesselFilter,
PushType,
MarketDeployment,
CommercialStatus,
VesselSubclass,
IndexLevel,
DateRange,
)
Get your personal Signal Ocean API subscription key (acquired here) and use it to create a Connection
:
signal_ocean_api_key = "" # replace with your subscription key
connection = Connection(signal_ocean_api_key)
Create instances of APIs used throughout this notebook:
voyage_api = VoyagesAPI(connection)
tonnage_list_api = TonnageListAPI(connection)
market_rate_api = MarketRatesAPI(connection)
Parametrization¶
In order to plot a supply trend with the predicted market rates, we need to specify the following parameters for our queries:
vessel_class
- the class of queried vessels.load_port
- the loading port.days_back
- the number of days the supply trend should reach back, starting from the current date.laycan_end_in_days
- the maximum estimated time of arrival for available vessels to reach the loading port.push_type
- the vessels' push status, if available from the emails in your account.market_deployment
- the vessels' market deployment.commercial_status
- commercial status of the vessels at each point in time.vessel_subclass
- the type of oil product the vessel is classified to carry.ais_since
- how many days since the vessel has transmitted its AIS data.route_description
- the route of interest with available market rates.
vessel_class_filter = VesselClassFilter(name_like="Aframax")
load_port_filter = PortFilter(name_like="Ceyhan")
days_back = 90
laycan_end_in_days = 10
vessel_filter = VesselFilter(
push_types=[PushType.PUSHED_POSS, PushType.PUSHED],
market_deployments=[MarketDeployment.RELET, MarketDeployment.SPOT],
commercial_statuses=[
CommercialStatus.AVAILABLE,
CommercialStatus.ON_SUBS,
CommercialStatus.FAILED,
CommercialStatus.CANCELLED,
],
vessel_subclass=VesselSubclass.DIRTY,
latest_ais_since=5,
)
route_description = "Afra - Med/Med"
today = date.today()
start_date = today - timedelta(days=days_back)
end_date = today
For more information, see the Tonnage List and Market Rate API sections.
Retrieve the historical tonnage list¶
vessel_class = tonnage_list_api.get_vessel_classes(vessel_class_filter)[0]
load_port = tonnage_list_api.get_ports(load_port_filter)[0]
htl = tonnage_list_api.get_historical_tonnage_list(
load_port,
vessel_class,
laycan_end_in_days,
DateRange(start_date, end_date),
vessel_filter,
)
htl_for_supply_trend = htl.to_data_frame()
htl_for_supply_trend
name | vessel_class | ice_class | year_built | deadweight | length_overall | breadth_extreme | subclass | market_deployment_point_in_time | push_type_point_in_time | ... | open_prediction_accuracy_point_in_time | open_country_point_in_time | open_narrow_area_point_in_time | open_wide_area_point_in_time | availability_port_type_point_in_time | availability_date_type_point_in_time | fixture_type_point_in_time | current_vessel_sub_type_id_point_in_time | current_vessel_sub_type_point_in_time | willing_to_switch_current_vessel_sub_type_point_in_time | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
date | imo | |||||||||||||||||||||
2023-09-06 12:00:00+00:00 | 9262924 | Linda I | Aframax | NaN | 2002 | 109189 | 241.00 | 42 | Dirty | Relet | Pushed | ... | Narrow Area | Russian Federation | Black Sea | Black Sea / Sea Of Marmara | Source | Source | NaN | 1 | Source | False |
9293155 | Wonder Vega | Aframax | NaN | 2005 | 106062 | 244.00 | 42 | Dirty | Spot | Pushed | ... | Narrow Area | Greece | East Mediterranean | Mediterranean | Source | Source | NaN | 1 | Source | False | |
9407457 | Matilda | Aframax | NaN | 2009 | 112935 | 249.96 | 44 | Dirty | Spot | Pushed | ... | Narrow Area | Turkey | Sea of Marmara | Black Sea / Sea Of Marmara | Source | Source | Scraped | 1 | Source | False | |
9308443 | Royall | Aframax | 1D | 2006 | 110531 | 244.50 | 42 | Dirty | Relet | Pushed | ... | Port | Egypt | Red Sea | Red Sea | Source | Source | Scraped | 1 | Source | False | |
9276573 | Minerva Eleonora | Aframax | 1C | 2004 | 103622 | 244.00 | 42 | Dirty | Spot | Pushed | ... | Narrow Area | Egypt | Red Sea | Red Sea | Source | Source | NaN | 1 | Source | False | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2023-06-09 12:00:00+00:00 | 9334739 | Olib | Aframax | 1C | 2009 | 108932 | 246.00 | 48 | Dirty | Spot | Pushed | ... | Narrow Area | Spain | Iberian Atlantic Coast | UK Continent | Source | Source | Scraped | 1 | Source | False |
9285835 | Sea Fidelity | Aframax | NaN | 2005 | 115341 | 249.87 | 44 | Dirty | Spot | Pushed POSS | ... | Port | Italy | Central Mediterranean | Mediterranean | Source | Prediction | NaN | 1 | Prediction | False | |
9261619 | Sea Luck III | Aframax | NaN | 2003 | 105869 | 243.96 | 43 | Dirty | Spot | Pushed | ... | Narrow Area | Saudi Arabia | Red Sea | Red Sea | Prediction | Prediction | NaN | 1 | Prediction | False | |
9329409 | Kriti Samaria | Aframax | NaN | 2007 | 105865 | 241.03 | 42 | Dirty | Relet | Pushed | ... | Port | Italy | Central Mediterranean | Mediterranean | Source | Prediction | NaN | 1 | Prediction | False | |
9645401 | Affinity V | Aframax | NaN | 2016 | 114070 | 252.00 | 45 | Dirty | Spot | Pushed POSS | ... | Port | Italy | Central Mediterranean | Mediterranean | Source | Prediction | NaN | 1 | Prediction | False |
3029 rows × 29 columns
Get daily market rates for the route¶
We'll need a helper function to find our desired route for the market rates:
def return_selected_route(vessel_class, route_description):
vessel_routes = market_rate_api.get_routes(vessel_class_id=vessel_class.id)
for i, v in enumerate(vessel_routes):
if vessel_routes[i].description == route_description:
break
return vessel_routes[i]
Which we can use to find the route object returned from the Market Rates API:
market_rate_route = return_selected_route(vessel_class, route_description)
And use it to query for market rates:
market_rates = market_rate_api.get_market_rates(
start_date,
route_id=market_rate_route.id,
vessel_class_id=vessel_class.id,
end_date=end_date,
cargo_id=CargoId(market_rate_route.cargo_id)
)
market_rates = pd.DataFrame([vars(vr) for vr in market_rates])
market_rates["rate_date"] = pd.to_datetime(market_rates["rate_date"])
market_rates.set_index("rate_date", inplace=True)
market_rates
route_id | rate_value | unit | vessel_class_id | deprecated_to | |
---|---|---|---|---|---|
rate_date | |||||
2023-06-09 | R1 | 147.5 | WS | 86 | None |
2023-06-10 | R1 | 147.5 | WS | 86 | None |
2023-06-11 | R1 | 147.5 | WS | 86 | None |
2023-06-12 | R1 | 142.5 | WS | 86 | None |
2023-06-13 | R1 | 142.5 | WS | 86 | None |
... | ... | ... | ... | ... | ... |
2023-09-03 | R1 | 101.5 | WS | 86 | None |
2023-09-04 | R1 | 101.5 | WS | 86 | None |
2023-09-05 | R1 | 96.5 | WS | 86 | None |
2023-09-06 | R1 | 95.5 | WS | 86 | None |
2023-09-07 | R1 | 95.5 | WS | 86 | None |
91 rows × 5 columns
Plot the daily supply trend with market rates¶
plt.style.use("seaborn")
fig, axs = plt.subplots(figsize=(15, 6))
supply_trend = htl_for_supply_trend.groupby(IndexLevel.DATE, sort=True).size()
supply_trend.index = supply_trend.index.strftime("%d %b %y")
# Left axis (Supply plot)
supply_plot = supply_trend.plot(ax=axs, x="date", color="#3086EF", marker="o")
supply_plot.set_ylabel(
"Vessel count", color=plt.gca().lines[-1].get_color(), fontsize=14
)
supply_plot.set_ylim(ymin=0)
# Right axis (Market rate plot)
market_rates.index = market_rates.index.strftime("%d %b %y")
mr_plot = market_rates.plot(
ax=axs, y="rate_value", secondary_y=True, color="#F06C6E", marker="d"
)
mr_plot.set_ylabel(
"Market Rates (WS)", color=plt.gca().lines[-1].get_color(), fontsize=14
)
axs.set_xlim(0, len(supply_trend) - 1)
axs.set_xlabel("")
axs.get_legend().remove()
C:\Users\Kimon\AppData\Local\Temp\ipykernel_18828\1394344043.py:1: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead. plt.style.use("seaborn")
Perform a point-to-point comparison¶
Here's an example of a workflow to compare two different points in time.
Specify the dates to compare:
point_a = today - timedelta(days=1)
point_b = today - timedelta(days=5)
dates = htl_for_supply_trend.index.get_level_values("date").date
if not any(dates == point_a):
print("Point A is not within imported date values.")
elif not any(dates == point_b):
print("Point B is not within imported date values.")
vessels_in_a = htl_for_supply_trend.loc[(dates == point_a)]
vessels_in_b = htl_for_supply_trend.loc[(dates == point_b)]
Intersection of Vessel IMOs¶
intersection = pd.merge(
vessels_in_a.add_suffix("_IN_A"),
vessels_in_b.add_suffix("_IN_B"),
how="inner",
on="imo",
)
intersection
name_IN_A | vessel_class_IN_A | ice_class_IN_A | year_built_IN_A | deadweight_IN_A | length_overall_IN_A | breadth_extreme_IN_A | subclass_IN_A | market_deployment_point_in_time_IN_A | push_type_point_in_time_IN_A | ... | open_prediction_accuracy_point_in_time_IN_B | open_country_point_in_time_IN_B | open_narrow_area_point_in_time_IN_B | open_wide_area_point_in_time_IN_B | availability_port_type_point_in_time_IN_B | availability_date_type_point_in_time_IN_B | fixture_type_point_in_time_IN_B | current_vessel_sub_type_id_point_in_time_IN_B | current_vessel_sub_type_point_in_time_IN_B | willing_to_switch_current_vessel_sub_type_point_in_time_IN_B | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
imo | |||||||||||||||||||||
9262924 | Linda I | Aframax | NaN | 2002 | 109189 | 241.00 | 42 | Dirty | Relet | Pushed | ... | Narrow Area | Russian Federation | Black Sea | Black Sea / Sea Of Marmara | Source | Source | NaN | 1 | Source | False |
9407457 | Matilda | Aframax | NaN | 2009 | 112935 | 249.96 | 44 | Dirty | Spot | Pushed | ... | Port | Turkey | Sea of Marmara | Black Sea / Sea Of Marmara | Source | Prediction | NaN | 1 | Prediction | False |
9276573 | Minerva Eleonora | Aframax | 1C | 2004 | 103622 | 244.00 | 42 | Dirty | Spot | Pushed | ... | Port | Saudi Arabia | Red Sea | Red Sea | Source | Prediction | NaN | 1 | Prediction | False |
9930105 | Ghat | Aframax | NaN | 2022 | 115519 | 249.90 | 44 | Dirty | Spot | Pushed | ... | Port | Italy | Central Mediterranean | Mediterranean | Source | Prediction | Scraped | 1 | Prediction | False |
9815616 | Levantine Sea | Aframax | 1C | 2018 | 114218 | 249.80 | 44 | Dirty | Spot | Pushed | ... | Port | Turkey | Sea of Marmara | Black Sea / Sea Of Marmara | Source | Prediction | NaN | 1 | Prediction | False |
9801524 | Ambelos | Aframax | NaN | 2017 | 114674 | 250.00 | 44 | Dirty | Spot | Pushed | ... | Narrow Area | Oman | Arabian Gulf | Arabian Gulf | Source | Source | NaN | 1 | Source | False |
9592290 | Nissos Paros | Aframax | NaN | 2012 | 115723 | 248.97 | 44 | Dirty | Spot | Pushed | ... | Narrow Area | Oman | Arabian Gulf | Arabian Gulf | Source | Source | NaN | 1 | Source | False |
9259197 | Thalia III | Aframax | NaN | 2003 | 107127 | 246.78 | 42 | Dirty | Relet | Pushed | ... | Port | Turkey | Sea of Marmara | Black Sea / Sea Of Marmara | Source | Source | NaN | 1 | Source | False |
9417452 | Chrysanthemum | Aframax | NaN | 2009 | 105187 | 243.97 | 42 | Dirty | Spot | Pushed | ... | Narrow Area | Spain | Iberian Atlantic Coast | UK Continent | Source | Source | NaN | 1 | Source | False |
9 rows × 58 columns
Difference between vessel IMOs in relation to point A¶
vessels_in_a_but_not_in_b = (
vessels_in_a.add_suffix("_IN_A")
.merge(
vessels_in_b.add_suffix("_IN_B"), indicator=True, how="left", on="imo"
)
.loc[lambda x: x["_merge"] != "both"]
)
vessels_in_a_but_not_in_b
name_IN_A | vessel_class_IN_A | ice_class_IN_A | year_built_IN_A | deadweight_IN_A | length_overall_IN_A | breadth_extreme_IN_A | subclass_IN_A | market_deployment_point_in_time_IN_A | push_type_point_in_time_IN_A | ... | open_country_point_in_time_IN_B | open_narrow_area_point_in_time_IN_B | open_wide_area_point_in_time_IN_B | availability_port_type_point_in_time_IN_B | availability_date_type_point_in_time_IN_B | fixture_type_point_in_time_IN_B | current_vessel_sub_type_id_point_in_time_IN_B | current_vessel_sub_type_point_in_time_IN_B | willing_to_switch_current_vessel_sub_type_point_in_time_IN_B | _merge | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
imo | |||||||||||||||||||||
9293155 | Wonder Vega | Aframax | NaN | 2005 | 106062 | 244.00 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9308443 | Royall | Aframax | 1D | 2006 | 110531 | 244.50 | 42 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9913511 | Nafsika | Aframax | NaN | 2022 | 112100 | 237.00 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9773753 | Seacalm | Aframax | NaN | 2017 | 112119 | 238.30 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9337418 | Patmos Warrior | Aframax | NaN | 2007 | 105572 | 239.00 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9527855 | Alicante | Aframax | NaN | 2013 | 115708 | 248.97 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9779941 | Shusha | Aframax | 1C | 2017 | 113838 | 250.00 | 44 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9292515 | Erik Spirit | Aframax | NaN | 2005 | 115525 | 249.90 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9592252 | Minerva Kythnos | Aframax | NaN | 2011 | 115674 | 248.97 | 44 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9436020 | Crude Centurion | Aframax | NaN | 2010 | 112863 | 249.96 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9309423 | Minerva Nounou | Aframax | 1A | 2006 | 114850 | 253.59 | 44 | Dirty | Spot | Pushed POSS | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9857468 | Seatribute | Aframax | NaN | 2020 | 111890 | 237.00 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9384992 | Sousta | Aframax | NaN | 2007 | 106045 | 240.50 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9787170 | Minerva Karteria | Aframax | NaN | 2018 | 114780 | 250.01 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9290361 | Seaoath | Aframax | 1C | 2005 | 105472 | 243.98 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9439670 | Captain A. Stellatos | Aframax | NaN | 2010 | 105849 | 243.97 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9402495 | Dubai Charm | Aframax | NaN | 2010 | 115514 | 250.00 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
17 rows × 59 columns
Difference between vessel IMOs in relation to point B¶
vessels_in_b_but_not_in_a = (
vessels_in_b.add_suffix("_IN_B")
.merge(
vessels_in_a.add_suffix("_IN_A"), indicator=True, how="left", on="imo"
)
.loc[lambda x: x["_merge"] != "both"]
)
vessels_in_b_but_not_in_a
name_IN_B | vessel_class_IN_B | ice_class_IN_B | year_built_IN_B | deadweight_IN_B | length_overall_IN_B | breadth_extreme_IN_B | subclass_IN_B | market_deployment_point_in_time_IN_B | push_type_point_in_time_IN_B | ... | open_country_point_in_time_IN_A | open_narrow_area_point_in_time_IN_A | open_wide_area_point_in_time_IN_A | availability_port_type_point_in_time_IN_A | availability_date_type_point_in_time_IN_A | fixture_type_point_in_time_IN_A | current_vessel_sub_type_id_point_in_time_IN_A | current_vessel_sub_type_point_in_time_IN_A | willing_to_switch_current_vessel_sub_type_point_in_time_IN_A | _merge | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
imo | |||||||||||||||||||||
9821706 | Elandra Sound | Aframax | NaN | 2018 | 115711 | 249.90 | 44 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9309435 | Minerva Alice | Aframax | 1A | 2006 | 114850 | 254.00 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9420617 | Silver | Aframax | NaN | 2010 | 107507 | 243.80 | 43 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9810513 | Karabakh | Aframax | NaN | 2018 | 114667 | 250.00 | 44 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9334739 | Olib | Aframax | 1C | 2009 | 108932 | 246.00 | 48 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9356438 | Alyarmouk | Aframax | NaN | 2008 | 116038 | 248.96 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9384564 | Red Sun | Aframax | NaN | 2008 | 115325 | 243.80 | 42 | Dirty | Spot | Pushed POSS | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9373656 | Seastar | Aframax | NaN | 2008 | 116050 | 249.97 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9777931 | Ryman | Aframax | 1A | 2017 | 112870 | 250.00 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9458016 | Delta Star | Aframax | NaN | 2013 | 115618 | 249.97 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9696773 | Alfa Baltica | Aframax | NaN | 2015 | 106373 | 228.60 | 42 | Dirty | Spot | Pushed POSS | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9276585 | Minerva Roxanne | Aframax | 1C | 2004 | 103560 | 243.56 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9802176 | Sea Puma | Aframax | NaN | 2018 | 114609 | 250.00 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9285861 | Minerva Iris | Aframax | 1A | 2004 | 103124 | 243.57 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9787168 | Minerva Eleftheria | Aframax | NaN | 2018 | 114696 | 250.00 | 44 | Dirty | Spot | Pushed POSS | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9728241 | Minerva Baltica | Aframax | 1B | 2018 | 113172 | 250.00 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9398266 | Kriti Legend | Aframax | NaN | 2009 | 107518 | 243.80 | 42 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9317951 | Minerva Libra | Aframax | 1A | 2007 | 116779 | 249.88 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9927196 | Green Admire | Aframax | NaN | 2022 | 114377 | 249.99 | 44 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9446427 | Altai | Aframax | NaN | 2011 | 115952 | 248.96 | 44 | Dirty | Spot | Pushed POSS | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9338917 | Aegean Harmony | Aframax | NaN | 2007 | 115824 | 248.93 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9893046 | Pacific Diamond | Aframax | 1C | 2021 | 113306 | 249.90 | 44 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9787194 | Minerva Olympia | Aframax | NaN | 2019 | 114780 | 250.00 | 44 | Dirty | Spot | Pushed POSS | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9329409 | Kriti Samaria | Aframax | NaN | 2007 | 105865 | 241.03 | 42 | Dirty | Relet | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9288734 | Seabravery | Aframax | 1C | 2005 | 105042 | 243.96 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9334727 | Dugi Otok | Aframax | 1C | 2008 | 108932 | 246.00 | 48 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9439383 | PS Genova | Aframax | NaN | 2010 | 108983 | 243.00 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9801976 | Prometheus Light | Aframax | NaN | 2019 | 114700 | 249.99 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9304368 | Seasenator | Aframax | NaN | 2007 | 105715 | 241.03 | 42 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
9796743 | Rava | Aframax | 1C | 2017 | 114385 | 250.00 | 44 | Dirty | Spot | Pushed | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | left_only |
30 rows × 59 columns