{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Filtering GRIB data" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import time\n", "import metview as mv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## read() versus select()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Metview provides two ways to filter GRIB messages. Here is a quick comparison:\n", "\n", "* [**read()**](../api/functions/read.rst):\n", " * works with GRIB data from ECMWF's archive, MARS\n", " * uses the same keywords as retrieve()\n", " * includes area cropping, spectral transforms and grid interpolation\n", " * has an equivalent icon in the graphical user interface, \"GRIB Filter\"\n", " * filtering may not be fully functional with non-MARS GRIB data\n", "\n", "* [**select()**](../api/functions/select.rst):\n", " * works with any GRIB data that ecCodes understands\n", " * uses ecCodes keys rather than MARS keywords\n", " * much faster than read() when called multiple times on the same Fieldset\n", " * no post-processing of data (use read() or regrid() separately for that)\n", " * only available from Python" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "filename = \"data_fc.grib\"\n", "if mv.exist(filename):\n", " fs = mv.read(filename)\n", "else:\n", " fs = mv.gallery.load_dataset(filename)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inspecting the data\n", "A separate notebook covers the details of inspecting GRIB data with Metview. Here we will use the methods to decide which fields to filter." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fieldset (288 fields)\n" ] } ], "source": [ "print(fs)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " \n", " \n", " \n", "
parametertypeOfLevelleveldatetimestepparamIdclassstreamtypeexperimentVersionNumber
qisobaricInhPa100,250,...2011121500,6,...133odoperfc0001
tisobaricInhPa100,250,...2011121500,6,...130odoperfc0001
tpsurface02011121500,6,...228odoperfc0001
uisobaricInhPa100,250,...2011121500,6,...131odoperfc0001
visobaricInhPa100,250,...2011121500,6,...132odoperfc0001
zisobaricInhPa100,250,...2011121500,6,...129odoperfc0001
" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fs.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "OK, let's select 't' and have a closer look at what it has." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " \n", " \n", " \n", "
shortNamet
nameTemperature
paramId130
unitsK
typeOfLevelisobaricInhPa
level100,250,300,500,700,850,1000
date20111215
time0
step0,6,12,18,24,30,36,42
classod
streamoper
typefc
experimentVersionNumber0001
" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fs.describe('t')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have 8 forecast steps over 7 levels. We will make three selections:\n", "\n", "* temperature at all fc steps for one level\n", "* temperature at all fc steps for three levels\n", "* temperature at two fc steps and three levels for a specific date" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Filtering with read()" ] }, { "cell_type": "code", "execution_count": 6, "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", "
centreshortNametypeOfLevelleveldataDatedataTimestepRangedataTypegridType
Message
0ecmftisobaricInhPa5002011121500fcregular_ll
1ecmftisobaricInhPa5002011121506fcregular_ll
2ecmftisobaricInhPa50020111215012fcregular_ll
3ecmftisobaricInhPa50020111215018fcregular_ll
4ecmftisobaricInhPa50020111215024fcregular_ll
5ecmftisobaricInhPa50020111215030fcregular_ll
6ecmftisobaricInhPa50020111215036fcregular_ll
7ecmftisobaricInhPa50020111215042fcregular_ll
\n", "
" ], "text/plain": [ " centre shortName typeOfLevel level dataDate dataTime stepRange \\\n", "Message \n", "0 ecmf t isobaricInhPa 500 20111215 0 0 \n", "1 ecmf t isobaricInhPa 500 20111215 0 6 \n", "2 ecmf t isobaricInhPa 500 20111215 0 12 \n", "3 ecmf t isobaricInhPa 500 20111215 0 18 \n", "4 ecmf t isobaricInhPa 500 20111215 0 24 \n", "5 ecmf t isobaricInhPa 500 20111215 0 30 \n", "6 ecmf t isobaricInhPa 500 20111215 0 36 \n", "7 ecmf t isobaricInhPa 500 20111215 0 42 \n", "\n", " dataType gridType \n", "Message \n", "0 fc regular_ll \n", "1 fc regular_ll \n", "2 fc regular_ll \n", "3 fc regular_ll \n", "4 fc regular_ll \n", "5 fc regular_ll \n", "6 fc regular_ll \n", "7 fc regular_ll " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# temperature at all fc steps for one level\n", "t_one = mv.read(data=fs, param='t', levelist=500)\n", "t_one.ls()" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
centreshortNametypeOfLevelleveldataDatedataTimestepRangedataTypegridType
Message
0ecmftisobaricInhPa5002011121500fcregular_ll
1ecmftisobaricInhPa3002011121500fcregular_ll
2ecmftisobaricInhPa1002011121500fcregular_ll
3ecmftisobaricInhPa5002011121506fcregular_ll
4ecmftisobaricInhPa3002011121506fcregular_ll
5ecmftisobaricInhPa1002011121506fcregular_ll
6ecmftisobaricInhPa50020111215012fcregular_ll
7ecmftisobaricInhPa30020111215012fcregular_ll
8ecmftisobaricInhPa10020111215012fcregular_ll
9ecmftisobaricInhPa50020111215018fcregular_ll
10ecmftisobaricInhPa30020111215018fcregular_ll
11ecmftisobaricInhPa10020111215018fcregular_ll
12ecmftisobaricInhPa50020111215024fcregular_ll
13ecmftisobaricInhPa30020111215024fcregular_ll
14ecmftisobaricInhPa10020111215024fcregular_ll
15ecmftisobaricInhPa50020111215030fcregular_ll
16ecmftisobaricInhPa30020111215030fcregular_ll
17ecmftisobaricInhPa10020111215030fcregular_ll
18ecmftisobaricInhPa50020111215036fcregular_ll
19ecmftisobaricInhPa30020111215036fcregular_ll
20ecmftisobaricInhPa10020111215036fcregular_ll
21ecmftisobaricInhPa50020111215042fcregular_ll
22ecmftisobaricInhPa30020111215042fcregular_ll
23ecmftisobaricInhPa10020111215042fcregular_ll
\n", "
" ], "text/plain": [ " centre shortName typeOfLevel level dataDate dataTime stepRange \\\n", "Message \n", "0 ecmf t isobaricInhPa 500 20111215 0 0 \n", "1 ecmf t isobaricInhPa 300 20111215 0 0 \n", "2 ecmf t isobaricInhPa 100 20111215 0 0 \n", "3 ecmf t isobaricInhPa 500 20111215 0 6 \n", "4 ecmf t isobaricInhPa 300 20111215 0 6 \n", "5 ecmf t isobaricInhPa 100 20111215 0 6 \n", "6 ecmf t isobaricInhPa 500 20111215 0 12 \n", "7 ecmf t isobaricInhPa 300 20111215 0 12 \n", "8 ecmf t isobaricInhPa 100 20111215 0 12 \n", "9 ecmf t isobaricInhPa 500 20111215 0 18 \n", "10 ecmf t isobaricInhPa 300 20111215 0 18 \n", "11 ecmf t isobaricInhPa 100 20111215 0 18 \n", "12 ecmf t isobaricInhPa 500 20111215 0 24 \n", "13 ecmf t isobaricInhPa 300 20111215 0 24 \n", "14 ecmf t isobaricInhPa 100 20111215 0 24 \n", "15 ecmf t isobaricInhPa 500 20111215 0 30 \n", "16 ecmf t isobaricInhPa 300 20111215 0 30 \n", "17 ecmf t isobaricInhPa 100 20111215 0 30 \n", "18 ecmf t isobaricInhPa 500 20111215 0 36 \n", "19 ecmf t isobaricInhPa 300 20111215 0 36 \n", "20 ecmf t isobaricInhPa 100 20111215 0 36 \n", "21 ecmf t isobaricInhPa 500 20111215 0 42 \n", "22 ecmf t isobaricInhPa 300 20111215 0 42 \n", "23 ecmf t isobaricInhPa 100 20111215 0 42 \n", "\n", " dataType gridType \n", "Message \n", "0 fc regular_ll \n", "1 fc regular_ll \n", "2 fc regular_ll \n", "3 fc regular_ll \n", "4 fc regular_ll \n", "5 fc regular_ll \n", "6 fc regular_ll \n", "7 fc regular_ll \n", "8 fc regular_ll \n", "9 fc regular_ll \n", "10 fc regular_ll \n", "11 fc regular_ll \n", "12 fc regular_ll \n", "13 fc regular_ll \n", "14 fc regular_ll \n", "15 fc regular_ll \n", "16 fc regular_ll \n", "17 fc regular_ll \n", "18 fc regular_ll \n", "19 fc regular_ll \n", "20 fc regular_ll \n", "21 fc regular_ll \n", "22 fc regular_ll \n", "23 fc regular_ll " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# temperature at all fc steps for three levels\n", "t_three = mv.read(data=fs, param='t', levelist=[100, 300, 500])\n", "t_three.ls()" ] }, { "cell_type": "code", "execution_count": 8, "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", "
centreshortNametypeOfLevelleveldataDatedataTimestepRangedataTypegridType
Message
0ecmftisobaricInhPa5002011121506fcregular_ll
1ecmftisobaricInhPa3002011121506fcregular_ll
2ecmftisobaricInhPa1002011121506fcregular_ll
3ecmftisobaricInhPa50020111215024fcregular_ll
4ecmftisobaricInhPa30020111215024fcregular_ll
5ecmftisobaricInhPa10020111215024fcregular_ll
\n", "
" ], "text/plain": [ " centre shortName typeOfLevel level dataDate dataTime stepRange \\\n", "Message \n", "0 ecmf t isobaricInhPa 500 20111215 0 6 \n", "1 ecmf t isobaricInhPa 300 20111215 0 6 \n", "2 ecmf t isobaricInhPa 100 20111215 0 6 \n", "3 ecmf t isobaricInhPa 500 20111215 0 24 \n", "4 ecmf t isobaricInhPa 300 20111215 0 24 \n", "5 ecmf t isobaricInhPa 100 20111215 0 24 \n", "\n", " dataType gridType \n", "Message \n", "0 fc regular_ll \n", "1 fc regular_ll \n", "2 fc regular_ll \n", "3 fc regular_ll \n", "4 fc regular_ll \n", "5 fc regular_ll " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# temperature at two fc steps and three levels for a specific date\n", "t_date = mv.read(data=fs, param='t', levelist=[100, 300, 500], step=[6, 24], date=20111215)\n", "t_date.ls()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Filtering with select()" ] }, { "cell_type": "code", "execution_count": 9, "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", "
centreshortNametypeOfLevelleveldataDatedataTimestepRangedataTypegridType
Message
0ecmftisobaricInhPa5002011121500fcregular_ll
1ecmftisobaricInhPa5002011121506fcregular_ll
2ecmftisobaricInhPa50020111215012fcregular_ll
3ecmftisobaricInhPa50020111215018fcregular_ll
4ecmftisobaricInhPa50020111215024fcregular_ll
5ecmftisobaricInhPa50020111215030fcregular_ll
6ecmftisobaricInhPa50020111215036fcregular_ll
7ecmftisobaricInhPa50020111215042fcregular_ll
\n", "
" ], "text/plain": [ " centre shortName typeOfLevel level dataDate dataTime stepRange \\\n", "Message \n", "0 ecmf t isobaricInhPa 500 20111215 0 0 \n", "1 ecmf t isobaricInhPa 500 20111215 0 6 \n", "2 ecmf t isobaricInhPa 500 20111215 0 12 \n", "3 ecmf t isobaricInhPa 500 20111215 0 18 \n", "4 ecmf t isobaricInhPa 500 20111215 0 24 \n", "5 ecmf t isobaricInhPa 500 20111215 0 30 \n", "6 ecmf t isobaricInhPa 500 20111215 0 36 \n", "7 ecmf t isobaricInhPa 500 20111215 0 42 \n", "\n", " dataType gridType \n", "Message \n", "0 fc regular_ll \n", "1 fc regular_ll \n", "2 fc regular_ll \n", "3 fc regular_ll \n", "4 fc regular_ll \n", "5 fc regular_ll \n", "6 fc regular_ll \n", "7 fc regular_ll " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# temperature at all fc steps for one level\n", "t_one = fs.select(shortName='t', level=500)\n", "t_one.ls()" ] }, { "cell_type": "code", "execution_count": 10, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
centreshortNametypeOfLevelleveldataDatedataTimestepRangedataTypegridType
Message
0ecmftisobaricInhPa1002011121500fcregular_ll
1ecmftisobaricInhPa3002011121500fcregular_ll
2ecmftisobaricInhPa5002011121500fcregular_ll
3ecmftisobaricInhPa1002011121506fcregular_ll
4ecmftisobaricInhPa3002011121506fcregular_ll
5ecmftisobaricInhPa5002011121506fcregular_ll
6ecmftisobaricInhPa10020111215012fcregular_ll
7ecmftisobaricInhPa30020111215012fcregular_ll
8ecmftisobaricInhPa50020111215012fcregular_ll
9ecmftisobaricInhPa10020111215018fcregular_ll
10ecmftisobaricInhPa30020111215018fcregular_ll
11ecmftisobaricInhPa50020111215018fcregular_ll
12ecmftisobaricInhPa10020111215024fcregular_ll
13ecmftisobaricInhPa30020111215024fcregular_ll
14ecmftisobaricInhPa50020111215024fcregular_ll
15ecmftisobaricInhPa10020111215030fcregular_ll
16ecmftisobaricInhPa30020111215030fcregular_ll
17ecmftisobaricInhPa50020111215030fcregular_ll
18ecmftisobaricInhPa10020111215036fcregular_ll
19ecmftisobaricInhPa30020111215036fcregular_ll
20ecmftisobaricInhPa50020111215036fcregular_ll
21ecmftisobaricInhPa10020111215042fcregular_ll
22ecmftisobaricInhPa30020111215042fcregular_ll
23ecmftisobaricInhPa50020111215042fcregular_ll
\n", "
" ], "text/plain": [ " centre shortName typeOfLevel level dataDate dataTime stepRange \\\n", "Message \n", "0 ecmf t isobaricInhPa 100 20111215 0 0 \n", "1 ecmf t isobaricInhPa 300 20111215 0 0 \n", "2 ecmf t isobaricInhPa 500 20111215 0 0 \n", "3 ecmf t isobaricInhPa 100 20111215 0 6 \n", "4 ecmf t isobaricInhPa 300 20111215 0 6 \n", "5 ecmf t isobaricInhPa 500 20111215 0 6 \n", "6 ecmf t isobaricInhPa 100 20111215 0 12 \n", "7 ecmf t isobaricInhPa 300 20111215 0 12 \n", "8 ecmf t isobaricInhPa 500 20111215 0 12 \n", "9 ecmf t isobaricInhPa 100 20111215 0 18 \n", "10 ecmf t isobaricInhPa 300 20111215 0 18 \n", "11 ecmf t isobaricInhPa 500 20111215 0 18 \n", "12 ecmf t isobaricInhPa 100 20111215 0 24 \n", "13 ecmf t isobaricInhPa 300 20111215 0 24 \n", "14 ecmf t isobaricInhPa 500 20111215 0 24 \n", "15 ecmf t isobaricInhPa 100 20111215 0 30 \n", "16 ecmf t isobaricInhPa 300 20111215 0 30 \n", "17 ecmf t isobaricInhPa 500 20111215 0 30 \n", "18 ecmf t isobaricInhPa 100 20111215 0 36 \n", "19 ecmf t isobaricInhPa 300 20111215 0 36 \n", "20 ecmf t isobaricInhPa 500 20111215 0 36 \n", "21 ecmf t isobaricInhPa 100 20111215 0 42 \n", "22 ecmf t isobaricInhPa 300 20111215 0 42 \n", "23 ecmf t isobaricInhPa 500 20111215 0 42 \n", "\n", " dataType gridType \n", "Message \n", "0 fc regular_ll \n", "1 fc regular_ll \n", "2 fc regular_ll \n", "3 fc regular_ll \n", "4 fc regular_ll \n", "5 fc regular_ll \n", "6 fc regular_ll \n", "7 fc regular_ll \n", "8 fc regular_ll \n", "9 fc regular_ll \n", "10 fc regular_ll \n", "11 fc regular_ll \n", "12 fc regular_ll \n", "13 fc regular_ll \n", "14 fc regular_ll \n", "15 fc regular_ll \n", "16 fc regular_ll \n", "17 fc regular_ll \n", "18 fc regular_ll \n", "19 fc regular_ll \n", "20 fc regular_ll \n", "21 fc regular_ll \n", "22 fc regular_ll \n", "23 fc regular_ll " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# temperature at all fc steps for three levels\n", "# note that this example shows that select() performs some re-ordering of\n", "# the fields for efficiency of filtering - compare with the equivalent read()\n", "# example in the above section\n", "t_three = fs.select(shortName='t', level=[100, 300, 500])\n", "t_three.ls()" ] }, { "cell_type": "code", "execution_count": 11, "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", "
centreshortNametypeOfLevelleveldataDatedataTimestepRangedataTypegridType
Message
0ecmftisobaricInhPa1002011121506fcregular_ll
1ecmftisobaricInhPa3002011121506fcregular_ll
2ecmftisobaricInhPa5002011121506fcregular_ll
3ecmftisobaricInhPa10020111215024fcregular_ll
4ecmftisobaricInhPa30020111215024fcregular_ll
5ecmftisobaricInhPa50020111215024fcregular_ll
\n", "
" ], "text/plain": [ " centre shortName typeOfLevel level dataDate dataTime stepRange \\\n", "Message \n", "0 ecmf t isobaricInhPa 100 20111215 0 6 \n", "1 ecmf t isobaricInhPa 300 20111215 0 6 \n", "2 ecmf t isobaricInhPa 500 20111215 0 6 \n", "3 ecmf t isobaricInhPa 100 20111215 0 24 \n", "4 ecmf t isobaricInhPa 300 20111215 0 24 \n", "5 ecmf t isobaricInhPa 500 20111215 0 24 \n", "\n", " dataType gridType \n", "Message \n", "0 fc regular_ll \n", "1 fc regular_ll \n", "2 fc regular_ll \n", "3 fc regular_ll \n", "4 fc regular_ll \n", "5 fc regular_ll " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# temperature at two fc steps and three levels for a specific date\n", "t_date = fs.select(shortName='t', level=[100, 300, 500], step=[6, 24], date=20111215)\n", "t_date.ls()" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
centreshortNametypeOfLevelleveldataDatedataTimestepRangedataTypegridType
Message
0ecmftisobaricInhPa1002011121506fcregular_ll
1ecmftisobaricInhPa3002011121506fcregular_ll
2ecmftisobaricInhPa5002011121506fcregular_ll
3ecmftisobaricInhPa10020111215024fcregular_ll
4ecmftisobaricInhPa30020111215024fcregular_ll
5ecmftisobaricInhPa50020111215024fcregular_ll
\n", "
" ], "text/plain": [ " centre shortName typeOfLevel level dataDate dataTime stepRange \\\n", "Message \n", "0 ecmf t isobaricInhPa 100 20111215 0 6 \n", "1 ecmf t isobaricInhPa 300 20111215 0 6 \n", "2 ecmf t isobaricInhPa 500 20111215 0 6 \n", "3 ecmf t isobaricInhPa 100 20111215 0 24 \n", "4 ecmf t isobaricInhPa 300 20111215 0 24 \n", "5 ecmf t isobaricInhPa 500 20111215 0 24 \n", "\n", " dataType gridType \n", "Message \n", "0 fc regular_ll \n", "1 fc regular_ll \n", "2 fc regular_ll \n", "3 fc regular_ll \n", "4 fc regular_ll \n", "5 fc regular_ll " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# alternative: specify date using datetime\n", "import datetime\n", "t_date = fs.select(shortName='t', level=[100, 300, 500], step=[6, 24], date=datetime.datetime(2011, 12, 15, 0, 0))\n", "t_date.ls()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Performance\n", "Now we will compare the performance of these two methods and see how they differ when called multiple times on the same data. Imagine that we will want to compute a temporal mean for each level. To do that, we will loop over the levels and select all the forecast steps for each. We will enhance that code by adding timings, and by running the code multiple times, each time taking one more level into account." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "tags": [ "nbsphinx-thumbnail" ] }, "outputs": [ { "data": { "image/png": "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rCxyc3O55557yMnJ4YILLmDx4sWUl5dz4YUX0rv3mjOWvLw8nnjiiWrLPPzww5x99tlce+215ObmMmbMGPr27Ut2djY/+clPGDZsmF8sdpmjohzevw9euzlcoD1gOOx3IeRuFndkTYLMUlevRk1Dz1d3sVjSF0BlBmgHrADOMrNnattmYWGhVR2YZtasWey4444NEXJa88/BNUlfvgvjLoEFM6DnQBh8K7TdNu6o0o6kKWZWWN262M4IzGx172iSRhESxjNxxeOca2SWLYD/XAdTH4XWXeCER2CHIU36wa64pPL20ceA/kA7SUXAdUAugJndm6r3dc6luUQFTB4J/70RylbAfhfD/pdCXvO4I2uyUnnX0NANKDssVXE459JI0WQYd3HoH6jHAXDY7dB++7ijavL8yWLnXPxW/ACvXA8fPAQtt4ZjR0Lvn3sz0CbiicA5F59EAv73UEgCq5bA3udC/+HQrGXckWUUTwTOuXh8/WG4G2j+ZOi6Dxx+R7hv3m1yTWZgmqZk1KhRnHfeeXGH4VxqrFwUngq+/0D48Us4+j44bbwngRj5GUEKmBlmRlaW51nnVjODqY/By9eEHj77nQkH/g42axN3ZBnPa6oGMnfuXHr16sUpp5zCzjvvzI033ki/fv3o27cv11133epyRx11FLvvvju9e/dmxIgRq5f/85//ZPvtt2ePPfbg7bffjmMXnEud72bAPwfDM+fAFj3grNfhsD95Emgkmt4ZwQvD4duPGnabW/eBwbest9inn37Kgw8+yJIlS3jiiSd4//33MTOOOOIIJkyYwP7778/IkSPZYostWLlyJf369eOYY46htLSU6667jilTptC6dWsOPPBAdt1114bdB+fisGoJvH4zvHdf6KXziP+DXU4GP1tuVJpeIohRt27d2Guvvbj00kt5+eWXV1fmy5Yt49NPP2X//ffnrrvu4umnnwZg3rx5fPrpp3z77bf079+f9u3bA3DCCSfwySefxLYfzm00M5j+JLx0FSz7LowSdvC1YcAW1+g0vURQhyP3VGnePDz5aGZceeWVnH322Wutf/3113nllVd49913KSgooH///qxatSqOUJ1LneLZMP7S0FV0h13gxEeh8+5xR+Vq4ednKXDooYcycuRIli1bBsD8+fNZsGABixcvZvPNN6egoICPP/6YiRMnArDnnnvyxhtv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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def filter_n_times(n, use_select):\n", " levs = all_levels[0:n+1]\n", " for lev in levs:\n", " if use_select:\n", " a = fs.select(shortName='t', level=lev).count()\n", " else:\n", " a = mv.read(data=fs, param='t', levelist=lev).count()\n", "\n", "\n", "# find the list of all levels\n", "t_one_step = fs.select(shortName='t', step=0)\n", "all_levels = t_one_step.grib_get_double('level')\n", "num_levels = len(all_levels)\n", "\n", "nlevs = []\n", "times_read = []\n", "times_select = []\n", "\n", "for n in range(1, num_levels+1):\n", " nlevs.append(n)\n", " time1 = time.perf_counter()\n", " filter_n_times(n, use_select=True)\n", " timediff = time.perf_counter() - time1\n", " times_select.append(timediff)\n", "\n", " time1 = time.perf_counter()\n", " filter_n_times(n, use_select=False)\n", " timediff = time.perf_counter() - time1\n", " times_read.append(timediff)\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "plt.plot(nlevs, times_select, label=\"select\")\n", "plt.plot(nlevs, times_read, label=\"read\")\n", "plt.xlabel(\"Number of filters\")\n", "plt.ylabel(\"time (s)\")\n", "plt.legend(loc='upper left')\n", "plt.title('select vs read - small values mean faster')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The performance differences are due to the fact that [select()](../api/functions/select.rst) caches its Fieldset indexes so that further filtering on the same Fieldset should be faster." ] } ], "metadata": { "interpreter": { "hash": "3da5b250392587fc58cb86f7f8b502f6103cd3910800c59a8f6017fc798fb606" }, "kernelspec": { "display_name": "Python 3.8.6 64-bit ('mpy38': venv)", "name": "python3" }, "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.6" } }, "nbformat": 4, "nbformat_minor": 4 }