Skip to content

Commit 25c6205

Browse files
JakeGrievesVortexaJake Grieves
andauthored
feat: migrate AFP SDK to new origin and destination fields (#569)
#### RELATED TICKETS - https://vortexa.atlassian.net/browse/RND-22152 ! Do not post related PRs here, unless they are open source ! #### CHANGELOG - Migrating all AFP origin_id, origin_port, destination_id, destination_port params -> origin, destination for standardisation in the code base - Migrated test suite to test against new headers and the new AFP responses (origin/ destination over the original origin_id ect) - Reran the appropriate ipynb files so cached output matches new responses #### TESTS - Tested in pytest against new AFP responses. - Tested locally #### COMMENTS - N/A --------- Co-authored-by: Jake Grieves <jake.grieves@Jakes-MacBook-Pro.local>
1 parent 5fa174c commit 25c6205

23 files changed

Lines changed: 203 additions & 158 deletions

docs/examples/try_me_out/anywhere_freight_pricing_forecast_explanation.ipynb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
"source": [
3939
"# Get monthly forecast explanation for a Handymax MR2 clean route from Rotterdam to Houston\n",
4040
"result = AnywhereFreightPricingForecastExplanation().search(\n",
41-
" origin_port=\"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
42-
" destination_port=\"ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb\",\n",
41+
" origin=\"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
42+
" destination=\"ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb\",\n",
4343
" vessel_class=\"oil_handymax_mr2\",\n",
4444
" product=\"clean\",\n",
4545
" frequency=\"month\",\n",

docs/examples/try_me_out/anywhere_freight_pricing_forecast_timeseries.ipynb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
"# Get weekly forecast pricing for a Handymax MR2 clean route from Rotterdam to Houston\n",
4141
"routes = [\n",
4242
" {\n",
43-
" \"origin_port\": \"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
44-
" \"destination_port\": \"ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb\",\n",
43+
" \"origin\": \"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
44+
" \"destination\": \"ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb\",\n",
4545
" \"product\": \"clean\",\n",
4646
" \"vessel_class\": \"oil_handymax_mr2\",\n",
4747
" }\n",

docs/examples/try_me_out/anywhere_freight_pricing_get_price_details.ipynb

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
"result = AnywhereFreightPricingGetPriceDetails().search(\n",
4242
" time_min=datetime(2024, 1, 1),\n",
4343
" time_max=datetime(2024, 12, 31),\n",
44-
" origin_port=\"7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030ec6b82f944a73d4da2f\",\n",
45-
" destination_port=\"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
44+
" origin=\"7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030ec6b82f944a73d4da2f\",\n",
45+
" destination=\"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
4646
" vessel_class=\"oil_aframax_lr2\",\n",
4747
" product=\"crude\",\n",
4848
" unit=\"usd_per_tonne\",\n",
@@ -83,14 +83,19 @@
8383
" <th>suggested_tonnage</th>\n",
8484
" <th>suggested_tonnage_overridden</th>\n",
8585
" <th>avoid_zone</th>\n",
86-
" <th>via_waypoint</th>\n",
8786
" <th>rates</th>\n",
8887
" <th>lumpsums</th>\n",
8988
" <th>confidences</th>\n",
9089
" <th>product</th>\n",
90+
" <th>origin.id</th>\n",
91+
" <th>...</th>\n",
92+
" <th>origin.lon</th>\n",
9193
" <th>origin_port.id</th>\n",
9294
" <th>origin_port.lat</th>\n",
9395
" <th>origin_port.lon</th>\n",
96+
" <th>destination.id</th>\n",
97+
" <th>destination.lat</th>\n",
98+
" <th>destination.lon</th>\n",
9499
" <th>destination_port.id</th>\n",
95100
" <th>destination_port.lat</th>\n",
96101
" <th>destination_port.lon</th>\n",
@@ -104,43 +109,60 @@
104109
" <td>85000.0</td>\n",
105110
" <td>False</td>\n",
106111
" <td>None</td>\n",
107-
" <td>None</td>\n",
108112
" <td>[{'date': '2024-01-01', 'breakdown': [{'type':...</td>\n",
109113
" <td>[{'date': '2024-01-01', 'breakdown': [{'type':...</td>\n",
110114
" <td>[{'date': '2024-01-01', 'value': 2}, {'date': ...</td>\n",
111115
" <td>crude</td>\n",
112116
" <td>7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e...</td>\n",
117+
" <td>...</td>\n",
118+
" <td>-95.14733</td>\n",
119+
" <td>7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e...</td>\n",
113120
" <td>29.71926</td>\n",
114121
" <td>-95.14733</td>\n",
115122
" <td>68faf65af1345067f11dc6723b8da32f00e304a6f33c00...</td>\n",
116123
" <td>51.90924</td>\n",
117124
" <td>4.27941</td>\n",
125+
" <td>68faf65af1345067f11dc6723b8da32f00e304a6f33c00...</td>\n",
126+
" <td>51.90924</td>\n",
127+
" <td>4.27941</td>\n",
118128
" </tr>\n",
119129
" </tbody>\n",
120130
"</table>\n",
131+
"<p>1 rows × 21 columns</p>\n",
121132
"</div>"
122133
],
123134
"text/plain": [
124135
" vessel_class max_dwt suggested_tonnage suggested_tonnage_overridden \\\n",
125136
"0 oil_aframax_lr2 119999.0 85000.0 False \n",
126137
"\n",
127-
" avoid_zone via_waypoint rates \\\n",
128-
"0 None None [{'date': '2024-01-01', 'breakdown': [{'type':... \n",
138+
" avoid_zone rates \\\n",
139+
"0 None [{'date': '2024-01-01', 'breakdown': [{'type':... \n",
129140
"\n",
130141
" lumpsums \\\n",
131142
"0 [{'date': '2024-01-01', 'breakdown': [{'type':... \n",
132143
"\n",
133144
" confidences product \\\n",
134145
"0 [{'date': '2024-01-01', 'value': 2}, {'date': ... crude \n",
135146
"\n",
136-
" origin_port.id origin_port.lat \\\n",
137-
"0 7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e... 29.71926 \n",
147+
" origin.id ... origin.lon \\\n",
148+
"0 7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e... ... -95.14733 \n",
149+
"\n",
150+
" origin_port.id origin_port.lat \\\n",
151+
"0 7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e... 29.71926 \n",
138152
"\n",
139-
" origin_port.lon destination_port.id \\\n",
153+
" origin_port.lon destination.id \\\n",
140154
"0 -95.14733 68faf65af1345067f11dc6723b8da32f00e304a6f33c00... \n",
141155
"\n",
142-
" destination_port.lat destination_port.lon \n",
143-
"0 51.90924 4.27941 "
156+
" destination.lat destination.lon \\\n",
157+
"0 51.90924 4.27941 \n",
158+
"\n",
159+
" destination_port.id destination_port.lat \\\n",
160+
"0 68faf65af1345067f11dc6723b8da32f00e304a6f33c00... 51.90924 \n",
161+
"\n",
162+
" destination_port.lon \n",
163+
"0 4.27941 \n",
164+
"\n",
165+
"[1 rows x 21 columns]"
144166
]
145167
},
146168
"execution_count": 3,

docs/examples/try_me_out/anywhere_freight_pricing_post_price_details.ipynb

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@
4040
"# Get price details for multiple routes\n",
4141
"routes = [\n",
4242
" {\n",
43-
" \"origin_port\": \"7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030ec6b82f944a73d4da2f\",\n",
44-
" \"destination_port\": \"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
43+
" \"origin\": \"7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030ec6b82f944a73d4da2f\",\n",
44+
" \"destination\": \"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
4545
" \"product\": \"crude\",\n",
4646
" \"vessel_class\": \"oil_aframax_lr2\",\n",
4747
" },\n",
4848
" {\n",
49-
" \"origin_port\": \"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
50-
" \"destination_port\": \"ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb\",\n",
49+
" \"origin\": \"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
50+
" \"destination\": \"ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb\",\n",
5151
" \"product\": \"clean\",\n",
5252
" \"vessel_class\": \"oil_handymax_mr2\",\n",
5353
" }\n",
@@ -92,14 +92,19 @@
9292
" <th>suggested_tonnage</th>\n",
9393
" <th>suggested_tonnage_overridden</th>\n",
9494
" <th>avoid_zone</th>\n",
95-
" <th>via_waypoint</th>\n",
9695
" <th>rates</th>\n",
9796
" <th>lumpsums</th>\n",
9897
" <th>confidences</th>\n",
9998
" <th>product</th>\n",
99+
" <th>origin.id</th>\n",
100+
" <th>...</th>\n",
101+
" <th>origin.lon</th>\n",
100102
" <th>origin_port.id</th>\n",
101103
" <th>origin_port.lat</th>\n",
102104
" <th>origin_port.lon</th>\n",
105+
" <th>destination.id</th>\n",
106+
" <th>destination.lat</th>\n",
107+
" <th>destination.lon</th>\n",
103108
" <th>destination_port.id</th>\n",
104109
" <th>destination_port.lat</th>\n",
105110
" <th>destination_port.lon</th>\n",
@@ -113,17 +118,22 @@
113118
" <td>85000.0</td>\n",
114119
" <td>False</td>\n",
115120
" <td>None</td>\n",
116-
" <td>None</td>\n",
117121
" <td>[{'date': '2024-01-01', 'breakdown': [{'type':...</td>\n",
118122
" <td>[{'date': '2024-01-01', 'breakdown': [{'type':...</td>\n",
119123
" <td>[{'date': '2024-01-01', 'value': 2}, {'date': ...</td>\n",
120124
" <td>crude</td>\n",
121125
" <td>7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e...</td>\n",
126+
" <td>...</td>\n",
127+
" <td>-95.14733</td>\n",
128+
" <td>7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e...</td>\n",
122129
" <td>29.71926</td>\n",
123130
" <td>-95.14733</td>\n",
124131
" <td>68faf65af1345067f11dc6723b8da32f00e304a6f33c00...</td>\n",
125132
" <td>51.90924</td>\n",
126133
" <td>4.27941</td>\n",
134+
" <td>68faf65af1345067f11dc6723b8da32f00e304a6f33c00...</td>\n",
135+
" <td>51.90924</td>\n",
136+
" <td>4.27941</td>\n",
127137
" </tr>\n",
128138
" <tr>\n",
129139
" <th>1</th>\n",
@@ -132,30 +142,36 @@
132142
" <td>37000.0</td>\n",
133143
" <td>False</td>\n",
134144
" <td>None</td>\n",
135-
" <td>None</td>\n",
136145
" <td>[{'date': '2024-01-01', 'breakdown': [{'type':...</td>\n",
137146
" <td>[{'date': '2024-01-01', 'breakdown': [{'type':...</td>\n",
138147
" <td>[{'date': '2024-01-01', 'value': 3}, {'date': ...</td>\n",
139148
" <td>clean</td>\n",
140149
" <td>68faf65af1345067f11dc6723b8da32f00e304a6f33c00...</td>\n",
150+
" <td>...</td>\n",
151+
" <td>4.27941</td>\n",
152+
" <td>68faf65af1345067f11dc6723b8da32f00e304a6f33c00...</td>\n",
141153
" <td>51.90924</td>\n",
142154
" <td>4.27941</td>\n",
143155
" <td>ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da...</td>\n",
144156
" <td>40.68878</td>\n",
145157
" <td>-74.05066</td>\n",
158+
" <td>ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da...</td>\n",
159+
" <td>40.68878</td>\n",
160+
" <td>-74.05066</td>\n",
146161
" </tr>\n",
147162
" </tbody>\n",
148163
"</table>\n",
164+
"<p>2 rows × 21 columns</p>\n",
149165
"</div>"
150166
],
151167
"text/plain": [
152168
" vessel_class max_dwt suggested_tonnage \\\n",
153169
"0 oil_aframax_lr2 119999.0 85000.0 \n",
154170
"1 oil_handymax_mr2 54999.0 37000.0 \n",
155171
"\n",
156-
" suggested_tonnage_overridden avoid_zone via_waypoint \\\n",
157-
"0 False None None \n",
158-
"1 False None None \n",
172+
" suggested_tonnage_overridden avoid_zone \\\n",
173+
"0 False None \n",
174+
"1 False None \n",
159175
"\n",
160176
" rates \\\n",
161177
"0 [{'date': '2024-01-01', 'breakdown': [{'type':... \n",
@@ -169,17 +185,31 @@
169185
"0 [{'date': '2024-01-01', 'value': 2}, {'date': ... crude \n",
170186
"1 [{'date': '2024-01-01', 'value': 3}, {'date': ... clean \n",
171187
"\n",
172-
" origin_port.id origin_port.lat \\\n",
173-
"0 7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e... 29.71926 \n",
174-
"1 68faf65af1345067f11dc6723b8da32f00e304a6f33c00... 51.90924 \n",
188+
" origin.id ... origin.lon \\\n",
189+
"0 7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e... ... -95.14733 \n",
190+
"1 68faf65af1345067f11dc6723b8da32f00e304a6f33c00... ... 4.27941 \n",
191+
"\n",
192+
" origin_port.id origin_port.lat \\\n",
193+
"0 7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030e... 29.71926 \n",
194+
"1 68faf65af1345067f11dc6723b8da32f00e304a6f33c00... 51.90924 \n",
175195
"\n",
176-
" origin_port.lon destination_port.id \\\n",
196+
" origin_port.lon destination.id \\\n",
177197
"0 -95.14733 68faf65af1345067f11dc6723b8da32f00e304a6f33c00... \n",
178198
"1 4.27941 ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da... \n",
179199
"\n",
180-
" destination_port.lat destination_port.lon \n",
181-
"0 51.90924 4.27941 \n",
182-
"1 40.68878 -74.05066 "
200+
" destination.lat destination.lon \\\n",
201+
"0 51.90924 4.27941 \n",
202+
"1 40.68878 -74.05066 \n",
203+
"\n",
204+
" destination_port.id destination_port.lat \\\n",
205+
"0 68faf65af1345067f11dc6723b8da32f00e304a6f33c00... 51.90924 \n",
206+
"1 ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da... 40.68878 \n",
207+
"\n",
208+
" destination_port.lon \n",
209+
"0 4.27941 \n",
210+
"1 -74.05066 \n",
211+
"\n",
212+
"[2 rows x 21 columns]"
183213
]
184214
},
185215
"execution_count": 3,
@@ -197,13 +227,6 @@
197227
"source": [
198228
"That's it! You've successfully loaded data using the Vortexa SDK. Check out https://vortechsa.github.io/python-sdk/ for more examples"
199229
]
200-
},
201-
{
202-
"cell_type": "code",
203-
"execution_count": null,
204-
"metadata": {},
205-
"outputs": [],
206-
"source": []
207230
}
208231
],
209232
"metadata": {

docs/examples/try_me_out/anywhere_freight_pricing_price_timeseries.ipynb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
"# Get daily pricing for a Handymax MR2 clean route from Rotterdam to New York\n",
4141
"routes = [\n",
4242
" {\n",
43-
" \"origin_port\": \"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
44-
" \"destination_port\": \"ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb\",\n",
43+
" \"origin\": \"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
44+
" \"destination\": \"ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb\",\n",
4545
" \"product\": \"clean\",\n",
4646
" \"vessel_class\": \"oil_handymax_mr2\",\n",
4747
" }\n",

docs/examples/try_me_out/anywhere_freight_pricing_top_ports_destination.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"source": [
3939
"# Get top destination ports for clean products from Houston using MR2 vessels\n",
4040
"result = AnywhereFreightPricingTopPortsDestination().search(\n",
41-
" origin_id=\"7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030ec6b82f944a73d4da2f\",\n",
41+
" origin=\"7f314ba0a498c36359b1c88781e94a73e19dcc9bbb030ec6b82f944a73d4da2f\",\n",
4242
" vessel_class=\"oil_handymax_mr2\",\n",
4343
" product=\"clean\",\n",
4444
" unit=\"usd_per_tonne\",\n",

docs/examples/try_me_out/anywhere_freight_pricing_top_ports_origin.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"source": [
3939
"# Get top origin ports for clean products to Rotterdam using MR2 vessels\n",
4040
"result = AnywhereFreightPricingTopPortsOrigin().search(\n",
41-
" destination_id=\"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
41+
" destination=\"68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e\",\n",
4242
" vessel_class=\"oil_handymax_mr2\",\n",
4343
" product=\"clean\",\n",
4444
" unit=\"usd_per_tonne\",\n",

tests/endpoints/test_anywhere_freight_pricing_forecast_explanation.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
class TestAnywhereFreightPricingForecastExplanation(TestCaseUsingRealAPI):
66
def test_search_returns_data(self):
77
result = AnywhereFreightPricingForecastExplanation().search(
8-
origin_port="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
9-
destination_port="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
8+
origin="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
9+
destination="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
1010
vessel_class="oil_handymax_mr2",
1111
product="clean",
1212
frequency="month",
@@ -19,8 +19,8 @@ def test_search_returns_data(self):
1919

2020
def test_search_to_df(self):
2121
result = AnywhereFreightPricingForecastExplanation().search(
22-
origin_port="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
23-
destination_port="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
22+
origin="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
23+
destination="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
2424
vessel_class="oil_handymax_mr2",
2525
product="clean",
2626
frequency="month",
@@ -33,8 +33,8 @@ def test_search_to_df(self):
3333

3434
def test_search_with_week_frequency(self):
3535
result = AnywhereFreightPricingForecastExplanation().search(
36-
origin_port="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
37-
destination_port="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
36+
origin="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
37+
destination="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
3838
vessel_class="oil_handymax_mr2",
3939
product="clean",
4040
frequency="week",
@@ -47,8 +47,8 @@ def test_search_with_week_frequency(self):
4747

4848
def test_search_with_avoid_zone(self):
4949
result = AnywhereFreightPricingForecastExplanation().search(
50-
origin_port="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
51-
destination_port="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
50+
origin="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
51+
destination="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
5252
vessel_class="oil_handymax_mr2",
5353
product="clean",
5454
frequency="month",
@@ -60,8 +60,8 @@ def test_search_with_avoid_zone(self):
6060

6161
def test_search_with_include_port_costs(self):
6262
result = AnywhereFreightPricingForecastExplanation().search(
63-
origin_port="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
64-
destination_port="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
63+
origin="68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e",
64+
destination="ea4921c8ad4fddb5fe3e7a4f834c1aa5863e43283c73da5f02d93bbc5dba72eb",
6565
vessel_class="oil_handymax_mr2",
6666
product="clean",
6767
frequency="month",

0 commit comments

Comments
 (0)