diff --git a/02_data_prep.ipynb b/02_data_prep.ipynb index ff8e999..b67443f 100644 --- a/02_data_prep.ipynb +++ b/02_data_prep.ipynb @@ -65,7 +65,9 @@ "### Key Terms\n", "* *FAIR* or *Findable, Accessible, Interoperable, Reusable* - \n", "* *ARCO data* or *Analysis-ready, cloud-optimised data* - \n", - "* pipeline - A series of tasks or operations, preferably based on resuable components, where the input of one step in the pipeline is the output of the previous step." + "* pipeline - A series of tasks or operations, preferably based on resuable components, where the input of one step in the pipeline is the output of the previous step.\n", + "* workflow - similar to a pipeline as a series of tasks, but there may be multiple consecutive or parallel pipelines in a workflow. (Definitions may differ!)\n", + "* catalog" ] }, { @@ -109,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 1, "id": "32d81711-60f1-4996-b808-f24760cbc982", "metadata": {}, "outputs": [], @@ -122,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 2, "id": "72aa9221-d29c-4ee4-81d9-1304537d3354", "metadata": {}, "outputs": [], @@ -132,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "id": "ddef7864-09de-4d14-8a0e-aa66b1cac6d9", "metadata": {}, "outputs": [], @@ -143,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "id": "5fb8d33b-be41-4a20-b636-9395f6c3606d", "metadata": {}, "outputs": [], @@ -155,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 5, "id": "73805561-5820-4b3b-b856-cb359b84ffc6", "metadata": {}, "outputs": [ @@ -172,7 +174,7 @@ "PosixPath('/Users/stephen.haddad/data/ukrse2022')" ] }, - "execution_count": 38, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -189,18 +191,18 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 23, "id": "3b8688c7-7db6-4b4d-94bd-fd0c504e6815", "metadata": {}, "outputs": [], "source": [ - "load_from_zenodo=True\n", + "load_from_zenodo=False\n", "zenodo_record_root = 'https://zenodo.org/record/7022648/files/'" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 24, "id": "63754eaa-add1-4269-9100-0abe550ada99", "metadata": {}, "outputs": [ @@ -210,7 +212,7 @@ "PosixPath('https:/zenodo.org/record/7022648/files/2021_met_office_aviation_rotors.csv')" ] }, - "execution_count": 41, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -221,17 +223,24 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 25, "id": "f67317ad-7819-406e-ba53-e9cbbd0388c6", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + }, { "data": { "text/plain": [ - "'https://zenodo.org/record/7022648/files//2021_met_office_aviation_rotors.csv'" + "PosixPath('/Users/stephen.haddad/data/ukrse2022/2021_met_office_aviation_rotors.csv')" ] }, - "execution_count": 46, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -258,10 +267,20 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 26, "id": "706bb929-93ee-4789-ab90-3fc276b6f5ac", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/stephen.haddad/opt/anaconda3/envs/ukrse2022_mlops_data_prep/lib/python3.8/site-packages/distributed/node.py:179: UserWarning: Port 8787 is already in use.\n", + "Perhaps you already have a cluster running?\n", + "Hosting the HTTP server on port 55878 instead\n", + " warnings.warn(\n" + ] + }, { "data": { "text/html": [ @@ -270,11 +289,11 @@ " \n", "
\n", "

LocalCluster

\n", - "

4e0989a6

\n", + "

de35a1bd

\n", " \n", " \n", " \n", "
\n", - " Dashboard: http://127.0.0.1:8787/status\n", + " Dashboard: http://127.0.0.1:55878/status\n", " \n", " Workers: 4\n", @@ -307,11 +326,11 @@ "
\n", "
\n", "

Scheduler

\n", - "

Scheduler-9a2c49c6-9791-4964-baae-ed2b0f780f0f

\n", + "

Scheduler-199f137b-4d91-4577-87e7-a2df713cd3dd

\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", - " Comm: tcp://127.0.0.1:54428\n", + " Comm: tcp://127.0.0.1:55879\n", " \n", " Workers: 4\n", @@ -319,7 +338,7 @@ "
\n", - " Dashboard: http://127.0.0.1:8787/status\n", + " Dashboard: http://127.0.0.1:55878/status\n", " \n", " Total threads: 8\n", @@ -353,7 +372,7 @@ " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -398,7 +417,7 @@ "
\n", - " Comm: tcp://127.0.0.1:54444\n", + " Comm: tcp://127.0.0.1:55900\n", " \n", " Total threads: 2\n", @@ -361,7 +380,7 @@ "
\n", - " Dashboard: http://127.0.0.1:54447/status\n", + " Dashboard: http://127.0.0.1:55901/status\n", " \n", " Memory: 4.00 GiB\n", @@ -369,13 +388,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:54434\n", + " Nanny: tcp://127.0.0.1:55884\n", "
\n", - " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-kp9i_b4p\n", + " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-q4noz_vs\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -443,7 +462,7 @@ "
\n", - " Comm: tcp://127.0.0.1:54443\n", + " Comm: tcp://127.0.0.1:55903\n", " \n", " Total threads: 2\n", @@ -406,7 +425,7 @@ "
\n", - " Dashboard: http://127.0.0.1:54449/status\n", + " Dashboard: http://127.0.0.1:55904/status\n", " \n", " Memory: 4.00 GiB\n", @@ -414,13 +433,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:54431\n", + " Nanny: tcp://127.0.0.1:55885\n", "
\n", - " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-12pciygk\n", + " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-3joi2f24\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -488,7 +507,7 @@ "
\n", - " Comm: tcp://127.0.0.1:54446\n", + " Comm: tcp://127.0.0.1:55894\n", " \n", " Total threads: 2\n", @@ -451,7 +470,7 @@ "
\n", - " Dashboard: http://127.0.0.1:54450/status\n", + " Dashboard: http://127.0.0.1:55896/status\n", " \n", " Memory: 4.00 GiB\n", @@ -459,13 +478,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:54433\n", + " Nanny: tcp://127.0.0.1:55882\n", "
\n", - " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-kli_b2o9\n", + " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-x2_l92o8\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -532,7 +551,7 @@ "" ], "text/plain": [ - "LocalCluster(4e0989a6, 'tcp://127.0.0.1:54428', workers=4, threads=8, memory=16.00 GiB)" + "LocalCluster(de35a1bd, 'tcp://127.0.0.1:55879', workers=4, threads=8, memory=16.00 GiB)" ] }, "metadata": {}, @@ -546,7 +565,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 27, "id": "bdb88a58-70a8-4f0d-af8e-cbbc40e0e63f", "metadata": {}, "outputs": [ @@ -557,7 +576,7 @@ "
\n", "
\n", "

Client

\n", - "

Client-7fdbd90c-2947-11ed-8df5-acde48001122

\n", + "

Client-a887c26e-29d6-11ed-9aa9-acde48001122

\n", "
\n", - " Comm: tcp://127.0.0.1:54445\n", + " Comm: tcp://127.0.0.1:55895\n", " \n", " Total threads: 2\n", @@ -496,7 +515,7 @@ "
\n", - " Dashboard: http://127.0.0.1:54448/status\n", + " Dashboard: http://127.0.0.1:55897/status\n", " \n", " Memory: 4.00 GiB\n", @@ -504,13 +523,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:54432\n", + " Nanny: tcp://127.0.0.1:55883\n", "
\n", - " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-wpmofvjb\n", + " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-o15jhgzy\n", "
\n", "\n", " \n", @@ -570,7 +589,7 @@ " \n", " \n", " \n", " \n", " \n", @@ -586,11 +605,11 @@ " \n", "
\n", "

LocalCluster

\n", - "

4e0989a6

\n", + "

de35a1bd

\n", "
\n", - " Dashboard: http://127.0.0.1:8787/status\n", + " Dashboard: http://127.0.0.1:55878/status\n", "
\n", " \n", " \n", "
\n", - " Dashboard: http://127.0.0.1:8787/status\n", + " Dashboard: http://127.0.0.1:55878/status\n", " \n", " Workers: 4\n", @@ -623,11 +642,11 @@ "
\n", "
\n", "

Scheduler

\n", - "

Scheduler-9a2c49c6-9791-4964-baae-ed2b0f780f0f

\n", + "

Scheduler-199f137b-4d91-4577-87e7-a2df713cd3dd

\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", - " Comm: tcp://127.0.0.1:54428\n", + " Comm: tcp://127.0.0.1:55879\n", " \n", " Workers: 4\n", @@ -635,7 +654,7 @@ "
\n", - " Dashboard: http://127.0.0.1:8787/status\n", + " Dashboard: http://127.0.0.1:55878/status\n", " \n", " Total threads: 8\n", @@ -669,7 +688,7 @@ " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -714,7 +733,7 @@ "
\n", - " Comm: tcp://127.0.0.1:54444\n", + " Comm: tcp://127.0.0.1:55900\n", " \n", " Total threads: 2\n", @@ -677,7 +696,7 @@ "
\n", - " Dashboard: http://127.0.0.1:54447/status\n", + " Dashboard: http://127.0.0.1:55901/status\n", " \n", " Memory: 4.00 GiB\n", @@ -685,13 +704,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:54434\n", + " Nanny: tcp://127.0.0.1:55884\n", "
\n", - " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-kp9i_b4p\n", + " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-q4noz_vs\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -759,7 +778,7 @@ "
\n", - " Comm: tcp://127.0.0.1:54443\n", + " Comm: tcp://127.0.0.1:55903\n", " \n", " Total threads: 2\n", @@ -722,7 +741,7 @@ "
\n", - " Dashboard: http://127.0.0.1:54449/status\n", + " Dashboard: http://127.0.0.1:55904/status\n", " \n", " Memory: 4.00 GiB\n", @@ -730,13 +749,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:54431\n", + " Nanny: tcp://127.0.0.1:55885\n", "
\n", - " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-12pciygk\n", + " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-3joi2f24\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -804,7 +823,7 @@ "
\n", - " Comm: tcp://127.0.0.1:54446\n", + " Comm: tcp://127.0.0.1:55894\n", " \n", " Total threads: 2\n", @@ -767,7 +786,7 @@ "
\n", - " Dashboard: http://127.0.0.1:54450/status\n", + " Dashboard: http://127.0.0.1:55896/status\n", " \n", " Memory: 4.00 GiB\n", @@ -775,13 +794,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:54433\n", + " Nanny: tcp://127.0.0.1:55882\n", "
\n", - " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-kli_b2o9\n", + " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-x2_l92o8\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -853,10 +872,10 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 14, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -876,7 +895,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 28, "id": "fc3954b1-5f68-4a2c-bff1-c65831d98a66", "metadata": {}, "outputs": [ @@ -1312,7 +1331,7 @@ "Dask Name: read-csv, 1 tasks" ] }, - "execution_count": 47, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1324,7 +1343,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 29, "id": "e6082abb-89d4-43cf-a1ad-ae005cbdcffe", "metadata": {}, "outputs": [ @@ -1353,7 +1372,7 @@ " dtype='object')" ] }, - "execution_count": 49, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1364,7 +1383,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 30, "id": "5945b6c3-a60d-4c3c-b44b-97e50882a431", "metadata": {}, "outputs": [], @@ -1374,7 +1393,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 31, "id": "f56234e9-1062-40fc-893d-861ed205d63d", "metadata": {}, "outputs": [], @@ -1388,7 +1407,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 32, "id": "55c94c1b-1d8a-45cf-b9c9-065e023bb268", "metadata": {}, "outputs": [ @@ -1427,7 +1446,7 @@ "

Layer1: read-csv

\n", " \n", "

\n", - " read-csv-1e7bfeac4ff4e0386ae4e2f7bd1356d8\n", + " read-csv-e1701bbd29ad5a0d155e1052f943535d\n", "

\n", "\n", "
\n", - " Comm: tcp://127.0.0.1:54445\n", + " Comm: tcp://127.0.0.1:55895\n", " \n", " Total threads: 2\n", @@ -812,7 +831,7 @@ "
\n", - " Dashboard: http://127.0.0.1:54448/status\n", + " Dashboard: http://127.0.0.1:55897/status\n", " \n", " Memory: 4.00 GiB\n", @@ -820,13 +839,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:54432\n", + " Nanny: tcp://127.0.0.1:55883\n", "
\n", - " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-wpmofvjb\n", + " Local directory: /var/folders/w0/2x361bn95wj7lfgl33vksx1w0000gn/T/dask-worker-space/worker-o15jhgzy\n", "
\n", @@ -1499,7 +1518,7 @@ "

Layer2: getitem

\n", " \n", "

\n", - " getitem-52ee5f0c8086f7484c2a294935631222\n", + " getitem-c0a2e4b8182ad8ec4a49492af87c7f93\n", "

\n", "\n", "
\n", @@ -1526,7 +1545,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1553,7 +1572,7 @@ "

Layer3: ge

\n", " \n", "

\n", - " ge-fd339e9baf7a08764e14b24e4ee0c0f4\n", + " ge-041d16d620c1d82105c0384ef7a63fcc\n", "

\n", "\n", "
depends on read-csv-1e7bfeac4ff4e0386ae4e2f7bd1356d8read-csv-e1701bbd29ad5a0d155e1052f943535d
\n", @@ -1580,7 +1599,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1607,7 +1626,7 @@ "

Layer4: getitem

\n", " \n", "

\n", - " getitem-168d0385d0b77b48bcdc5f1a4a2760e3\n", + " getitem-ca5ce8c02ff337a3c95de3fbcaae18b1\n", "

\n", "\n", "
depends on getitem-52ee5f0c8086f7484c2a294935631222getitem-c0a2e4b8182ad8ec4a49492af87c7f93
\n", @@ -1634,7 +1653,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1661,7 +1680,7 @@ "

Layer5: ge

\n", " \n", "

\n", - " ge-2d6dc26479f8d8416b35538beaee30cf\n", + " ge-d65d970fd632a771c0d65d1f2706fc68\n", "

\n", "\n", "
depends on read-csv-1e7bfeac4ff4e0386ae4e2f7bd1356d8read-csv-e1701bbd29ad5a0d155e1052f943535d
\n", @@ -1688,7 +1707,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1715,7 +1734,7 @@ "

Layer6: getitem

\n", " \n", "

\n", - " getitem-e01194bec5904b0356b3f48977472acb\n", + " getitem-db9ebe9d70c84abdd54397891f6e7daa\n", "

\n", "\n", "
depends on getitem-168d0385d0b77b48bcdc5f1a4a2760e3getitem-ca5ce8c02ff337a3c95de3fbcaae18b1
\n", @@ -1742,7 +1761,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1769,7 +1788,7 @@ "

Layer7: ge

\n", " \n", "

\n", - " ge-be9a7d9a8d7053cc079966cd9ec56666\n", + " ge-e33809b42ada954a96d13b04d13f95f7\n", "

\n", "\n", "
depends on read-csv-1e7bfeac4ff4e0386ae4e2f7bd1356d8read-csv-e1701bbd29ad5a0d155e1052f943535d
\n", @@ -1796,7 +1815,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1823,7 +1842,7 @@ "

Layer8: getitem

\n", " \n", "

\n", - " getitem-0fea9a71b59f2869f636afed6b761a69\n", + " getitem-d7cd9d29ea995ffc0f7766f968d008c1\n", "

\n", "\n", "
depends on getitem-e01194bec5904b0356b3f48977472acbgetitem-db9ebe9d70c84abdd54397891f6e7daa
\n", @@ -1850,7 +1869,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1877,7 +1896,7 @@ "

Layer9: ge

\n", " \n", "

\n", - " ge-441153336682d2ecb3672b5203c2aff0\n", + " ge-4a31ae9e8d9248371c6015cfd78af04e\n", "

\n", "\n", "
depends on read-csv-1e7bfeac4ff4e0386ae4e2f7bd1356d8read-csv-e1701bbd29ad5a0d155e1052f943535d
\n", @@ -1904,7 +1923,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1931,7 +1950,7 @@ "

Layer10: and_

\n", " \n", "

\n", - " and_-412f4d3d0aabb7235798beb80f9260f8\n", + " and_-97ac16fd883e17cb7678e54c871156e3\n", "

\n", "\n", "
depends on getitem-0fea9a71b59f2869f636afed6b761a69getitem-d7cd9d29ea995ffc0f7766f968d008c1
\n", @@ -1958,14 +1977,14 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1992,7 +2011,7 @@ "

Layer11: and_

\n", " \n", "

\n", - " and_-a446f4cea3f7617768b5e4b23d943735\n", + " and_-a6334d5090a4cbc1aa9f0299c4d2a558\n", "

\n", "\n", "
depends on ge-be9a7d9a8d7053cc079966cd9ec56666ge-4a31ae9e8d9248371c6015cfd78af04e
ge-441153336682d2ecb3672b5203c2aff0ge-e33809b42ada954a96d13b04d13f95f7
\n", @@ -2019,14 +2038,14 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2053,7 +2072,7 @@ "

Layer12: and_

\n", " \n", "

\n", - " and_-f585bb014bb223423d8ed1112f96c7c4\n", + " and_-bdd8caf5d1fd302b329e93e0c1ca81ea\n", "

\n", "\n", "
depends on ge-2d6dc26479f8d8416b35538beaee30cfand_-97ac16fd883e17cb7678e54c871156e3
and_-412f4d3d0aabb7235798beb80f9260f8ge-d65d970fd632a771c0d65d1f2706fc68
\n", @@ -2080,14 +2099,14 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2114,7 +2133,7 @@ "

Layer13: getitem

\n", " \n", "

\n", - " getitem-dee3807718b30c568c57632889cacc5f\n", + " getitem-52beaf6c5a777671f30c7bd21682d4a8\n", "

\n", "\n", "
depends on and_-a446f4cea3f7617768b5e4b23d943735and_-a6334d5090a4cbc1aa9f0299c4d2a558
ge-fd339e9baf7a08764e14b24e4ee0c0f4ge-041d16d620c1d82105c0384ef7a63fcc
\n", @@ -2166,14 +2185,14 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2194,23 +2213,23 @@ ], "text/plain": [ "HighLevelGraph with 13 layers.\n", - "\n", - " 0. read-csv-1e7bfeac4ff4e0386ae4e2f7bd1356d8\n", - " 1. getitem-52ee5f0c8086f7484c2a294935631222\n", - " 2. ge-fd339e9baf7a08764e14b24e4ee0c0f4\n", - " 3. getitem-168d0385d0b77b48bcdc5f1a4a2760e3\n", - " 4. ge-2d6dc26479f8d8416b35538beaee30cf\n", - " 5. getitem-e01194bec5904b0356b3f48977472acb\n", - " 6. ge-be9a7d9a8d7053cc079966cd9ec56666\n", - " 7. getitem-0fea9a71b59f2869f636afed6b761a69\n", - " 8. ge-441153336682d2ecb3672b5203c2aff0\n", - " 9. and_-412f4d3d0aabb7235798beb80f9260f8\n", - " 10. and_-a446f4cea3f7617768b5e4b23d943735\n", - " 11. and_-f585bb014bb223423d8ed1112f96c7c4\n", - " 12. getitem-dee3807718b30c568c57632889cacc5f" + "\n", + " 0. read-csv-e1701bbd29ad5a0d155e1052f943535d\n", + " 1. getitem-c0a2e4b8182ad8ec4a49492af87c7f93\n", + " 2. ge-041d16d620c1d82105c0384ef7a63fcc\n", + " 3. getitem-ca5ce8c02ff337a3c95de3fbcaae18b1\n", + " 4. ge-d65d970fd632a771c0d65d1f2706fc68\n", + " 5. getitem-db9ebe9d70c84abdd54397891f6e7daa\n", + " 6. ge-e33809b42ada954a96d13b04d13f95f7\n", + " 7. getitem-d7cd9d29ea995ffc0f7766f968d008c1\n", + " 8. ge-4a31ae9e8d9248371c6015cfd78af04e\n", + " 9. and_-97ac16fd883e17cb7678e54c871156e3\n", + " 10. and_-a6334d5090a4cbc1aa9f0299c4d2a558\n", + " 11. and_-bdd8caf5d1fd302b329e93e0c1ca81ea\n", + " 12. getitem-52beaf6c5a777671f30c7bd21682d4a8" ] }, - "execution_count": 52, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -2221,7 +2240,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 33, "id": "66406cce-2550-4c77-a725-41bffc03f275", "metadata": {}, "outputs": [], @@ -2231,7 +2250,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 34, "id": "823b81d5-062e-475b-a44d-95fb760e891e", "metadata": {}, "outputs": [], @@ -2241,7 +2260,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 35, "id": "980a89fc-1cbf-4ba2-89cd-b46e38f4c692", "metadata": {}, "outputs": [], @@ -2251,7 +2270,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 36, "id": "02c1c70b-b84b-4f99-b899-166475c5a781", "metadata": {}, "outputs": [ @@ -2687,7 +2706,7 @@ "Dask Name: getitem, 22 tasks" ] }, - "execution_count": 56, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -2699,7 +2718,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 37, "id": "990d8924-f554-4db8-b6b3-e8bbef59a1ee", "metadata": {}, "outputs": [], @@ -2710,18 +2729,18 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 38, "id": "772aff86-bddd-4a81-8339-1c003e3ffb0e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "((Delayed('int-21baeaa8-bce2-495e-8a6b-7370992d0a50'), 96),\n", - " (Delayed('int-13a8781a-4ac7-442e-84a1-86c411ad3665'), 96))" + "((Delayed('int-85386d55-f64b-4e4f-9b13-f815cd5972b3'), 96),\n", + " (Delayed('int-fe02e4b8-2fae-4de2-a65d-9bc3e107653b'), 96))" ] }, - "execution_count": 58, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -2740,7 +2759,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 39, "id": "322f873d-8089-466b-bf13-ef5e07f31174", "metadata": {}, "outputs": [], @@ -2751,7 +2770,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 40, "id": "fcf48ad8-c8b4-4c9b-a83f-030d7c615835", "metadata": {}, "outputs": [ @@ -2761,7 +2780,7 @@ "((17037, 96), (449, 96))" ] }, - "execution_count": 60, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -2772,7 +2791,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 41, "id": "d53d7c9f-1984-4f84-abee-dfa14a058573", "metadata": {}, "outputs": [ @@ -3159,7 +3178,7 @@ "[17037 rows x 96 columns]" ] }, - "execution_count": 61, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -3170,7 +3189,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 42, "id": "5123c72c-7eae-44c2-b909-0be1cfe5acb4", "metadata": {}, "outputs": [], @@ -3183,7 +3202,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 43, "id": "475b350f-23fa-4a66-acd6-5c77311293d8", "metadata": {}, "outputs": [], @@ -3197,7 +3216,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 44, "id": "8049d9c1-6b31-46c6-968b-e1334468f7d8", "metadata": {}, "outputs": [ @@ -3205,8 +3224,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 950 ms, sys: 42.6 ms, total: 993 ms\n", - "Wall time: 995 ms\n" + "CPU times: user 804 ms, sys: 34 ms, total: 838 ms\n", + "Wall time: 827 ms\n" ] } ], @@ -3228,7 +3247,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 45, "id": "e8866baa-3f46-4061-b5ac-ae6481bcd27e", "metadata": {}, "outputs": [], @@ -3238,7 +3257,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 46, "id": "3dbc5924-5c6b-4f05-95a1-dc4349908783", "metadata": {}, "outputs": [], @@ -3249,7 +3268,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 47, "id": "f4dd943b-472c-492a-b65f-87c6a62fde97", "metadata": {}, "outputs": [ @@ -3623,7 +3642,7 @@ "[17486 rows x 140 columns]" ] }, - "execution_count": 67, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -3656,7 +3675,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "id": "cb7a566a-7597-4d9c-92c7-f87910b2611a", "metadata": {}, "outputs": [], @@ -3675,7 +3694,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 50, "id": "bd911ecd-bdd3-4f97-8717-b47e98cb662f", "metadata": {}, "outputs": [ @@ -4127,36 +4146,23 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 51, "id": "b14e01c6-9f01-4a54-a3d5-2914997c278f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['Unnamed: 0', 'DTG', 'air_temp_obs', 'dewpoint_obs',\n", - " 'wind_direction_obs', 'wind_speed_obs', 'wind_gust_obs', 'air_temp_1',\n", - " 'air_temp_2', 'air_temp_3', 'air_temp_4', 'air_temp_5', 'air_temp_6',\n", - " 'air_temp_7', 'air_temp_8', 'air_temp_9', 'air_temp_10', 'air_temp_11',\n", - " 'air_temp_12', 'air_temp_13', 'air_temp_14', 'air_temp_15',\n", - " 'air_temp_16', 'air_temp_17', 'air_temp_18', 'air_temp_19',\n", - " 'air_temp_20', 'air_temp_21', 'air_temp_22', 'sh_1', 'sh_2', 'sh_3',\n", - " 'sh_4', 'sh_5', 'sh_6', 'sh_7', 'sh_8', 'sh_9', 'sh_10', 'sh_11',\n", - " 'sh_12', 'sh_13', 'sh_14', 'sh_15', 'sh_16', 'sh_17', 'sh_18', 'sh_19',\n", - " 'sh_20', 'sh_21', 'sh_22', 'winddir_1', 'windspd_1', 'winddir_2',\n", - " 'windspd_2', 'winddir_3', 'windspd_3', 'winddir_4', 'windspd_4',\n", - " 'winddir_5', 'windspd_5', 'winddir_6', 'windspd_6', 'winddir_7',\n", - " 'windspd_7', 'winddir_8', 'windspd_8', 'winddir_9', 'windspd_9',\n", - " 'winddir_10', 'windspd_10', 'winddir_11', 'windspd_11', 'winddir_12',\n", - " 'windspd_12', 'winddir_13', 'windspd_13', 'winddir_14', 'windspd_14',\n", - " 'winddir_15', 'windspd_15', 'winddir_16', 'windspd_16', 'winddir_17',\n", - " 'windspd_17', 'winddir_18', 'windspd_18', 'winddir_19', 'windspd_19',\n", - " 'winddir_20', 'windspd_20', 'winddir_21', 'windspd_21', 'winddir_22',\n", - " 'windspd_22', 'rotors_present'],\n", - " dtype='object')" + "Index(['Unnamed: 0', 'air_temp_obs', 'dewpoint_obs', 'wind_direction_obs',\n", + " 'wind_speed_obs', 'wind_gust_obs', 'air_temp_1', 'air_temp_2',\n", + " 'air_temp_3', 'air_temp_4',\n", + " ...\n", + " 'v_wind_18', 'u_wind_19', 'v_wind_19', 'u_wind_20', 'v_wind_20',\n", + " 'u_wind_21', 'v_wind_21', 'u_wind_22', 'v_wind_22', 'time'],\n", + " dtype='object', length=140)" ] }, - "execution_count": 33, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -4167,7 +4173,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 52, "id": "749428e9-7cba-4327-9b72-c0f25ac1d71e", "metadata": {}, "outputs": [], @@ -4182,7 +4188,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 53, "id": "5a66447a-244a-4686-8b10-eba2f0cd75f3", "metadata": {}, "outputs": [], @@ -4197,93 +4203,157 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "fda48027-d3dc-4d9a-b295-401b4b6f14c0", - "metadata": {}, - "outputs": [], - "source": [ - "panel.widgets.Select(options=obs_dict)" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 72, "id": "b1859bbe-dfad-4674-a151-ce9e698d2834", "metadata": {}, "outputs": [], "source": [ - "def do_histogram():\n", - " passa" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1eb18b27-432d-47b9-8dfa-d736646ebdc9", - "metadata": {}, - "outputs": [], - "source": [ - "def do_height" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9d4d9ffa-6efb-4c2d-bf8a-b8f4c1ab5227", - "metadata": {}, - "outputs": [], - "source": [ - "def stats_dashboard(select_df, variable)" + "def do_histogram(plotting_df, rotors_feature_name, selected_var, subset):\n", + " fig1 = matplotlib.pyplot.figure(f'histogram of {selected_var}')\n", + " ax1 = fig1.add_subplot(1,1,1,title=f'histogram of {selected_var}')\n", + " if subset == 'all':\n", + " data_to_plot = plotting_df\n", + " elif subset == 'no_rotors':\n", + " data_to_plot = plotting_df[plotting_df[rotors_feature_name] == 0.0]\n", + " elif subset == 'rotors_present':\n", + " data_to_plot = plotting_df[plotting_df[rotors_feature_name] == 1.0]\n", + " _ = data_to_plot[selected_var].plot.hist(bins=20, ax=ax1)\n", + " return fig1" ] }, { "cell_type": "code", - "execution_count": null, - "id": "5faf10cc-0a23-4a89-acac-2824e0783fb7", + "execution_count": 73, + "id": "fda48027-d3dc-4d9a-b295-401b4b6f14c0", "metadata": {}, "outputs": [], "source": [ - "# load data in using ray datasets csv loader" + "hist_var_select = panel.widgets.Select(\n", + " options=obs_dict,\n", + " name='selected_var',\n", + ")" ] }, { "cell_type": "code", - "execution_count": null, - "id": "4fa147a9-30fe-4e45-8436-81ff0cbecf59", + "execution_count": 74, + "id": "b73b2288-a329-4c51-b0e6-647a9925751e", "metadata": {}, "outputs": [], "source": [ - "# define data cleaning as a series of small function which return a dataset" + "subset_select = panel.widgets.Select(\n", + " options = ['all', 'no_rotors', 'rotors_present'],\n", + " name='subset',\n", + ")" ] }, { "cell_type": "code", - "execution_count": null, - "id": "27ebdccc-dc34-4ce5-a731-e776d60323db", + "execution_count": 78, + "id": "58f8f948-da65-49b1-9fb2-128e3a92880c", "metadata": {}, "outputs": [], "source": [ - "# call map_functions on the dataset to clean the data\n" + "hist_plotter = panel.bind(\n", + " functools.partial(\n", + " do_histogram,\n", + " plotting_df=rotors_df,\n", + " rotors_feature_name=target_feature_name,\n", + " ),\n", + " selected_var=hist_var_select,\n", + " subset=subset_select,\n", + ")" ] }, { "cell_type": "code", - "execution_count": null, - "id": "d3788b80-e937-438a-b4e9-3e2ddc2e9d0b", + "execution_count": 85, + "id": "5e9a5dfa-16ee-47c0-9902-d260b95422f4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ - "# do some holoviz plots" + "rotors_dash = panel.Column(\n", + " panel.widgets.StaticText(value='Rotors Data Exploration Dashboard'),\n", + " panel.Row(subset_select, hist_var_select),\n", + " hist_plotter)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "4bb76688-6f9d-4521-8d13-ceeaa266451a", + "execution_count": 86, + "id": "391151c3-3781-4824-9a43-5aa5dd6578ee", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": {}, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ], + "text/plain": [ + "Column\n", + " [0] StaticText(value='Rotors Data E...)\n", + " [1] Row\n", + " [0] Select(name='subset', options=['all', 'no_rotors', ...], value='rotors_present')\n", + " [1] Select(name='selected_var', options={'Temperature': 'air_temp_...}, value='air_temp_obs')\n", + " [2] ParamFunction(function)" + ] + }, + "execution_count": 86, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "1021" + } + }, + "output_type": "execute_result" + } + ], "source": [ - "# create a panel dashboard (maybe using matplotlib plus holoviews/geovierws?" + "rotors_dash.servable()" ] }, { @@ -4298,9 +4368,17 @@ "intake catalog of data\n" ] }, + { + "cell_type": "markdown", + "id": "9af61e77-6b71-4df8-aeeb-f345906e07a1", + "metadata": {}, + "source": [ + "We will often need to use various domain specific tools and techniques in the data preparation part of the pipeline to prepare the data for use with more generic machine learning and data science tools. In this example we are using the Met Office python library [Iris](https://scitools-iris.readthedocs.io/en/stable/), which handles gridded meteorological (i.e. climate and weather) data and metadata and includes various meteorology specific functionality and handles specific data storage formats such as *NetCDF* and *Grib2*. Other research domains will have similar packages for handling their specific needs, which will similiarly need to be supported as part of a machine learning projects in those research domains." + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 87, "id": "681bdb50-4e64-458c-b901-b26c1cdfc641", "metadata": {}, "outputs": [], @@ -4312,7 +4390,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "id": "a24f0ce6-0cf7-44bf-8865-27d26637fc0c", "metadata": {}, "outputs": [], @@ -4323,10 +4401,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 90, "id": "f0ee36a9-356d-4cbe-b3a7-b411aab36835", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "using default path\n" + ] + }, + { + "data": { + "text/plain": [ + "PosixPath('/Users/stephen.haddad/data/era5')" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "try:\n", " era5_data_dir = pathlib.Path(os.environ['RSE22_ERA5_DATA_DIR'])\n", @@ -4339,7 +4435,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 91, "id": "e5bce62b-b473-4acb-9f16-93261437efbc", "metadata": {}, "outputs": [], @@ -4349,7 +4445,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 92, "id": "18486bcf-c1a7-4d49-be63-00950ad7c30d", "metadata": {}, "outputs": [], @@ -4359,7 +4455,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 93, "id": "5a154744-c15b-496f-830d-c46c06a83195", "metadata": {}, "outputs": [], @@ -4369,10 +4465,38 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "54da23b2-a3d7-44f2-ad38-b67d9f1e7f62", + "execution_count": 94, + "id": "2e30e6ef-f6ad-4e60-b975-9b98911e7089", + "metadata": {}, + "outputs": [], + "source": [ + "era5_mslp_uk_subset_fname = 'era5_mslp_UK_2017_2020.nc'" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "bcee8066-ed13-400f-be36-04b0ec69d6fc", "metadata": {}, "outputs": [], + "source": [ + "import xarray" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "id": "54da23b2-a3d7-44f2-ad38-b67d9f1e7f62", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loading cached data\n" + ] + } + ], "source": [ "if do_global_extract:\n", " print('do global_extract')\n", @@ -4383,25 +4507,251 @@ " longitude=uk_na_bounds['longitude'])\n", "else:\n", " print('loading cached data')\n", - " mslp_era5_uk_cube = iris.load_cube(str(era5_data_dir / 'era5_mslp_UK_2017_2020.nc'))" + " if load_from_zenodo:\n", + " mslp_era5_uk_cube = xarray.load_dataarray(zenodo_record_root + era5_mslp_uk_subset_fname).to_iris()\n", + " else:\n", + " mslp_era5_uk_cube = iris.load_cube(str(era5_data_dir / era5_mslp_uk_subset_fname))\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 104, "id": "661e11e8-21ca-423f-9007-8674210dea1c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
depends on and_-f585bb014bb223423d8ed1112f96c7c4read-csv-e1701bbd29ad5a0d155e1052f943535d
read-csv-1e7bfeac4ff4e0386ae4e2f7bd1356d8and_-bdd8caf5d1fd302b329e93e0c1ca81ea
\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", + "
Air Pressure At Mean Sea Level (Pa)timelatitudelongitude
Shape3506410181
Dimension coordinates
\ttimex--
\tlatitude-x-
\tlongitude--x
Attributes
Conventions CF-1.7
institution ECMWF
nameCDM Mean_sea_level_pressure_surface
nameECMWF Mean sea level pressure
product_type analysis
shortNameECMWF msl
source Reanalysis
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "mslp_era5_uk_cube" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 105, "id": "5e613eb7-fb2a-4aa4-8fc4-fb1466965a85", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "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", + "
Array Chunk
Bytes 1.07 GiB 121.59 MiB
Shape (35064, 101, 81) (3896, 101, 81)
Count 10 Tasks 9 Chunks
Type float32 numpy.ndarray
\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", + " 81\n", + " 101\n", + " 35064\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "print(type(mslp_era5_uk_cube.core_data()))\n", "mslp_era5_uk_cube.core_data()" @@ -4409,7 +4759,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 106, "id": "9c3fd214-9978-4a91-8120-0bc6d37f7de1", "metadata": {}, "outputs": [], @@ -4419,39 +4769,256 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 107, "id": "9f978c34-ad8d-4a46-aaab-c8e8266e3861", "metadata": {}, - "outputs": [], - "source": [ - "mslp_uk_seasonal_mean = mslp_era5_uk_cube.aggregated_by(['season_number'],iris.analysis.MEAN)\n", - "mslp_uk_seasonal_mean" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7c0e96ed-9100-418b-901a-c63f87fe5a2f", - "metadata": {}, - "outputs": [], - "source": [ - "mslp_uk_seasonal_mean.core_data()" - ] - }, + "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", + "
Air Pressure At Mean Sea Level (Pa)--latitudelongitude
Shape410181
Dimension coordinates
\tlatitude-x-
\tlongitude--x
Auxiliary coordinates
\tseason_numberx--
\ttimex--
Cell methods
\tmean season_number
Attributes
Conventions CF-1.7
institution ECMWF
nameCDM Mean_sea_level_pressure_surface
nameECMWF Mean sea level pressure
product_type analysis
shortNameECMWF msl
source Reanalysis
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mslp_uk_seasonal_mean = mslp_era5_uk_cube.aggregated_by(['season_number'],iris.analysis.MEAN)\n", + "mslp_uk_seasonal_mean" + ] + }, { "cell_type": "code", - "execution_count": null, - "id": "204c8850-5be1-4c31-834e-2c6c8cd6ab68", + "execution_count": 108, + "id": "7c0e96ed-9100-418b-901a-c63f87fe5a2f", "metadata": {}, - "outputs": [], + "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", + "
Array Chunk
Bytes 127.83 kiB 31.96 kiB
Shape (4, 101, 81) (1, 101, 81)
Count 76 Tasks 4 Chunks
Type float32 numpy.ndarray
\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", + " 81\n", + " 101\n", + " 4\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "era5_flat_deseasoned = era5_flat_deseasoned.compute()\n", - "era5_flat_deseasoned" + "mslp_uk_seasonal_mean.core_data()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 112, "id": "5869d214-0910-4034-98ec-f440a994c777", "metadata": {}, "outputs": [], @@ -4466,7 +5033,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 113, "id": "042d1d6f-ca6a-4780-9027-e79f15ce4de4", "metadata": {}, "outputs": [], @@ -4483,7 +5050,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 114, "id": "2105bfa1-a47c-47e8-9d71-bcdbfde2309b", "metadata": {}, "outputs": [], @@ -4496,7 +5063,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 115, "id": "17852158-7186-4506-aae4-dcc8a2fa5aac", "metadata": {}, "outputs": [], @@ -4509,30 +5076,119 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 116, "id": "4912427b-a826-4d56-8e20-781598b5253f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "season 2\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "seasons_dash = panel.Column(season_select, season_plotter)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 117, "id": "020e0a4b-3759-45bb-aa6d-d12a767a9116", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "season 1
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ], + "text/plain": [ + "Column\n", + " [0] Select(name='season', options={'NH Winter': 0, ...}, value=2)\n", + " [1] ParamFunction(function)" + ] + }, + "execution_count": 117, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "1030" + } + }, + "output_type": "execute_result" + } + ], "source": [ "seasons_dash.servable()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 118, "id": "e54fad76-b0a8-4516-9f83-3dcbe48c2db8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "fig1 = matplotlib.pyplot.figure(figsize=(9,16))\n", "for ix1 in range(mslp_uk_seasonal_mean.shape[0]):\n", @@ -4543,20 +5199,99 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "16ebbf94-8f8c-4933-b024-07140ec1e189", - "metadata": {}, - "outputs": [], - "source": [ - "dask.array.concatenate" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 119, "id": "9aecfd1e-3d10-4b2f-9be6-f162e2cfe2dc", "metadata": {}, - "outputs": [], + "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", + "
Array Chunk
Bytes 1.07 GiB 68.91 MiB
Shape (35064, 8181) (2208, 8181)
Count 159 Tasks 25 Chunks
Type float32 numpy.ndarray
\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", + " 8181\n", + " 35064\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "era5_flat_deseasoned = dask.array.concatenate(\n", " [(mslp_era5_uk_cube.extract(iris.Constraint(season_number=sn1)).core_data() - mslp_uk_seasonal_mean[sn1].core_data()).reshape(\n", @@ -4566,17 +5301,29 @@ "era5_flat_deseasoned" ] }, + { + "cell_type": "code", + "execution_count": 121, + "id": "561c8031-6a29-4492-9543-f8788229c412", + "metadata": {}, + "outputs": [], + "source": [ + "era5_flat_deseasoned = era5_flat_deseasoned.compute()" + ] + }, { "cell_type": "markdown", "id": "9ee55a13-592d-4423-b5ea-7e174231c623", "metadata": {}, "source": [ - "### Example 3 - Creating a catalog with Intake" + "## Example 3 - Creating a catalog with Intake\n", + "\n", + "When you think of a dataset, you probably think of a series of files in some format (often NetCDF files for weather and climate data, maybe [FITS](https://en.wikipedia.org/wiki/FITS) in astronomy or [BAM files](https://samtools.github.io/hts-specs/SAMv1.pdf) in genetics. Researchers in general don't care about the files themselves, but rather getting the data they contained loaded in memeory. There are now better options for presenting data than just a unorder collection of files. One such option is a *catalog*. The idea here is the curated data files files are presented logically in terms of the different datasets, which each logical dataset presented as a single object, irrespective of how the data is actally stored on disk. There could be one file or many files, or it could be coming from a database or an API, the researcher sees a dataset, which can then be requested and loaded into memory (either actually loading the data or " ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 122, "id": "5b4969f9-8c14-42c9-9c5e-b6fec5f893c4", "metadata": {}, "outputs": [], @@ -4586,7 +5333,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 123, "id": "c2f0325c-6f84-4527-89ba-fec74e232f66", "metadata": {}, "outputs": [ @@ -4617,17 +5364,17 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 124, "id": "b94d55b3-f698-4449-9620-e1313f613a7f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['rotors']" + "['rotors', 'rotors_preprocessed']" ] }, - "execution_count": 25, + "execution_count": 124, "metadata": {}, "output_type": "execute_result" } @@ -4638,7 +5385,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 125, "id": "a19b3021-4b10-4f30-a0e3-56611968a2d2", "metadata": {}, "outputs": [ @@ -5025,7 +5772,7 @@ "[20106 rows x 96 columns]" ] }, - "execution_count": 26, + "execution_count": 125, "metadata": {}, "output_type": "execute_result" } @@ -5046,25 +5793,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 131, "id": "f49fc329-be5f-4881-b31b-8596e381e6cd", "metadata": {}, "outputs": [], "source": [ - "# this could be pointing at cloud storage\n", "import fsspec" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 132, "id": "35464e52-6af1-4876-bd47-28004fec7936", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
Dask DataFrame Structure:
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0DTGair_temp_obsdewpoint_obswind_direction_obswind_speed_obswind_gust_obsair_temp_1air_temp_2air_temp_3...windspd_18winddir_19windspd_19winddir_20windspd_20winddir_21windspd_21winddir_22windspd_22rotors_present
00NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaN0.0
1101/01/2015 00:00283.9280.7110.04.1-9999999.0284.000283.625283.250...5.8341.06.0334.06.1330.06.0329.05.80.0
2201/01/2015 03:00280.7279.790.07.7-9999999.0281.500281.250280.750...6.8344.05.3348.03.8360.03.212.03.50.0
3301/01/2015 06:00279.8278.1100.07.7-9999999.0279.875279.625279.125...6.0345.05.5358.05.010.04.238.04.00.0
4401/01/2015 09:00279.9277.0120.07.2-9999999.0279.625279.250278.875...3.1338.03.5354.03.99.04.422.04.60.0
..................................................................
201012010131/12/2020 06:00276.7275.5270.03.6-9999999.0277.875277.750277.625...12.1223.011.8221.011.4219.011.3215.011.40.0
201022010231/12/2020 09:00277.9276.9270.03.1-9999999.0277.875277.625277.875...10.2230.010.8230.011.6227.012.3222.012.00.0
201032010331/12/2020 12:00283.5277.1220.03.6-9999999.0281.125280.625280.125...10.3218.011.9221.012.8222.011.9225.010.60.0
201042010431/12/2020 15:00286.1276.9250.03.6-9999999.0284.625284.125283.625...9.4218.08.6212.08.3218.08.7226.010.10.0
201052010501/01/2021 00:00285.1279.3300.06.2-9999999.0284.250284.000283.750...8.6241.010.2236.010.5232.010.5227.011.30.0
\n", + "

20106 rows × 96 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 DTG air_temp_obs dewpoint_obs \\\n", + "0 0 NaN NaN NaN \n", + "1 1 01/01/2015 00:00 283.9 280.7 \n", + "2 2 01/01/2015 03:00 280.7 279.7 \n", + "3 3 01/01/2015 06:00 279.8 278.1 \n", + "4 4 01/01/2015 09:00 279.9 277.0 \n", + "... ... ... ... ... \n", + "20101 20101 31/12/2020 06:00 276.7 275.5 \n", + "20102 20102 31/12/2020 09:00 277.9 276.9 \n", + "20103 20103 31/12/2020 12:00 283.5 277.1 \n", + "20104 20104 31/12/2020 15:00 286.1 276.9 \n", + "20105 20105 01/01/2021 00:00 285.1 279.3 \n", + "\n", + " wind_direction_obs wind_speed_obs wind_gust_obs air_temp_1 \\\n", + "0 NaN NaN NaN NaN \n", + "1 110.0 4.1 -9999999.0 284.000 \n", + "2 90.0 7.7 -9999999.0 281.500 \n", + "3 100.0 7.7 -9999999.0 279.875 \n", + "4 120.0 7.2 -9999999.0 279.625 \n", + "... ... ... ... ... \n", + "20101 270.0 3.6 -9999999.0 277.875 \n", + "20102 270.0 3.1 -9999999.0 277.875 \n", + "20103 220.0 3.6 -9999999.0 281.125 \n", + "20104 250.0 3.6 -9999999.0 284.625 \n", + "20105 300.0 6.2 -9999999.0 284.250 \n", + "\n", + " air_temp_2 air_temp_3 ... windspd_18 winddir_19 windspd_19 \\\n", + "0 NaN NaN ... NaN NaN NaN \n", + "1 283.625 283.250 ... 5.8 341.0 6.0 \n", + "2 281.250 280.750 ... 6.8 344.0 5.3 \n", + "3 279.625 279.125 ... 6.0 345.0 5.5 \n", + "4 279.250 278.875 ... 3.1 338.0 3.5 \n", + "... ... ... ... ... ... ... \n", + "20101 277.750 277.625 ... 12.1 223.0 11.8 \n", + "20102 277.625 277.875 ... 10.2 230.0 10.8 \n", + "20103 280.625 280.125 ... 10.3 218.0 11.9 \n", + "20104 284.125 283.625 ... 9.4 218.0 8.6 \n", + "20105 284.000 283.750 ... 8.6 241.0 10.2 \n", + "\n", + " winddir_20 windspd_20 winddir_21 windspd_21 winddir_22 windspd_22 \\\n", + "0 NaN NaN NaN NaN NaN NaN \n", + "1 334.0 6.1 330.0 6.0 329.0 5.8 \n", + "2 348.0 3.8 360.0 3.2 12.0 3.5 \n", + "3 358.0 5.0 10.0 4.2 38.0 4.0 \n", + "4 354.0 3.9 9.0 4.4 22.0 4.6 \n", + "... ... ... ... ... ... ... \n", + "20101 221.0 11.4 219.0 11.3 215.0 11.4 \n", + "20102 230.0 11.6 227.0 12.3 222.0 12.0 \n", + "20103 221.0 12.8 222.0 11.9 225.0 10.6 \n", + "20104 212.0 8.3 218.0 8.7 226.0 10.1 \n", + "20105 236.0 10.5 232.0 10.5 227.0 11.3 \n", + "\n", + " rotors_present \n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "3 0.0 \n", + "4 0.0 \n", + "... ... \n", + "20101 0.0 \n", + "20102 0.0 \n", + "20103 0.0 \n", + "20104 0.0 \n", + "20105 0.0 \n", + "\n", + "[20106 rows x 96 columns]" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "intake.open_csv(fsspec.open_local(rotors_path)).read()" + ] + }, + { + "cell_type": "markdown", + "id": "edaaac56-cd20-41ce-bcf7-4c82ab87fdaa", + "metadata": {}, + "source": [ + "Now we can try to programmatically create a catalog " + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "id": "b2d12385-743f-4297-9b4b-c3afccef6a76", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"sources:\\n csv:\\n args:\\n urlpath:\\n - /Users/stephen.haddad/data/ukrse2022/2021_met_office_aviation_rotors.csv\\n description: ''\\n driver: intake.source.csv.CSVSource\\n metadata: {}\\n\"" + ] + }, + "execution_count": 136, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "intake.source.csv.CSVSource(fsspec.open_local(rotors_path)).yaml()" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "id": "0da242f4-cd39-461b-bff2-f5ad748f5b6a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sources:\n", + " csv:\n", + " args:\n", + " urlpath:\n", + " - /Users/stephen.haddad/data/ukrse2022/2021_met_office_aviation_rotors.csv\n", + " description: \"Tabular dataset with observed and simulated weather data, \\n \\\n", + " \\ intended for use training a machine learning model predicting turbulent wind\\\n", + " \\ gust events.\"\n", + " driver: intake.source.csv.CSVSource\n", + " metadata: {}\n", + "\n" + ] + } + ], + "source": [ + "with open(new_cat_fname , 'w') as cat_out:\n", + " constructed_catalog = intake.open_csv(fsspec.open_local(rotors_path))\n", + " constructed_catalog.description = '''Tabular dataset with observed and simulated weather data, \n", + " intended for use training a machine learning model predicting turbulent wind gust events.'''\n", + " catalog_txt = constructed_catalog.yaml()\n", + " print(catalog_txt)\n", + " cat_out.write(catalog_txt)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "a9b92c4f-bd0d-462d-9071-43ef5a81b503", + "metadata": {}, + "outputs": [ + { + "data": { + "application/yaml": "my_catalog:\n args:\n path: my_catalog.yml\n description: ''\n driver: intake.catalog.local.YAMLFileCatalog\n metadata: {}\n", + "text/plain": [ + "my_catalog:\n", + " args:\n", + " path: my_catalog.yml\n", + " description: ''\n", + " driver: intake.catalog.local.YAMLFileCatalog\n", + " metadata: {}\n" + ] + }, + "metadata": { + "application/json": { + "root": "my_catalog" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "new_catalog = intake.open_catalog(new_cat_fname)\n", + "new_catalog" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "id": "164ddf43-f404-41a7-8cb1-1084c17e53d0", + "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", - " \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", " \n", " \n", @@ -5473,119 +6890,206 @@ " \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", "
Unnamed: 0DTGair_temp_obsdewpoint_obswind_direction_obswind_speed_obswind_gust_obsair_temp_1air_temp_2air_temp_3...windspd_18winddir_19windspd_19winddir_20windspd_20winddir_21windspd_21winddir_22windspd_22rotors_present
...................................................................................................................................................................................................00NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaN0.0
1101/01/2015 00:00283.9280.7110.04.1-9999999.0284.000283.625283.250...5.8341.06.0334.06.1330.06.0329.05.80.0
2201/01/2015 03:00280.7279.790.07.7-9999999.0281.500281.250280.750...6.8344.05.3348.03.8360.03.212.03.50.0
3301/01/2015 06:00279.8278.1100.07.7-9999999.0279.875279.625279.125...6.0345.05.5358.05.010.04.238.04.00.0
4401/01/2015 09:00279.9277.0120.07.2-9999999.0279.625279.250278.875...3.1338.03.5354.03.99.04.422.04.60.0
.....................
201012010131/12/2020 06:00276.7275.5270.03.6-9999999.0277.875277.750277.625...12.1223.011.8221.011.4219.011.3215.011.40.0
201022010231/12/2020 09:00277.9276.9270.03.1-9999999.0277.875277.625277.875...10.2230.010.8230.011.6227.012.3222.012.00.0
201032010331/12/2020 12:00283.5277.1220.03.6-9999999.0281.125280.625280.125...10.3218.011.9221.012.8222.011.9225.010.60.0
201042010431/12/2020 15:00286.1276.9250.03.6-9999999.0284.625284.125283.625...9.4218.08.6212.08.3218.08.7226.010.10.0
201052010501/01/2021 00:00285.1279.3300.06.2-9999999.0284.250284.000283.750...8.6241.010.2236.010.5232.010.5227.011.30.0
\n", - "
\n", - "
Dask Name: getitem, 22 tasks
" + "

20106 rows × 96 columns

\n", + "" ], "text/plain": [ - "Dask DataFrame Structure:\n", - " Unnamed: 0 DTG air_temp_obs dewpoint_obs wind_direction_obs wind_speed_obs wind_gust_obs air_temp_1 air_temp_2 air_temp_3 air_temp_4 air_temp_5 air_temp_6 air_temp_7 air_temp_8 air_temp_9 air_temp_10 air_temp_11 air_temp_12 air_temp_13 air_temp_14 air_temp_15 air_temp_16 air_temp_17 air_temp_18 air_temp_19 air_temp_20 air_temp_21 air_temp_22 sh_1 sh_2 sh_3 sh_4 sh_5 sh_6 sh_7 sh_8 sh_9 sh_10 sh_11 sh_12 sh_13 sh_14 sh_15 sh_16 sh_17 sh_18 sh_19 sh_20 sh_21 sh_22 winddir_1 windspd_1 winddir_2 windspd_2 winddir_3 windspd_3 winddir_4 windspd_4 winddir_5 windspd_5 winddir_6 windspd_6 winddir_7 windspd_7 winddir_8 windspd_8 winddir_9 windspd_9 winddir_10 windspd_10 winddir_11 windspd_11 winddir_12 windspd_12 winddir_13 windspd_13 winddir_14 windspd_14 winddir_15 windspd_15 winddir_16 windspd_16 winddir_17 windspd_17 winddir_18 windspd_18 winddir_19 windspd_19 winddir_20 windspd_20 winddir_21 windspd_21 winddir_22 windspd_22 rotors_present\n", - "npartitions=1 \n", - " int64 datetime64[ns] float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64\n", - " ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", - "Dask Name: getitem, 22 tasks" + " Unnamed: 0 DTG air_temp_obs dewpoint_obs \\\n", + "0 0 NaN NaN NaN \n", + "1 1 01/01/2015 00:00 283.9 280.7 \n", + "2 2 01/01/2015 03:00 280.7 279.7 \n", + "3 3 01/01/2015 06:00 279.8 278.1 \n", + "4 4 01/01/2015 09:00 279.9 277.0 \n", + "... ... ... ... ... \n", + "20101 20101 31/12/2020 06:00 276.7 275.5 \n", + "20102 20102 31/12/2020 09:00 277.9 276.9 \n", + "20103 20103 31/12/2020 12:00 283.5 277.1 \n", + "20104 20104 31/12/2020 15:00 286.1 276.9 \n", + "20105 20105 01/01/2021 00:00 285.1 279.3 \n", + "\n", + " wind_direction_obs wind_speed_obs wind_gust_obs air_temp_1 \\\n", + "0 NaN NaN NaN NaN \n", + "1 110.0 4.1 -9999999.0 284.000 \n", + "2 90.0 7.7 -9999999.0 281.500 \n", + "3 100.0 7.7 -9999999.0 279.875 \n", + "4 120.0 7.2 -9999999.0 279.625 \n", + "... ... ... ... ... \n", + "20101 270.0 3.6 -9999999.0 277.875 \n", + "20102 270.0 3.1 -9999999.0 277.875 \n", + "20103 220.0 3.6 -9999999.0 281.125 \n", + "20104 250.0 3.6 -9999999.0 284.625 \n", + "20105 300.0 6.2 -9999999.0 284.250 \n", + "\n", + " air_temp_2 air_temp_3 ... windspd_18 winddir_19 windspd_19 \\\n", + "0 NaN NaN ... NaN NaN NaN \n", + "1 283.625 283.250 ... 5.8 341.0 6.0 \n", + "2 281.250 280.750 ... 6.8 344.0 5.3 \n", + "3 279.625 279.125 ... 6.0 345.0 5.5 \n", + "4 279.250 278.875 ... 3.1 338.0 3.5 \n", + "... ... ... ... ... ... ... \n", + "20101 277.750 277.625 ... 12.1 223.0 11.8 \n", + "20102 277.625 277.875 ... 10.2 230.0 10.8 \n", + "20103 280.625 280.125 ... 10.3 218.0 11.9 \n", + "20104 284.125 283.625 ... 9.4 218.0 8.6 \n", + "20105 284.000 283.750 ... 8.6 241.0 10.2 \n", + "\n", + " winddir_20 windspd_20 winddir_21 windspd_21 winddir_22 windspd_22 \\\n", + "0 NaN NaN NaN NaN NaN NaN \n", + "1 334.0 6.1 330.0 6.0 329.0 5.8 \n", + "2 348.0 3.8 360.0 3.2 12.0 3.5 \n", + "3 358.0 5.0 10.0 4.2 38.0 4.0 \n", + "4 354.0 3.9 9.0 4.4 22.0 4.6 \n", + "... ... ... ... ... ... ... \n", + "20101 221.0 11.4 219.0 11.3 215.0 11.4 \n", + "20102 230.0 11.6 227.0 12.3 222.0 12.0 \n", + "20103 221.0 12.8 222.0 11.9 225.0 10.6 \n", + "20104 212.0 8.3 218.0 8.7 226.0 10.1 \n", + "20105 236.0 10.5 232.0 10.5 227.0 11.3 \n", + "\n", + " rotors_present \n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "3 0.0 \n", + "4 0.0 \n", + "... ... \n", + "20101 0.0 \n", + "20102 0.0 \n", + "20103 0.0 \n", + "20104 0.0 \n", + "20105 0.0 \n", + "\n", + "[20106 rows x 96 columns]" ] }, - "execution_count": 31, + "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "rotors_df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "90bc1b70-135a-4601-a85c-49a8fa5723cb", - "metadata": {}, - "outputs": [], - "source": [ - "new_cat_fname = 'my_catalog.yml'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "49690bf4-ece7-44ab-89c1-dfb91a653982", - "metadata": {}, - "outputs": [], - "source": [ - "intake.open_csv(fsspec.open_local(rotors_path)).read()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "755ec6a0-c43f-4dbf-a0d6-84e5f579fac8", - "metadata": {}, - "outputs": [], - "source": [ - "cat1 = intake.catalog.()\n", - "cat1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "960dbaa4-e4b4-420c-a9b6-600b900a6ce2", - "metadata": {}, - "outputs": [], - "source": [ - "cat1.name = 'rotors'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b2d12385-743f-4297-9b4b-c3afccef6a76", - "metadata": {}, - "outputs": [], - "source": [ - "intake.source.csv.CSVSource(fsspec.open_local(rotors_path)).yaml()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0da242f4-cd39-461b-bff2-f5ad748f5b6a", - "metadata": {}, - "outputs": [], - "source": [ - "with open(new_cat_fname , 'w') as cat_out:\n", - " constructed_catalog = intake.open_csv(fsspec.open_local(rotors_path))\n", - " constructed_catalog.description = '''Tabular dataset with observed and simulated weather data, \n", - " intended for use training a machine learning model predicting turbulent wind gust events.'''\n", - " catalog_txt = constructed_catalog.yaml()\n", - " print(catalog_txt)\n", - " cat_out.write(catalog_txt)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a9b92c4f-bd0d-462d-9071-43ef5a81b503", - "metadata": {}, - "outputs": [], - "source": [ - "new_catalog = intake.open_catalog(new_cat_fname)\n", - "new_catalog" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "164ddf43-f404-41a7-8cb1-1084c17e53d0", - "metadata": {}, - "outputs": [], "source": [ "new_catalog['csv'].read()" ] @@ -5605,7 +7109,15 @@ "id": "b557aad3-d2f0-4fef-86c5-93d7b6f67bc4", "metadata": {}, "source": [ - "### Next Steps and further reading" + "### Next Steps and further reading\n", + "\n", + "Here we have seen how we can use assorted tools an practices to make the data preparation part of a machine learning project more scalable and reproducible, and also make the datasets created more FAIR through the use of catalogs to abstract away the details of data handling from a researcher who doesn't and shouldn't need to care about the technical details. We have used these tools in quite basic way, there are many more advanced options and tools that implement the same principles. Similarly there examples are very weather and climate focused as well as python centric. Different tools or languages will be used for different research areas (e.g. R and R Shiny may be popular)\n", + "\n", + "* Scaling data pipelines with dask - [docs](https://www.udemy.com/course/scalable-data-analysis-in-python-with-dask/) [Udemy course](https://www.udemy.com/course/scalable-data-analysis-in-python-with-dask/)\n", + " * Machine Learning with dask - [docs](https://ml.dask.org/)\n", + "* Building a dashboard with Holoviz - [tutorial](https://holoviz.org/tutorial/exercises/Building_a_Dashboard.html)\n", + " * Building a dashboard in R with Shiny - [docs](https://shiny.rstudio.com/articles/dashboards.html)\n", + "* Suppporting FAIR data - [European Commission report](https://ec.europa.eu/info/sites/default/files/turning_fair_into_reality_0.pdf)" ] }, { @@ -5615,8 +7127,12 @@ "source": [ "### References\n", "\n", - "* [Ray]()\n", - "* [Holoviz](https://holoviz.org/)" + "* [Pandas](https://pandas.pydata.org/docs/)\n", + "* [dask](https://docs.dask.org/en/stable/)\n", + "* [Iris](https://scitools-iris.readthedocs.io/en/stable/)\n", + "* [Holoviz](https://holoviz.org/)\n", + "* [intake](https://intake.readthedocs.io/en/latest/)\n", + "* [fsspec](https://filesystem-spec.readthedocs.io/en/latest/)\n" ] } ],