{ "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "This notebook was generated on 14 July 2020. Vortexa is constantly improving the quality of our data and models, and consequently some historical data points may change causing future runs of the notebook to yield different results.\n", "\n", "The version of Vortexa SDK used to generate this notebook was:\n", "\n", "vortexasdk-0.21.1\n", "\n", "The following packages were installed to run this notebook:\n", "\n", "pandas==0.25.2\n", "matplotlib==3.2.2" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from vortexasdk import Products, CargoTimeSeries, Geographies\n", "from datetime import datetime\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Products tutorial" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First I’m going to show you how to get the Vortexa ID for a product you are interested in studying. There are many ways of doing this, and today I’m going to show you one option I have used." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the examples in the docs found here: https://vortechsa.github.io/python-sdk/endpoints/products/. We can see an example line of code which shows us how to look in for different products in a list" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2020-07-15 15:25:42,239 vortexasdk.operations — INFO — Searching Products\n", "2020-07-15 15:25:42,240 vortexasdk.client — INFO — Creating new VortexaClient\n", "2020-07-15 15:25:42,795 vortexasdk.client — WARNING — You are using vortexasdk version 0.21.1, however version 0.23.0 is available.\n", "You should consider upgrading via the 'pip install vortexasdk --upgrade' command.\n", "2020-07-15 15:25:42,796 vortexasdk.client — INFO — Payload: {'term': ['diesel', 'fuel oil', 'grane'], 'allowTopLevelProducts': True}\n", "2020-07-15 15:25:43,452 vortexasdk.client — INFO — 71 Results to retrieve. Sending 1 post requests in parallel using 6 threads.\n" ] } ], "source": [ "df = Products().search(term=['diesel', 'fuel oil', 'grane']).to_df()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamelayer.0parent.0.name
01c107b4317bc2c85fb6c13cd7b28e8e0a02ec7fecc68af...Fuel Oilgroup_productDirty Petroleum Products
1da9e67b1dd201a1ad3ae251e6dce8fad404ce50d53adba...RMD Fuel OilgradeHigh Sulphur Fuel Oil
2e6e879021c45470d84ee2f182a42a13537b489ae730640...Other Fuel OilsgradeHigh Sulphur Fuel Oil
3d31139c20953fae7510f0982c922736391b752dced644c...Cracked Fuel OilgradeHigh Sulphur Fuel Oil
40dd7857f328177189e20a54af1dc599c8b7e04e79e61cd...Fuel Oil CutgradeHigh Sulphur Fuel Oil
\n", "
" ], "text/plain": [ " id name \\\n", "0 1c107b4317bc2c85fb6c13cd7b28e8e0a02ec7fecc68af... Fuel Oil \n", "1 da9e67b1dd201a1ad3ae251e6dce8fad404ce50d53adba... RMD Fuel Oil \n", "2 e6e879021c45470d84ee2f182a42a13537b489ae730640... Other Fuel Oils \n", "3 d31139c20953fae7510f0982c922736391b752dced644c... Cracked Fuel Oil \n", "4 0dd7857f328177189e20a54af1dc599c8b7e04e79e61cd... Fuel Oil Cut \n", "\n", " layer.0 parent.0.name \n", "0 group_product Dirty Petroleum Products \n", "1 grade High Sulphur Fuel Oil \n", "2 grade High Sulphur Fuel Oil \n", "3 grade High Sulphur Fuel Oil \n", "4 grade High Sulphur Fuel Oil " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For my study I want to focus on crude/condensates so I am going to modify the list which contains oil product names like this: " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2020-07-15 15:25:43,920 vortexasdk.operations — INFO — Searching Products\n", "2020-07-15 15:25:43,922 vortexasdk.client — INFO — Payload: {'term': ['crude'], 'allowTopLevelProducts': True}\n", "2020-07-15 15:25:44,351 vortexasdk.client — INFO — 18 Results to retrieve. Sending 1 post requests in parallel using 6 threads.\n" ] } ], "source": [ "crude_search_df = Products().search(term=['crude']).to_df()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamelayer.0parent.0.name
06f11b0724c9a4e85ffa7f1445bc768f054af755a090118...Crudegroup_productCrude/Condensates
1e1b3d075a9340969322024a35b8c720e5065d8c95a91b6...Crude VegoilgradeBiodiesel Feedstock
24fe046d7478c4072b9ecbaa2c03d3b977bbfec5077ee44...Crude ButadienegradeOlefins/Other Chemicals
354af755a090118dcf9b0724c9a4e9f14745c26165385ff...Crude/CondensatesgroupNaN
49fda040ee8844e47b5239051e322d06dd9d2b96f0c3249...TPAO crudegradeMedium-Sour
52b76490350005604507ca64567101df7d3db80a973f462...Crude Vegetable OilgradeBiodiesel Feedstock
6f26cd12252b0bb23b4ab4ab590eaee11037d78a7ac5cc6...Crude BenzenegradeChemicals
7e9d1031a9167fff80ef089f2d5591deb1833ee34f1d028...Crude Palm OilgradeBiodiesel Feedstock
8c2aa8895d3d176868cbb0519f2bb5318a74a2a66ac9034...Eagle Ford crudegradeLight-Sweet
9164a4a510343458bbf949a79964ce3bb8efa8d14276c48...US Shale CrudegradeLight-Sweet
104ff810b966104a658d22e7155596c11bedcd1e3e81594e...Yuri Korchagin CrudegradeLight-Sweet
116fd8a34225de493ab9bff7f95880d96a3e34737db24849...Domestic Sweet Crude (DSW)gradeLight-Sour
12c49a65c1651913a1cb3b185760ab952827b5b9ddc03e1e...Crude Soybean Oil (CSBO)gradeBiodiesel Feedstock
13c7bee2499ebba9677e11930891fdd067c293b8536efe53...Crude Sunflower Oil (CSFO)gradeBiodiesel Feedstock
14c4ad8221d48642b2adc7b363c68a3d729b3ef7f2d9aa42...Diluted Crude Oil (DCO)gradeHeavy-Sour
15bc9deabd28d74b5985056195dcbcd33ccae7c616e2584a...Reconstituted Crude Oil (Recon)gradeDirty Condensates
1698fa8034b122632b13564878dd75d902faa735b822cac9...Crude Degummed Soybean OilgradeBiodiesel Feedstock
17ca15a14cae72539854f53413a0f8668bcca2ec90053722...Crude Blendstock for Oxygenate BlendinggradeBlending Components
\n", "
" ], "text/plain": [ " id \\\n", "0 6f11b0724c9a4e85ffa7f1445bc768f054af755a090118... \n", "1 e1b3d075a9340969322024a35b8c720e5065d8c95a91b6... \n", "2 4fe046d7478c4072b9ecbaa2c03d3b977bbfec5077ee44... \n", "3 54af755a090118dcf9b0724c9a4e9f14745c26165385ff... \n", "4 9fda040ee8844e47b5239051e322d06dd9d2b96f0c3249... \n", "5 2b76490350005604507ca64567101df7d3db80a973f462... \n", "6 f26cd12252b0bb23b4ab4ab590eaee11037d78a7ac5cc6... \n", "7 e9d1031a9167fff80ef089f2d5591deb1833ee34f1d028... \n", "8 c2aa8895d3d176868cbb0519f2bb5318a74a2a66ac9034... \n", "9 164a4a510343458bbf949a79964ce3bb8efa8d14276c48... \n", "10 4ff810b966104a658d22e7155596c11bedcd1e3e81594e... \n", "11 6fd8a34225de493ab9bff7f95880d96a3e34737db24849... \n", "12 c49a65c1651913a1cb3b185760ab952827b5b9ddc03e1e... \n", "13 c7bee2499ebba9677e11930891fdd067c293b8536efe53... \n", "14 c4ad8221d48642b2adc7b363c68a3d729b3ef7f2d9aa42... \n", "15 bc9deabd28d74b5985056195dcbcd33ccae7c616e2584a... \n", "16 98fa8034b122632b13564878dd75d902faa735b822cac9... \n", "17 ca15a14cae72539854f53413a0f8668bcca2ec90053722... \n", "\n", " name layer.0 \\\n", "0 Crude group_product \n", "1 Crude Vegoil grade \n", "2 Crude Butadiene grade \n", "3 Crude/Condensates group \n", "4 TPAO crude grade \n", "5 Crude Vegetable Oil grade \n", "6 Crude Benzene grade \n", "7 Crude Palm Oil grade \n", "8 Eagle Ford crude grade \n", "9 US Shale Crude grade \n", "10 Yuri Korchagin Crude grade \n", "11 Domestic Sweet Crude (DSW) grade \n", "12 Crude Soybean Oil (CSBO) grade \n", "13 Crude Sunflower Oil (CSFO) grade \n", "14 Diluted Crude Oil (DCO) grade \n", "15 Reconstituted Crude Oil (Recon) grade \n", "16 Crude Degummed Soybean Oil grade \n", "17 Crude Blendstock for Oxygenate Blending grade \n", "\n", " parent.0.name \n", "0 Crude/Condensates \n", "1 Biodiesel Feedstock \n", "2 Olefins/Other Chemicals \n", "3 NaN \n", "4 Medium-Sour \n", "5 Biodiesel Feedstock \n", "6 Chemicals \n", "7 Biodiesel Feedstock \n", "8 Light-Sweet \n", "9 Light-Sweet \n", "10 Light-Sweet \n", "11 Light-Sour \n", "12 Biodiesel Feedstock \n", "13 Biodiesel Feedstock \n", "14 Heavy-Sour \n", "15 Dirty Condensates \n", "16 Biodiesel Feedstock \n", "17 Blending Components " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crude_search_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we can see that there are 18 rows and we only want the id where the name column is equal to `Crude/Condensates\t`. So we can query the DataFrame like this to get just row of the DataFrame we are interested in. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamelayer.0parent.0.name
354af755a090118dcf9b0724c9a4e9f14745c26165385ff...Crude/CondensatesgroupNaN
\n", "
" ], "text/plain": [ " id name \\\n", "3 54af755a090118dcf9b0724c9a4e9f14745c26165385ff... Crude/Condensates \n", "\n", " layer.0 parent.0.name \n", "3 group NaN " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crude_search_df.query(\"name=='Crude/Condensates'\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you look at the end of the id you can see it finishes with `...` this suggests that we cant see the full legnth of the column. If we increase the width options of the row like this `pd.set_option('max_colwidth', 75)` and run the same query of the dataframe we can see the full id. The rest of the notebook will have the column width settings we have defined here so we will not need to do it again. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamelayer.0parent.0.name
354af755a090118dcf9b0724c9a4e9f14745c26165385ffa7f1445bc768f06f11Crude/CondensatesgroupNaN
\n", "
" ], "text/plain": [ " id \\\n", "3 54af755a090118dcf9b0724c9a4e9f14745c26165385ffa7f1445bc768f06f11 \n", "\n", " name layer.0 parent.0.name \n", "3 Crude/Condensates group NaN " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.set_option('max_colwidth', 75)\n", "crude_search_df.query(\"name=='Crude/Condensates'\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Geographies " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just like before we are going to use one of the examples from the documentation and slightly tweak it to what we need for our study. Docs found here: https://vortechsa.github.io/python-sdk/endpoints/geographies/." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2020-07-15 15:25:46,414 vortexasdk.operations — INFO — Searching Geographies\n", "2020-07-15 15:25:46,415 vortexasdk.client — INFO — Payload: {'term': ['Liverpool', 'Southampton']}\n", "2020-07-15 15:25:46,565 vortexasdk.client — INFO — 4 Results to retrieve. Sending 1 post requests in parallel using 6 threads.\n" ] } ], "source": [ "df = Geographies().search(term=[\"Liverpool\", \"Southampton\"]).to_df()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamelayer
0b600e4f54cbdef578b2c6bdd7f508212ee4fb9552991d82e180a3d8f625669fdLiverpool [GB][port]
10c69b0aaf2d110e102dd3b3f05d5540b8e5346d27f344a71983ab7d4566de0f2Southampton [GB][port]
28baf08eff90bf9a1677ca0e55aae7e139bfaf155563b1ee1e0824273e3181f2dLiverpool Docks[terminal]
398db74d66fac18f2b0d8488f46af96fec3fc6edb7bc267cf75a1c50b0d2ee2b1Liverpool Bulk Liquids[terminal]
\n", "
" ], "text/plain": [ " id \\\n", "0 b600e4f54cbdef578b2c6bdd7f508212ee4fb9552991d82e180a3d8f625669fd \n", "1 0c69b0aaf2d110e102dd3b3f05d5540b8e5346d27f344a71983ab7d4566de0f2 \n", "2 8baf08eff90bf9a1677ca0e55aae7e139bfaf155563b1ee1e0824273e3181f2d \n", "3 98db74d66fac18f2b0d8488f46af96fec3fc6edb7bc267cf75a1c50b0d2ee2b1 \n", "\n", " name layer \n", "0 Liverpool [GB] [port] \n", "1 Southampton [GB] [port] \n", "2 Liverpool Docks [terminal] \n", "3 Liverpool Bulk Liquids [terminal] " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2020-07-15 15:25:47,216 vortexasdk.operations — INFO — Searching Geographies\n", "2020-07-15 15:25:47,217 vortexasdk.client — INFO — Payload: {'term': ['China']}\n", "2020-07-15 15:25:47,363 vortexasdk.client — INFO — 13 Results to retrieve. Sending 1 post requests in parallel using 6 threads.\n" ] } ], "source": [ "china_search_df = Geographies().search(term=[\"China\"]).to_df()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamelayer
0934c47f36c16a58d68ef5e007e62a23f5f036ee3f3d1f5f85a48c572b90ad8b2China[country]
1781cacc7033f877caa4b4106d096b74afe006a96391bf5a56a4f55b849359a42South China[shipping_region]
2a63890260e29d859390fd1a23c690181afd4bd152943a04c00cd6a5ecf3f7d1eNorth China[shipping_region]
3b5fafce6e20de2dc307fb7e0b89978ee91a49a7b6ec6f5461daf2633f3c56674China (excl. HK & Macau)[shipping_region]
49a021f43c397b175ddfff7a91d46ee6e6e16d37e9f9d52398ac6895656109d86China Steel Chemical[terminal]
\n", "
" ], "text/plain": [ " id \\\n", "0 934c47f36c16a58d68ef5e007e62a23f5f036ee3f3d1f5f85a48c572b90ad8b2 \n", "1 781cacc7033f877caa4b4106d096b74afe006a96391bf5a56a4f55b849359a42 \n", "2 a63890260e29d859390fd1a23c690181afd4bd152943a04c00cd6a5ecf3f7d1e \n", "3 b5fafce6e20de2dc307fb7e0b89978ee91a49a7b6ec6f5461daf2633f3c56674 \n", "4 9a021f43c397b175ddfff7a91d46ee6e6e16d37e9f9d52398ac6895656109d86 \n", "\n", " name layer \n", "0 China [country] \n", "1 South China [shipping_region] \n", "2 North China [shipping_region] \n", "3 China (excl. HK & Macau) [shipping_region] \n", "4 China Steel Chemical [terminal] " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "china_search_df.head(5)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamelayer
0934c47f36c16a58d68ef5e007e62a23f5f036ee3f3d1f5f85a48c572b90ad8b2China[country]
\n", "
" ], "text/plain": [ " id name \\\n", "0 934c47f36c16a58d68ef5e007e62a23f5f036ee3f3d1f5f85a48c572b90ad8b2 China \n", "\n", " layer \n", "0 [country] " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "china_search_df.query(\"name=='China'\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Chinese floating storage study\n", "\n", "For my study I want to look at Crude and condensates in currently in floating storage sitated in China and how this has changed over in 2020. So once again Im going to take the code which is provided in the documentation and change it to my specific needs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets break down the query bellow line by line.\n", "\n", "Together lets break this down line by line to understand whats going on. \n", "\n", "1) The first line finds the ID for Rotterdam using the geographies endpoint and assigns it to a variable called `rotterdam`\n", "\n", "2) Then the ID for crude using the products endpoint and assigns it to a variable called `crude`\n", "\n", "3) Then it calls the CargoTimeSeries endpoint\n", "\n", "4) The `timeseries_unit` arguement is set to `bpd` which means the unit is set to barrels\n", "\n", "5) The `timeseries_frequency` arguement is set to `month` which means the time scale is set the months\n", "\n", "6) The `filter_origins` arguement is set to `rotterdam` the variable defined in the 1st line\n", "\n", "7) The `filter_products` arguement is set to `crude` which was defined in the 2nd line\n", "\n", "8) The `filter_activity` argument is set to `loading_state`. \n", "\n", "9) The `filter_time_min`, the start time for the query is set to the beginning of 2018\n", "\n", "10) The `filter_time_max`, the end time for the query is set to the end of 2018\n", "\n", "11) The search result is turned into a DataFrame\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2020-07-15 15:25:49,480 vortexasdk.operations — INFO — Searching Geographies\n", "2020-07-15 15:25:49,481 vortexasdk.client — INFO — Payload: {'term': ['rotterdam']}\n", "2020-07-15 15:25:49,649 vortexasdk.client — INFO — 11 Results to retrieve. Sending 1 post requests in parallel using 6 threads.\n", "2020-07-15 15:25:51,124 vortexasdk.operations — INFO — Searching Products\n", "2020-07-15 15:25:51,125 vortexasdk.client — INFO — Payload: {'term': ['crude'], 'allowTopLevelProducts': True}\n", "2020-07-15 15:25:51,275 vortexasdk.client — INFO — 18 Results to retrieve. Sending 1 post requests in parallel using 6 threads.\n", "2020-07-15 15:25:52,744 vortexasdk.operations — INFO — Searching CargoTimeSeries\n", "2020-07-15 15:25:52,745 vortexasdk.client — INFO — Payload: {'filter_activity': 'loading_state', 'filter_time_min': '2018-01-01T00:00:00.000Z', 'filter_time_max': '2018-12-31T00:00:00.000Z', 'filter_products': ['6f11b0724c9a4e85ffa7f1445bc768f054af755a090118dcf99f14745c261653'], 'filter_origins': ['68faf65af1345067f11dc6723b8da32f00e304a6f33c000118fccd81947deb4e'], 'timeseries_frequency': 'month', 'timeseries_unit': 'bpd', 'timeseries_activity': 'loading_state', 'size': 500}\n" ] } ], "source": [ "rotterdam = [g.id for g in Geographies().search(\"rotterdam\").to_list() if \"port\" in g.layer]\n", "crude = [p.id for p in Products().search(\"crude\").to_list() if \"Crude\" == p.name]\n", "search_result = CargoTimeSeries().search(\n", " timeseries_unit='bpd',\n", " timeseries_frequency='month',\n", " filter_origins=rotterdam,\n", " filter_products=crude,\n", " filter_activity='loading_state',\n", " filter_time_min=datetime(2018, 1, 1),\n", " filter_time_max=datetime(2018, 12, 31))\n", "df = search_result.to_df()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So how can we change that query to get Crude/condestates in floating storage sitatued in China? \n", "As we already have the IDs for our geography and product we dont need to call those endpoints in our first 2 lines.\n", "\n", "1) We can assign the ID for China to a variable called `china_id` using the ID we found earlier in the notebook\n", "\n", "2) Assign the ID for the Crude/Condensates to a variable called `crude_condesates_id`\n", "\n", "3) We keep this the same as before as we are calling the same endpoint.\n", "\n", "4) For our 4th line, I prefer to think of things in terms of tonnes so I’m going to change the timeseries_unit to be `t`.\n", "\n", "5) For the 5th line, I’m going to change `month` to `day` as I'd like to see the change on a daily basis\n", "\n", "6) Here I’m going to change this one slightly, as I’m not concerned where the crude/ condensates have come from I’m going to remove the `filter_origins` argument and replace it which `filter_storage_locations`, and set it to `china_id` which we have defined in the first line.\n", "\n", "7) Set the `filter_products` argument to `crude_condesates_id` which we have defined in the 2nd line.\n", "\n", "8) This time for the 8th line I’m going to set the `filter_activity` to `'storing_state'`.\n", "\n", "9) Here I have changed the date to be at the start of this year\n", "\n", "10) Using `datetime.today().date()` we get today’s date\n", "\n", "11) Finally, I’m going to keep the 11th line the same. As I would like the results to be a DataFrame just like in the first query\n", "\n", "\n", "Lets see what happens" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2020-07-15 15:25:53,405 vortexasdk.operations — INFO — Searching CargoTimeSeries\n", "2020-07-15 15:25:53,406 vortexasdk.client — INFO — Payload: {'filter_activity': 'storing_state', 'filter_time_min': '2020-01-01T00:00:00.000Z', 'filter_time_max': '2020-07-15T00:00:00.000Z', 'filter_products': ['54af755a090118dcf9b0724c9a4e9f14745c26165385ffa7f1445bc768f06f11'], 'filter_storage_locations': ['934c47f36c16a58d68ef5e007e62a23f5f036ee3f3d1f5f85a48c572b90ad8b2'], 'timeseries_frequency': 'day', 'timeseries_unit': 't', 'timeseries_activity': 'storing_state', 'size': 500}\n" ] } ], "source": [ "china_id = '934c47f36c16a58d68ef5e007e62a23f5f036ee3f3d1f5f85a48c572b90ad8b2'\n", "crude_condesates_id = '54af755a090118dcf9b0724c9a4e9f14745c26165385ffa7f1445bc768f06f11'\n", "search_result = CargoTimeSeries().search(\n", " timeseries_unit='t',\n", " timeseries_frequency='day',\n", " filter_storage_locations=china_id,\n", " filter_products=crude_condesates_id,\n", " filter_activity='storing_state',\n", " filter_time_min=datetime(2020, 1, 1),\n", " filter_time_max=datetime.today().date())\n", "df_fs = search_result.to_df()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyvaluecount
02020-01-01T00:00:00.000Z169600225
12020-01-02T00:00:00.000Z139000420
22020-01-03T00:00:00.000Z120600920
32020-01-04T00:00:00.000Z168716022
42020-01-05T00:00:00.000Z207638922
............
1922020-07-11T00:00:00.000Z1114133985
1932020-07-12T00:00:00.000Z1119666884
1942020-07-13T00:00:00.000Z1131282583
1952020-07-14T00:00:00.000Z1133302084
1962020-07-15T00:00:00.000Z1082010480
\n", "

197 rows × 3 columns

\n", "
" ], "text/plain": [ " key value count\n", "0 2020-01-01T00:00:00.000Z 1696002 25\n", "1 2020-01-02T00:00:00.000Z 1390004 20\n", "2 2020-01-03T00:00:00.000Z 1206009 20\n", "3 2020-01-04T00:00:00.000Z 1687160 22\n", "4 2020-01-05T00:00:00.000Z 2076389 22\n", ".. ... ... ...\n", "192 2020-07-11T00:00:00.000Z 11141339 85\n", "193 2020-07-12T00:00:00.000Z 11196668 84\n", "194 2020-07-13T00:00:00.000Z 11312825 83\n", "195 2020-07-14T00:00:00.000Z 11333020 84\n", "196 2020-07-15T00:00:00.000Z 10820104 80\n", "\n", "[197 rows x 3 columns]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_fs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Displaying this data in a graph" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So here Im to show you how to display the graph in a notebook but first I'm going to show you how to export the data as a CSV so you can look at the data in Excel or Google Sheets.\n", "\n", "To export the DataFrame to your desktop as a CSV add `.to_csv('~/Desktop/chinese_floating_storage.csv')` to the DataFrame in a cell.\n", "\n", "Like this: " ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "df_fs.to_csv('~/Desktop/chinese_floating_storage.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now if you look on your desktop there should be a file called `chinese_floating_storage.csv`, and you'll be able to open this file in excel. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using a python library called matplotlib that we imported at the top of this notebook you can also display the results of the query like this: " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# rename columns\n", "df_fs = df_fs.rename(columns={'key': 'date',\n", " 'value': 't',\n", " 'count': 'number_of_cargo_movements'})\n", "\n", "# remove time zone from timestamp\n", "df_fs['date'] = pd.to_datetime(df_fs['date']).dt.tz_localize(None)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "floating_storage = df_fs.set_index('date')['t'] / 1000\n", "floating_storage.plot(title='Chinese crude oil floating storage', grid=True)\n", "plt.xlabel('date')\n", "plt.ylabel('kt');" ] } ], "metadata": { "kernelspec": { "display_name": "python-sdk", "language": "python", "name": "python-sdk" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" } }, "nbformat": 4, "nbformat_minor": 4 }