{
"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",
"
id
\n",
"
name
\n",
"
layer.0
\n",
"
parent.0.name
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1c107b4317bc2c85fb6c13cd7b28e8e0a02ec7fecc68af...
\n",
"
Fuel Oil
\n",
"
group_product
\n",
"
Dirty Petroleum Products
\n",
"
\n",
"
\n",
"
1
\n",
"
da9e67b1dd201a1ad3ae251e6dce8fad404ce50d53adba...
\n",
"
RMD Fuel Oil
\n",
"
grade
\n",
"
High Sulphur Fuel Oil
\n",
"
\n",
"
\n",
"
2
\n",
"
e6e879021c45470d84ee2f182a42a13537b489ae730640...
\n",
"
Other Fuel Oils
\n",
"
grade
\n",
"
High Sulphur Fuel Oil
\n",
"
\n",
"
\n",
"
3
\n",
"
d31139c20953fae7510f0982c922736391b752dced644c...
\n",
"
Cracked Fuel Oil
\n",
"
grade
\n",
"
High Sulphur Fuel Oil
\n",
"
\n",
"
\n",
"
4
\n",
"
0dd7857f328177189e20a54af1dc599c8b7e04e79e61cd...
\n",
"
Fuel Oil Cut
\n",
"
grade
\n",
"
High Sulphur Fuel Oil
\n",
"
\n",
" \n",
"
\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",
"
id
\n",
"
name
\n",
"
layer.0
\n",
"
parent.0.name
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
6f11b0724c9a4e85ffa7f1445bc768f054af755a090118...
\n",
"
Crude
\n",
"
group_product
\n",
"
Crude/Condensates
\n",
"
\n",
"
\n",
"
1
\n",
"
e1b3d075a9340969322024a35b8c720e5065d8c95a91b6...
\n",
"
Crude Vegoil
\n",
"
grade
\n",
"
Biodiesel Feedstock
\n",
"
\n",
"
\n",
"
2
\n",
"
4fe046d7478c4072b9ecbaa2c03d3b977bbfec5077ee44...
\n",
"
Crude Butadiene
\n",
"
grade
\n",
"
Olefins/Other Chemicals
\n",
"
\n",
"
\n",
"
3
\n",
"
54af755a090118dcf9b0724c9a4e9f14745c26165385ff...
\n",
"
Crude/Condensates
\n",
"
group
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
9fda040ee8844e47b5239051e322d06dd9d2b96f0c3249...
\n",
"
TPAO crude
\n",
"
grade
\n",
"
Medium-Sour
\n",
"
\n",
"
\n",
"
5
\n",
"
2b76490350005604507ca64567101df7d3db80a973f462...
\n",
"
Crude Vegetable Oil
\n",
"
grade
\n",
"
Biodiesel Feedstock
\n",
"
\n",
"
\n",
"
6
\n",
"
f26cd12252b0bb23b4ab4ab590eaee11037d78a7ac5cc6...
\n",
"
Crude Benzene
\n",
"
grade
\n",
"
Chemicals
\n",
"
\n",
"
\n",
"
7
\n",
"
e9d1031a9167fff80ef089f2d5591deb1833ee34f1d028...
\n",
"
Crude Palm Oil
\n",
"
grade
\n",
"
Biodiesel Feedstock
\n",
"
\n",
"
\n",
"
8
\n",
"
c2aa8895d3d176868cbb0519f2bb5318a74a2a66ac9034...
\n",
"
Eagle Ford crude
\n",
"
grade
\n",
"
Light-Sweet
\n",
"
\n",
"
\n",
"
9
\n",
"
164a4a510343458bbf949a79964ce3bb8efa8d14276c48...
\n",
"
US Shale Crude
\n",
"
grade
\n",
"
Light-Sweet
\n",
"
\n",
"
\n",
"
10
\n",
"
4ff810b966104a658d22e7155596c11bedcd1e3e81594e...
\n",
"
Yuri Korchagin Crude
\n",
"
grade
\n",
"
Light-Sweet
\n",
"
\n",
"
\n",
"
11
\n",
"
6fd8a34225de493ab9bff7f95880d96a3e34737db24849...
\n",
"
Domestic Sweet Crude (DSW)
\n",
"
grade
\n",
"
Light-Sour
\n",
"
\n",
"
\n",
"
12
\n",
"
c49a65c1651913a1cb3b185760ab952827b5b9ddc03e1e...
\n",
"
Crude Soybean Oil (CSBO)
\n",
"
grade
\n",
"
Biodiesel Feedstock
\n",
"
\n",
"
\n",
"
13
\n",
"
c7bee2499ebba9677e11930891fdd067c293b8536efe53...
\n",
"
Crude Sunflower Oil (CSFO)
\n",
"
grade
\n",
"
Biodiesel Feedstock
\n",
"
\n",
"
\n",
"
14
\n",
"
c4ad8221d48642b2adc7b363c68a3d729b3ef7f2d9aa42...
\n",
"
Diluted Crude Oil (DCO)
\n",
"
grade
\n",
"
Heavy-Sour
\n",
"
\n",
"
\n",
"
15
\n",
"
bc9deabd28d74b5985056195dcbcd33ccae7c616e2584a...
\n",
"
Reconstituted Crude Oil (Recon)
\n",
"
grade
\n",
"
Dirty Condensates
\n",
"
\n",
"
\n",
"
16
\n",
"
98fa8034b122632b13564878dd75d902faa735b822cac9...
\n",
"
Crude Degummed Soybean Oil
\n",
"
grade
\n",
"
Biodiesel Feedstock
\n",
"
\n",
"
\n",
"
17
\n",
"
ca15a14cae72539854f53413a0f8668bcca2ec90053722...
\n",
"
Crude Blendstock for Oxygenate Blending
\n",
"
grade
\n",
"
Blending Components
\n",
"
\n",
" \n",
"
\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",
"
id
\n",
"
name
\n",
"
layer.0
\n",
"
parent.0.name
\n",
"
\n",
" \n",
" \n",
"
\n",
"
3
\n",
"
54af755a090118dcf9b0724c9a4e9f14745c26165385ff...
\n",
"
Crude/Condensates
\n",
"
group
\n",
"
NaN
\n",
"
\n",
" \n",
"
\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": [
"
"
],
"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",
"
key
\n",
"
value
\n",
"
count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
2020-01-01T00:00:00.000Z
\n",
"
1696002
\n",
"
25
\n",
"
\n",
"
\n",
"
1
\n",
"
2020-01-02T00:00:00.000Z
\n",
"
1390004
\n",
"
20
\n",
"
\n",
"
\n",
"
2
\n",
"
2020-01-03T00:00:00.000Z
\n",
"
1206009
\n",
"
20
\n",
"
\n",
"
\n",
"
3
\n",
"
2020-01-04T00:00:00.000Z
\n",
"
1687160
\n",
"
22
\n",
"
\n",
"
\n",
"
4
\n",
"
2020-01-05T00:00:00.000Z
\n",
"
2076389
\n",
"
22
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
192
\n",
"
2020-07-11T00:00:00.000Z
\n",
"
11141339
\n",
"
85
\n",
"
\n",
"
\n",
"
193
\n",
"
2020-07-12T00:00:00.000Z
\n",
"
11196668
\n",
"
84
\n",
"
\n",
"
\n",
"
194
\n",
"
2020-07-13T00:00:00.000Z
\n",
"
11312825
\n",
"
83
\n",
"
\n",
"
\n",
"
195
\n",
"
2020-07-14T00:00:00.000Z
\n",
"
11333020
\n",
"
84
\n",
"
\n",
"
\n",
"
196
\n",
"
2020-07-15T00:00:00.000Z
\n",
"
10820104
\n",
"
80
\n",
"
\n",
" \n",
"
\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": [
"