{
"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",
"
parameter
typeOfLevel
level
date
time
step
paramId
class
stream
type
experimentVersionNumber
\n",
"
q
isobaricInhPa
100,250,...
20111215
0
0,6,...
133
od
oper
fc
0001
t
isobaricInhPa
100,250,...
20111215
0
0,6,...
130
od
oper
fc
0001
tp
surface
0
20111215
0
0,6,...
228
od
oper
fc
0001
u
isobaricInhPa
100,250,...
20111215
0
0,6,...
131
od
oper
fc
0001
v
isobaricInhPa
100,250,...
20111215
0
0,6,...
132
od
oper
fc
0001
z
isobaricInhPa
100,250,...
20111215
0
0,6,...
129
od
oper
fc
0001
\n",
"
"
],
"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",
"
shortName
t
name
Temperature
paramId
130
units
K
typeOfLevel
isobaricInhPa
level
100,250,300,500,700,850,1000
date
20111215
time
0
step
0,6,12,18,24,30,36,42
class
od
stream
oper
type
fc
experimentVersionNumber
0001
\n",
"
"
],
"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",
"
centre
\n",
"
shortName
\n",
"
typeOfLevel
\n",
"
level
\n",
"
dataDate
\n",
"
dataTime
\n",
"
stepRange
\n",
"
dataType
\n",
"
gridType
\n",
"
\n",
"
\n",
"
Message
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
0
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
1
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
2
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
12
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
3
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
18
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
4
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
5
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
30
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
6
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
36
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
7
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
42
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
" \n",
"
\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",
"
centre
\n",
"
shortName
\n",
"
typeOfLevel
\n",
"
level
\n",
"
dataDate
\n",
"
dataTime
\n",
"
stepRange
\n",
"
dataType
\n",
"
gridType
\n",
"
\n",
"
\n",
"
Message
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
0
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
1
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
0
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
2
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
0
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
3
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
4
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
5
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
6
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
12
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
7
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
12
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
8
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
12
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
9
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
18
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
10
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
18
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
11
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
18
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
12
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
13
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
14
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
15
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
30
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
16
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
30
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
17
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
30
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
18
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
36
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
19
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
36
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
20
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
36
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
21
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
42
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
22
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
42
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
23
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
42
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
" \n",
"
\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",
"
centre
\n",
"
shortName
\n",
"
typeOfLevel
\n",
"
level
\n",
"
dataDate
\n",
"
dataTime
\n",
"
stepRange
\n",
"
dataType
\n",
"
gridType
\n",
"
\n",
"
\n",
"
Message
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
1
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
2
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
3
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
4
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
5
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
" \n",
"
\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",
"
centre
\n",
"
shortName
\n",
"
typeOfLevel
\n",
"
level
\n",
"
dataDate
\n",
"
dataTime
\n",
"
stepRange
\n",
"
dataType
\n",
"
gridType
\n",
"
\n",
"
\n",
"
Message
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
0
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
1
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
2
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
12
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
3
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
18
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
4
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
5
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
30
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
6
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
36
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
7
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
42
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
" \n",
"
\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",
"
centre
\n",
"
shortName
\n",
"
typeOfLevel
\n",
"
level
\n",
"
dataDate
\n",
"
dataTime
\n",
"
stepRange
\n",
"
dataType
\n",
"
gridType
\n",
"
\n",
"
\n",
"
Message
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
0
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
1
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
0
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
2
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
0
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
3
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
4
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
5
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
6
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
12
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
7
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
12
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
8
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
12
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
9
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
18
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
10
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
18
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
11
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
18
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
12
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
13
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
14
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
15
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
30
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
16
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
30
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
17
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
30
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
18
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
36
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
19
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
36
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
20
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
36
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
21
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
42
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
22
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
42
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
23
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
42
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
" \n",
"
\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",
"
centre
\n",
"
shortName
\n",
"
typeOfLevel
\n",
"
level
\n",
"
dataDate
\n",
"
dataTime
\n",
"
stepRange
\n",
"
dataType
\n",
"
gridType
\n",
"
\n",
"
\n",
"
Message
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
1
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
2
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
3
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
4
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
5
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
" \n",
"
\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",
"
centre
\n",
"
shortName
\n",
"
typeOfLevel
\n",
"
level
\n",
"
dataDate
\n",
"
dataTime
\n",
"
stepRange
\n",
"
dataType
\n",
"
gridType
\n",
"
\n",
"
\n",
"
Message
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
1
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
2
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
6
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
3
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
100
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
4
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
300
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
"
\n",
"
5
\n",
"
ecmf
\n",
"
t
\n",
"
isobaricInhPa
\n",
"
500
\n",
"
20111215
\n",
"
0
\n",
"
24
\n",
"
fc
\n",
"
regular_ll
\n",
"
\n",
" \n",
"
\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
}