Commit 9c3fdbf6 authored by Julia Wagemann's avatar Julia Wagemann
Browse files

LTPy v0.6 release

parent a05b1af2
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<img src='./img/EU-Copernicus-EUM_3Logos.png' alt='Logo EU Copernicus EUMETSAT' align='right' width='50%'></img> <img src='./img/EU-Copernicus-EUM_3Logos.png' alt='Logo EU Copernicus EUMETSAT' align='right' width='50%'></img>
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<br> <br>
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# LTPy - Learning Tool for Python on Atmospheric Composition Data # LTPy - Learning Tool for Python on Atmospheric Composition Data
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<br> <br>
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
**LTPy - Learning tool for Python on Atmospheric Composition Data** is a Python-based training course on Atmospheric Composition Data. The training course covers [10 - DATA ACCESS](#data_access), [20 - DATA DISCOVERY](#data_discovery), [30 - CASE STUDIES](#case_studies) and [40 - EXERCISES](#exercises) of satellite- and model-based data on Atmospheric Composition. **LTPy - Learning tool for Python on Atmospheric Composition Data** is a Python-based training course on Atmospheric Composition Data. The training course covers [10 - DATA ACCESS](#data_access), [20 - DATA DISCOVERY](#data_discovery), [30 - CASE STUDIES](#case_studies) and [40 - EXERCISES](#exercises) of satellite- and model-based data on Atmospheric Composition.
The course is based on [Jupyter notebooks](https://jupyter.org/), which allow for a high-level of interactive learning, as code, text description and visualisation is combined in one place. If you have not worked with `Jupyter Notebooks` before, you can look at the module [01 - Python and Project Jupyter 101](./01_Python_and_Jupyter_101.ipynb) to get a short introduction to Jupyter notebooks and their benefits. The course is based on [Jupyter notebooks](https://jupyter.org/), which allow for a high-level of interactive learning, as code, text description and visualisation is combined in one place. If you have not worked with `Jupyter Notebooks` before, you can look at the module [01 - Python and Project Jupyter 101](./01_Python_and_Jupyter_101.ipynb) to get a short introduction to Jupyter notebooks and their benefits.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<hr> <hr>
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Data on Atmospheric Composition ## Data on Atmospheric Composition
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
This course features the following **satellite** data: This course features the following **satellite** data:
* `Metop-A/B GOME-2 Level 2` data * `Metop-A/B/C GOME-2 Level 2` data
* `Metop-A/B GOME-2 Level 3` reprocessed and regridded data * `Metop-A/B/C GOME-2 Level 3` reprocessed and regridded data
* `Polar Multi-Sensor Aerosol Optical Properties (PMAp) Level 2` data * `Polar Multi-Sensor Aerosol Optical Properties (PMAp) Level 2` data
* `Metop-A/B IASI Level 2` data * `Metop-A/B/C IASI Level 2` data
* `Copernicus Sentinel-5P TROPOMI Level 2` data * `Copernicus Sentinel-5P TROPOMI Level 2` data
* `Copernicus Sentinel-3 OLCI Level 1B` data * `Copernicus Sentinel-3 OLCI Level 1B` data
* `Copernicus Sentinel-3 SLSTR NRT FRP Level 2` data * `Copernicus Sentinel-3 SLSTR NRT FRP Level 2` data
* `Copernicus Sentinel-3 SLSTR NRT AOD Level 2` data * `Copernicus Sentinel-3 SLSTR NRT AOD Level 2` data
And the following **model-based** data: And the following **model-based** data:
* `Copernicus Atmosphere Monitoring Service (CAMS) Global Reanalysis (EAC4)` data * `Copernicus Atmosphere Monitoring Service (CAMS) Global Reanalysis (EAC4)` data
* `Copernicus Atmosphere Monitoring Service (CAMS) Global Fire Assimilation System (GFAS)` data * `Copernicus Atmosphere Monitoring Service (CAMS) Global Fire Assimilation System (GFAS)` data
* `Coperncus Emergency Management Service (CEMS) Global ECMWF Fire Forecast (GEFF)` data * `Coperncus Emergency Management Service (CEMS) Global ECMWF Fire Forecast (GEFF)` data
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<hr> <hr>
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Course material ## Course material
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
The course follows a modular approach and offers modules on: The course follows a modular approach and offers modules on:
- [10 - DATA ACCESS](#data_access) - [10 - DATA ACCESS](#data_access)
- [20 - DATA DISCOVERY](#data_discovery) - [20 - DATA DISCOVERY](#data_discovery)
- [30 - CASE STUDIES](#case_studies) - [30 - CASE STUDIES](#case_studies)
- [40 - EXERCISES](#exercises) - [40 - EXERCISES](#exercises)
<br> <br>
<div class="alert alert-block alert-info"> <div class="alert alert-block alert-info">
<b><a id='data_access'></a>10 - DATA ACCESS</b> <b><a id='data_access'></a>10 - DATA ACCESS</b>
</div> </div>
* [11 - Atmospheric Composition data overview and acccess](./10_data_access/11_ac_data_access_overview.ipynb) * [11 - Atmospheric Composition data overview and acccess](./10_data_access/11_ac_data_access_overview.ipynb)
* [12 - WEkEO Harmonized Data Access API](./10_data_access/12_WEkEO_harmonized_data_access_api.ipynb) * [12 - WEkEO Harmonized Data Access API](./10_data_access/12_WEkEO_harmonized_data_access_api.ipynb)
<br> <br>
<div class="alert alert-block alert-success"> <div class="alert alert-block alert-success">
<b><a id='data_discovery'></a>20 - DATA DISCOVERY</b> <b><a id='data_discovery'></a>20 - DATA DISCOVERY</b>
</div> </div>
#### *Metop-A/B/C GOME-2 Level 2 and Level 3 data* #### *Metop-A/B/C GOME-2 Level 2 and Level 3 data*
* [211 - Metop-A GOME-2 - Tropospheric NO<sub>2</sub> - Level 2 - Load and browse](./20_data_discovery/211_Metop-A_GOME-2_NO2Tropo_L2_load_browse.ipynb) * [211 - Metop-A GOME-2 - Tropospheric NO<sub>2</sub> - Level 2 - Load and browse](./20_data_discovery/211_Metop-A_GOME-2_NO2Tropo_L2_load_browse.ipynb)
* [212 - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub> - Level 2 - Pre-process](./20_data_discovery/212_Metop-AB_GOME-2_NO2Tropo_L2_preprocess.ipynb) * [212 - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub> - Level 2 - Pre-process](./20_data_discovery/212_Metop-AB_GOME-2_NO2Tropo_L2_preprocess.ipynb)
* [213 - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub> - Level 3 - Load and browse](./20_data_discovery/213_Metop-AB_GOME-2_NO2Tropo_L3_load_browse.ipynb) * [213 - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub> - Level 3 - Load and browse](./20_data_discovery/213_Metop-AB_GOME-2_NO2Tropo_L3_load_browse.ipynb)
* [214 - Metop-A/B/C GOME-2 - Absorbing Aerosol Index - Level 3 - Load and browse](./20_data_discovery/214_Metop-ABC_GOME-2_AAI_L3_load_browse.ipynb) * [214 - Metop-A/B/C GOME-2 - Absorbing Aerosol Index - Level 3 - Load and browse](./20_data_discovery/214_Metop-ABC_GOME-2_AAI_L3_load_browse.ipynb)
#### *Polar Multi-Sensor Aerosol Optical Properties (PMAp) Level 2 data* #### *Polar Multi-Sensor Aerosol Optical Properties (PMAp) Level 2 data*
* [221 - Polar Multi-Sensor Aerosol Optical Properties (PMAp) - Aerosol Optical Depth - Level 2 - Load and browse](./20_data_discovery/221_PMAp_AOD_L2_load_browse.ipynb) * [221 - Polar Multi-Sensor Aerosol Optical Properties (PMAp) - Aerosol Optical Depth - Level 2 - Load and browse](./20_data_discovery/221_PMAp_AOD_L2_load_browse.ipynb)
#### *Metop-A/B IASI Level 2 data* #### *Metop-A/B IASI Level 2 data*
* [231 - Metop-A/B IASI - Ammonia (NH<sub>3</sub>) - Level 2 - Load and browse](./20_data_discovery/231_Metop-AB_IASI_NH3_L2_load_browse.ipynb) * [231 - Metop-A/B IASI - Ammonia (NH<sub>3</sub>) - Level 2 - Load and browse](./20_data_discovery/231_Metop-AB_IASI_NH3_L2_load_browse.ipynb)
#### *Sentinel-5P TROPOMI Level 2 data* #### *Sentinel-5P TROPOMI Level 2 data*
* [241 - Sentinel-5P TROPOMI - Carbon Monoxide - Level 2 - Load and browse](./20_data_discovery/241_Sentinel-5P_TROPOMI_CO_L2_load_browse.ipynb) * [241 - Sentinel-5P TROPOMI - Carbon Monoxide - Level 2 - Load and browse](./20_data_discovery/241_Sentinel-5P_TROPOMI_CO_L2_load_browse.ipynb)
#### *Sentinel-3 data* #### *Sentinel-3 data*
* [251 - Sentinel-3 OLCI - Radiances - Level 1 - Load and browse](./20_data_discovery/251_Sentinel-3_OLCI_radiance_L1_load_browse.ipynb) * [251 - Sentinel-3 OLCI - Radiances - Level 1 - Load and browse](./20_data_discovery/251_Sentinel-3_OLCI_radiance_L1_load_browse.ipynb)
* [252 - Sentinel-3 SLSTR NRT - Fire Radiative Power (FRP) - Level 2 - Load and browse](./20_data_discovery/252_Sentinel-3_SLSTR_NRT_FRP_L2_load_browse.ipynb) * [252 - Sentinel-3 SLSTR NRT - Fire Radiative Power (FRP) - Level 2 - Load and browse](./20_data_discovery/252_Sentinel-3_SLSTR_NRT_FRP_L2_load_browse.ipynb)
* [253 - Sentinel-3 SLSTR NRT - Aerosol Optical Depth (AOD) - Level 2 - Load and browse](./20_data_discovery/253_Sentinel-3_SLSTR_NRT_AOD_L2_load_browse.ipynb) * [253 - Sentinel-3 SLSTR NRT - Aerosol Optical Depth (AOD) - Level 2 - Load and browse](./20_data_discovery/253_Sentinel-3_SLSTR_NRT_AOD_L2_load_browse.ipynb)
#### *Copernicus Atmosphere Monitoring Service (CAMS) data* #### *Copernicus Atmosphere Monitoring Service (CAMS) data*
* [261 - CAMS Global reanalysis (EAC4) - Organic Matter Aerosol Optical Depth - Load and browse](./20_data_discovery/261_CAMS_EAC4_OMAOD_load_browse.ipynb) * [261 - CAMS Global reanalysis (EAC4) - Organic Matter Aerosol Optical Depth - Load and browse](./20_data_discovery/261_CAMS_EAC4_OMAOD_load_browse.ipynb)
* [262 - CAMS Global Fire Assimilation System (GFAS) - Fire Radiative Power - Load and browse](./20_data_discovery/262_CAMS_GFAS_FRPFIRE_load_browse.ipynb) * [262 - CAMS Global Fire Assimilation System (GFAS) - Fire Radiative Power - Load and browse](./20_data_discovery/262_CAMS_GFAS_FRPFIRE_load_browse.ipynb)
#### *Copernicus Emergency Management Service (CEMS) data* #### *Copernicus Emergency Management Service (CEMS) data*
* [271 - CEMS Global ECMWF Fire Forecast - Fire Weather Index - Load and browse](./20_data_discovery/271_CEMS_GEFF_FWI_load_browse.ipynb) * [271 - CEMS Global ECMWF Fire Forecast - Fire Weather Index - Load and browse](./20_data_discovery/271_CEMS_GEFF_FWI_load_browse.ipynb)
* [272 - CEMS Global ECMWF Fire Forecast - Fire Weather Index - Harmonized Danger Classes](./20_data_discovery/272_CEMS_GEFF_FWI_harmonized_danger_classes.ipynb) * [272 - CEMS Global ECMWF Fire Forecast - Fire Weather Index - Harmonized Danger Classes](./20_data_discovery/272_CEMS_GEFF_FWI_harmonized_danger_classes.ipynb)
* [273 - CEMS Global ECMWF Fire Forecast - Fire Weather Index - Custom Danger Classes](./20_data_discovery/273_CEMS_GEFF_FWI_custom_danger_classes.ipynb) * [273 - CEMS Global ECMWF Fire Forecast - Fire Weather Index - Custom Danger Classes](./20_data_discovery/273_CEMS_GEFF_FWI_custom_danger_classes.ipynb)
<br> <br>
<div class="alert alert-block alert-warning"> <div class="alert alert-block alert-warning">
<b><a id='case_studies'></a>30 - CASE STUDIES</b> <b><a id='case_studies'></a>30 - CASE STUDIES</b>
</div> </div>
#### *Fires* #### *Fires*
* [311 - Amazon fires 2019](./30_case_studies/311_fire_amazon_2019.ipynb) * [311 - Amazon fires 2019](./30_case_studies/311_fire_amazon_2019.ipynb)
* [312 - Siberian fires 2019](./30_case_studies/312_fire_siberia_2019.ipynb) * [312 - Siberian fires 2019](./30_case_studies/312_fire_siberia_2019.ipynb)
* [313 - Californian fires 2020](./30_case_studies/313_fire_california_2020.ipynb) * [313 - Californian fires 2020](./30_case_studies/313_fire_california_2020.ipynb)
* [314 - Chernobly fires 2020 - Sentinel-3 SLSTR NRT - Fire Radiative Power](./30_case_studies/314_fire_chernobyl_2020_Sentinel-3_SLSTR_NRT_FRP_L2.ipynb) * [314 - Chernobly fires 2020 - Sentinel-3 SLSTR NRT - Fire Radiative Power](./30_case_studies/314_fire_chernobyl_2020_Sentinel-3_SLSTR_NRT_FRP_L2.ipynb)
* [315 - Californian fires 2020 - Sentinel-3 SLSTR NRT - Fire Radiative Power](./30_case_studies/315_fire_california_2020_Sentinel-3_SLSTR_NRT_FRP_L2.ipynb) * [315 - Californian fires 2020 - Sentinel-3 SLSTR NRT - Fire Radiative Power](./30_case_studies/315_fire_california_2020_Sentinel-3_SLSTR_NRT_FRP_L2.ipynb)
* [316 - Californian fires 2020 - Sentinel-3 SLSTR NRT - Aerosol Optical Depth](./30_case_studies/316_fire_california_2020_Sentinel-3_SLSTR_NRT_AOD_L2.ipynb) * [316 - Californian fires 2020 - Sentinel-3 SLSTR NRT - Aerosol Optical Depth](./30_case_studies/316_fire_california_2020_Sentinel-3_SLSTR_NRT_AOD_L2.ipynb)
#### *Air pollution* #### *Air pollution*
* [321 - Map and time-series analysis - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub>](./30_case_studies/321_air_pollution_map_time-series_Metop-AB_GOME-2_NO2Tropo_L3.ipynb) * [321 - Map and time-series analysis - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub>](./30_case_studies/321_air_pollution_map_time-series_Metop-AB_GOME-2_NO2Tropo_L3.ipynb)
* [322 - Produce gridded dataset - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub>](./30_case_studies/322_air_pollution_produce_gridded_Metop-AB_GOME-2_NO2Tropo_L2.ipynb) * [322 - Produce gridded dataset - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub>](./30_case_studies/322_air_pollution_produce_gridded_Metop-AB_GOME-2_NO2Tropo_L2.ipynb)
* [323 - Create an anomaly map - Europe - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub>](./30_case_studies/323_air_pollution_map_europe_2020_Metop-AB_GOME-2_NO2Tropo_L2.ipynb) * [323 - Create an anomaly map - Europe - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub>](./30_case_studies/323_air_pollution_map_europe_2020_Metop-AB_GOME-2_NO2Tropo_L2.ipynb)
* [324 - Time-series analysis - Europe - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub>](./30_case_studies/324_air_pollution_time-series_europe_2020_Metop-AB_GOME-2_NO2Tropo_L2.ipynb) * [324 - Time-series analysis - Europe - Metop-A/B GOME-2 - Tropospheric NO<sub>2</sub>](./30_case_studies/324_air_pollution_time-series_europe_2020_Metop-AB_GOME-2_NO2Tropo_L2.ipynb)
* [325 - Create an anomaly map - Europe - Sentinel-5P TROPOMI - Tropospheric NO<sub>2</sub>](./30_case_studies/325_air_pollution_map_europe_2020_Sentinel-5P_TROPOMI_NO2Tropo_L2.ipynb) * [325 - Create an anomaly map - Europe - Sentinel-5P TROPOMI - Tropospheric NO<sub>2</sub>](./30_case_studies/325_air_pollution_map_europe_2020_Sentinel-5P_TROPOMI_NO2Tropo_L2.ipynb)
* [326 - Time-series analysis - Europe - Sentinel-5P TROPOMI - Tropospheric NO<sub>2</sub>](./30_case_studies/326_air_pollution_time-series_europe_2020_Sentinel-5P_TROPOMI_NO2Tropo_L2.ipynb) * [326 - Time-series analysis - Europe - Sentinel-5P TROPOMI - Tropospheric NO<sub>2</sub>](./30_case_studies/326_air_pollution_time-series_europe_2020_Sentinel-5P_TROPOMI_NO2Tropo_L2.ipynb)
#### *Stratospheric Ozone* #### *Stratospheric Ozone*
* [331 - Antarctic ozone hole - Summer 2019](./30_case_studies/331_stratospheric_ozone_2019.ipynb) * [331 - Antarctic ozone hole 2019 - Multi-data](./30_case_studies/331_stratospheric_ozone_Antarctic_2019.ipynb)
* [332 - Antarctic ozone hole - CAMS animation - Summer 2019](./30_case_studies/332_stratospheric_ozone_animation_2019.ipynb) * [332 - Antarctic ozone hole 2019 - CAMS animation](./30_case_studies/332_stratospheric_ozone_Antarctic_2019_CAMS_EAC4_animation.ipynb)
* [333 - Antarctic ozone hole 2020 - Metop-A/B/C GOME-2 Level 2](./30_case_studies/333_stratospheric_ozone_Antarctic_2020_Metop-ABC_GOME-2_O3_L2.ipynb)
* [334 - Arctic ozone hole 2020 - Metop-A/B/C IASI Level 2 ](./30_case_studies/334_stratospheric_ozone_Arctic_2020_Metop-ABC_IASI_O3_L2.ipynb)
<br> <br>
<div class="alert alert-block alert-danger"> <div class="alert alert-block alert-danger">
<b><a id='exercises'></a>40 - EXERCISES</b> <b><a id='exercises'></a>40 - EXERCISES</b>
</div> </div>
#### *Sentinel-5P TROPOMI* #### *Sentinel-5P TROPOMI*
* [411 - Sentinel-5P TROPOMI - Carbon Monoxide - Level 2](./40_exercises/411_Sentinel-5P_TROPOMI_CO_L2_exercise.ipynb) * [411 - Sentinel-5P TROPOMI - Carbon Monoxide - Level 2](./40_exercises/411_Sentinel-5P_TROPOMI_CO_L2_exercise.ipynb)
#### *Sentinel-3* #### *Sentinel-3*
* [421 - Sentinel-3 OLCI - Radiances - Level 1](./40_exercises/421_Sentinel-3_OLCI_radiance_L1_exercise.ipynb) * [421 - Sentinel-3 OLCI - Radiances - Level 1](./40_exercises/421_Sentinel-3_OLCI_radiance_L1_exercise.ipynb)
* [422 - Sentinel-3 SLSTR NRT - Fire Radiative Power](./40_exercises/422_Sentinel-3_SLSTR_NRT_FRP_L2_exercise.ipynb) * [422 - Sentinel-3 SLSTR NRT - Fire Radiative Power](./40_exercises/422_Sentinel-3_SLSTR_NRT_FRP_L2_exercise.ipynb)
* [423 - Sentinel-3 SLSTR NRT - Aerosol Optical Depth](./40_exercises/423_Sentinel-3_SLSTR_NRT_AOD_L2_exercise.ipynb) * [423 - Sentinel-3 SLSTR NRT - Aerosol Optical Depth](./40_exercises/423_Sentinel-3_SLSTR_NRT_AOD_L2_exercise.ipynb)
#### *Copernicus Atmosphere Monitoring Service* #### *Copernicus Atmosphere Monitoring Service*
* [431 - CAMS Global Reanalysis (EAC4) - Total Column Carbon Monoxide](./40_exercises/431_CAMS_EAC4_tcco_exercise.ipynb) * [431 - CAMS Global Reanalysis (EAC4) - Total Column Carbon Monoxide](./40_exercises/431_CAMS_EAC4_tcco_exercise.ipynb)
#### *Metop-A/B/C GOME-2 and IASI*
* [441 - Metop-A/B/C GOME-2 - Ozone](./40_exercises/441_Metop-ABC_GOME-2_O3_L2_exercise.ipynb)
* [442 - Metop-A/B/C IASI - Ozone](./40_exercises/442_Metop-ABC_IASI_O3_L2_exercise.ipynb)
<br> <br>
**NOTE:** Throughout the course, general functions to `load`, `re-shape`, `process` and `visualize` the datasets are defined. These functions are re-used when applicable. The [functions notebook](./functions.ipynb) gives you an overview of all the functions defined and used for the course. **NOTE:** Throughout the course, general functions to `load`, `re-shape`, `process` and `visualize` the datasets are defined. These functions are re-used when applicable. The [functions notebook](./functions.ipynb) gives you an overview of all the functions defined and used for the course.
If a notebook makes use of these functions, they are loaded as **helper functions** at the beginning of the notebook. With `?function_name`, you can load the function's docstring to see what it does and which keyword arguments the function requires. If a notebook makes use of these functions, they are loaded as **helper functions** at the beginning of the notebook. With `?function_name`, you can load the function's docstring to see what it does and which keyword arguments the function requires.
See the example to load the docstring of the function [visualize_pcolormesh](./functions.ipynb#visualize_pcolormesh): See the example to load the docstring of the function [visualize_pcolormesh](./functions.ipynb#visualize_pcolormesh):
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%run ./functions.ipynb %run ./functions.ipynb
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
?visualize_pcolormesh ?visualize_pcolormesh
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<hr> <hr>
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Learning outcomes ## Learning outcomes
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
The course is designed for `medium-level users`, who have basic Python knowledge and understanding of Atmospheric composition data. The course is designed for `medium-level users`, who have basic Python knowledge and understanding of Atmospheric composition data.
After the course, you should have: After the course, you should have:
* an idea about the **different datasets on Atmospheric Composition data**, * an idea about the **different datasets on Atmospheric Composition data**,
* knowledge about the most useful **Python packages** to handle, process and visualise large volumes of Earth Observation data * knowledge about the most useful **Python packages** to handle, process and visualise large volumes of Earth Observation data
* an idea about different **data application areas** * an idea about different **data application areas**
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<hr> <hr>
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Access to the `LTPy JupyterHub` ## Access to the `LTPy JupyterHub`
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
The course material is made available on a JupyterHub instance, a pre-defined environment that give learners direct access to the data and Python packages required for following the course. The course material is made available on a JupyterHub instance, a pre-defined environment that give learners direct access to the data and Python packages required for following the course.
The `JupyterHub` can be accessed as follows: The `JupyterHub` can be accessed as follows:
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Web address: [https://ltpy.adamplatform.eu](https://ltpy.adamplatform.eu) * Web address: [https://ltpy.adamplatform.eu](https://ltpy.adamplatform.eu)
* Create an account: [https://login.ltpy.adamplatform.eu/](https://login.ltpy.adamplatform.eu/) * Create an account: [https://login.ltpy.adamplatform.eu/](https://login.ltpy.adamplatform.eu/)
* Log into the `JupyterHub` with your account created. * Log into the `JupyterHub` with your account created.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<hr> <hr>
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Reproduce LTPy on Atmospheric Compostion data locally ## Reproduce LTPy on Atmospheric Compostion data locally
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
In case you wish to reproduce the course modules on your local setup, the following Python version and Python packages will be required: In case you wish to reproduce the course modules on your local setup, the following Python version and Python packages will be required:
* Python version: **Python3.8** * Python version: **Python3.8**
* Python packages: see [requirements.txt](./requirements.txt) * Python packages: see [requirements.txt](./requirements.txt)
Python packages can be installed as follows: `pip install -r requirements.txt`. Python packages can be installed as follows: `pip install -r requirements.txt`.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
The `eodata` folder with all the data required for the training course can be accessed and downloaded from [https://sftp.eumetsat.int](https://sftp.eumetsat.int/login). Find the user name and password in order to be able to login [here](https://gitlab.eumetsat.int/eumetlab/atmosphere/atmosphere/-/blob/master/sftp_login.txt). The `eodata` folder with all the data required for the training course can be accessed and downloaded from [https://sftp.eumetsat.int](https://sftp.eumetsat.int/login). Find the user name and password in order to be able to login [here](https://gitlab.eumetsat.int/eumetlab/atmosphere/atmosphere/-/blob/master/sftp_login.txt).
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<hr> <hr>
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<p><img src='./img/copernicus_logo.png' align='left' alt='Logo EU Copernicus' width='25%'></img></p> <p><img src='./img/copernicus_logo.png' align='left' alt='Logo EU Copernicus' width='25%'></img></p>
<br clear=left> <br clear=left>
<p style="text-align:left;">This project is licensed under the <a href="./LICENSE">MIT License</a> <span style="float:right;"><a href="https://gitlab.eumetsat.int/eumetlab/atmosphere/atmosphere">View on GitLab</a> | <a href="https://training.eumetsat.int/">EUMETSAT Training</a> <p style="text-align:left;">This project is licensed under the <a href="./LICENSE">MIT License</a> <span style="float:right;"><a href="https://gitlab.eumetsat.int/eumetlab/atmosphere/atmosphere">View on GitLab</a> | <a href="https://training.eumetsat.int/">EUMETSAT Training</a>
......
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
<img src='../img/EU-Copernicus-EUM_3Logos.png' alt='Logo EU Copernicus EUMETSAT' align='right' width='50%'></img> <img src='../img/EU-Copernicus-EUM_3Logos.png' alt='Logo EU Copernicus EUMETSAT' align='right' width='50%'></img>
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
<br> <br>
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
<a href="../00_index.ipynb"><< Index</a><br> <a href="../00_index.ipynb"><< Index</a><br>
<a href="./325_air_pollution_map_europe_2020_Sentinel-5P_TROPOMI_NO2Tropo_L2.ipynb"><< 325 - Sentinel-5P TROPOMI anomaly map</a><span style="float:right;"><a href="./331_stratospheric_ozone_2019.ipynb <a href="./325_air_pollution_map_europe_2020_Sentinel-5P_TROPOMI_NO2Tropo_L2.ipynb"><< 325 - Sentinel-5P TROPOMI anomaly map</a><span style="float:right;"><a href="./331_stratospheric_ozone_Antarctic_2019.ipynb
">331 - Stratospheric Ozone 2019 >></a></span> ">331 - Stratospheric Ozone 2019 - Antarctic >></a></span>
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
<div class="alert alert-block alert-warning"> <div class="alert alert-block alert-warning">
<b>30 - CASE STUDIES - AIR POLLUTION</b></div> <b>30 - CASE STUDIES - AIR POLLUTION</b></div>
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
<div class="alert alert-block alert-warning"> <div class="alert alert-block alert-warning">
   
<b>PREREQUISITES </b> <b>PREREQUISITES </b>
   
The following **20 - DATA DISCOVERY** modules are prerequisites: The following **20 - DATA DISCOVERY** modules are prerequisites:
   
- [241 - Sentinel-5P TROPOMI - Carbon Monoxide - Level 2 - Load and browse](../20_data_discovery/241_Sentinel-5P_TROPOMI_CO_L2_load_browse.ipynb) - [241 - Sentinel-5P TROPOMI - Carbon Monoxide - Level 2 - Load and browse](../20_data_discovery/241_Sentinel-5P_TROPOMI_CO_L2_load_browse.ipynb)
- [325 - Sentinel-5P TROPOMI anomaly map](../30_case_studies/325_air_pollution_map_europe_2020_Sentinel-5P_TROPOMI_NO2Tropo_L2.ipynb) - [325 - Sentinel-5P TROPOMI anomaly map](../30_case_studies/325_air_pollution_map_europe_2020_Sentinel-5P_TROPOMI_NO2Tropo_L2.ipynb)
   
   
It is recommended to go through these modules before you start with this module. It is recommended to go through these modules before you start with this module.
</div> </div>
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
<hr> <hr>
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
# 3.2.6 Sentinel-5P TROPOMI Tropospheric NO<sub>2</sub> time-series analysis # 3.2.6 Sentinel-5P TROPOMI Tropospheric NO<sub>2</sub> time-series analysis
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
This workflows will guide you through the different steps of how you can generate daily average time-series data of tropospheric NO<sub>2</sub> based on Copernius Sentinel-5P TROPOMI Level 2 data. This workflows will guide you through the different steps of how you can generate daily average time-series data of tropospheric NO<sub>2</sub> based on Copernius Sentinel-5P TROPOMI Level 2 data.
   
The aim is to have two time-series of `tropospheric NO2` for two periods and three different regions: The aim is to have two time-series of `tropospheric NO2` for two periods and three different regions:
- **Time periods**: - **Time periods**:
- December 2018 to 15 May 2019, and - December 2018 to 15 May 2019, and
- December 2019 to 15 May 2020 - December 2019 to 15 May 2020
- **Regions**: - **Regions**:
- Europe - Europe
- Povalley (Italy) - Povalley (Italy)
- Hubei (China) - Hubei (China)
   
### Data used ### Data used
The workflow and analyses are based on the following data: The workflow and analyses are based on the following data:
- Daily Sentinel-5P Level 2 files retrieved from the [Open Data Registry on AWS](https://registry.opendata.aws/sentinel5p/) - Daily Sentinel-5P Level 2 files retrieved from the [Open Data Registry on AWS](https://registry.opendata.aws/sentinel5p/)
   
### Workflow outline ### Workflow outline
The workflow has the following outline: The workflow has the following outline:
- [Define a list with dictionaries holding bounding boxes for different regions](#region_list) - [Define a list with dictionaries holding bounding boxes for different regions](#region_list)
- [*Optional: Loop through the files of daily tropopsheric NO<sub>2</sub> and store the average values for each region as dictionary*](#optional_loop) - [*Optional: Loop through the files of daily tropopsheric NO<sub>2</sub> and store the average values for each region as dictionary*](#optional_loop)
- [Open JSON file with daily average tropospheric NO<sub>2</sub> values for specific regions](#open_json) - [Open JSON file with daily average tropospheric NO<sub>2</sub> values for specific regions](#open_json)
- [Subset the time-series data and create 7-day and 15-day moving averages](#subset) - [Subset the time-series data and create 7-day and 15-day moving averages](#subset)
- [Visualize the Sentinel-5P TROPOMI NO<sub>2</sub> time-series data](#visualize) - [Visualize the Sentinel-5P TROPOMI NO<sub>2</sub> time-series data](#visualize)
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
#### Load required libraries #### Load required libraries
   
%% Cell type:code id: tags: %% Cell type:code id: tags:
   
``` python ``` python
import glob import glob
import os import os
import xarray as xr import xarray as xr
import numpy as np import numpy as np
import pandas as pd import pandas as pd
from datetime import datetime from datetime import datetime
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import cartopy.crs as ccrs import cartopy.crs as ccrs
import json import json
``` ```
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
#### Load helper functions #### Load helper functions
   
%% Cell type:code id: tags: %% Cell type:code id: tags:
   
``` python ``` python
%run ../functions.ipynb %run ../functions.ipynb
``` ```
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
#### Function to help read and load .json files #### Function to help read and load .json files
   
%% Cell type:code id: tags: %% Cell type:code id: tags:
   
``` python ``` python
def myconverter(o): def myconverter(o):
if isinstance(o, datetime): if isinstance(o, datetime):
return o.__str__() return o.__str__()
``` ```
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
<hr> <hr>
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
## <a id='region_list'></a>Define a list with dictionaries holding bounding boxes for different regions ## <a id='region_list'></a>Define a list with dictionaries holding bounding boxes for different regions
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
You can define several regions as a dictionary, e.g. the bounding box information for Europe, the Po valley in Italy or the Hubei region in China. The dictionaries are stored in a list. You can define several regions as a dictionary, e.g. the bounding box information for Europe, the Po valley in Italy or the Hubei region in China. The dictionaries are stored in a list.
   
%% Cell type:code id: tags: %% Cell type:code id: tags:
   
``` python ``` python
eur_extent={'name': 'eur_extent', eur_extent={'name': 'eur_extent',
'lonmin':-10.0, 'lonmin':-10.0,
'lonmax':35, 'lonmax':35,
'latmin':35.0, 'latmin':35.0,
'latmax':60.0} 'latmax':60.0}
   
# Italy (Po Valley, Milano) # Italy (Po Valley, Milano)
povalley_extent={'name': 'povalley_extent', povalley_extent={'name': 'povalley_extent',
'lonmin':7.0, 'lonmin':7.0,
'lonmax':13.0, 'lonmax':13.0,
'latmin':44.0, 'latmin':44.0,
'latmax':47.0} 'latmax':47.0}
   
   
# China (Hubei, Wuhan) # China (Hubei, Wuhan)
hubei_extent={'name': 'hubei_extent', hubei_extent={'name': 'hubei_extent',
'lonmin':108.3, 'lonmin':108.3,
'lonmax':116.1, 'lonmax':116.1,
'latmin':29.1, 'latmin':29.1,
'latmax':33.3} 'latmax':33.3}
   
region_list =[eur_extent, region_list =[eur_extent,
povalley_extent, povalley_extent,
hubei_extent] hubei_extent]
``` ```
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
## <a id='optional_loop'></a>*Optional: Loop through the files of daily tropopsheric NO<sub>2</sub> and store the average values for each region as dictionary* ## <a id='optional_loop'></a>*Optional: Loop through the files of daily tropopsheric NO<sub>2</sub> and store the average values for each region as dictionary*
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
This part of the workflow is optional. It opens daily Sentinel-5P Level 2 `Cloud-Optimised GeoTiff` files, creates the average NO<sub>2</sub> value of a geographical subset for a specified region and stores the daily mean value and datetime stamp in two lists. The two lists combined as a dictionary are returned by the function. This part of the workflow is optional. It opens daily Sentinel-5P Level 2 `Cloud-Optimised GeoTiff` files, creates the average NO<sub>2</sub> value of a geographical subset for a specified region and stores the daily mean value and datetime stamp in two lists. The two lists combined as a dictionary are returned by the function.
   
The downloaded `COG` files are in the folder `/eodata/sentinel5p/no2/`. The time-series data have already been computed and stored as a `JSON` file in the directory `/eodata/sentinel5p/no2/json/`. Thus, you can skip this step and continue directly with the next [workflow step](#open_json). The downloaded `COG` files are in the folder `/eodata/sentinel5p/no2/`. The time-series data have already been computed and stored as a `JSON` file in the directory `/eodata/sentinel5p/no2/json/`. Thus, you can skip this step and continue directly with the next [workflow step](#open_json).
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
#### List all files ending with `.tif` and store them in a list of files #### List all files ending with `.tif` and store them in a list of files
   
%% Cell type:code id: tags: %% Cell type:code id: tags:
   
``` python ``` python
fileList = glob.glob('../eodata/sentinel5p/no2/*.tif') fileList = glob.glob('../eodata/sentinel5p/no2/*.tif')
fileList_sort = sorted(fileList) fileList_sort = sorted(fileList)
``` ```
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
#### Function that loops over each region and each file and saves the daily average tropospheric NO<sub>2</sub> values as dictionary #### Function that loops over each region and each file and saves the daily average tropospheric NO<sub>2</sub> values as dictionary
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
For each region in the region list, the loop executes the following steps: For each region in the region list, the loop executes the following steps:
- Loop over each file in the file list - Loop over each file in the file list
- Open the file as `xarray.DataArray()` - Open the file as `xarray.DataArray()`
- Rename `x` and `y` to `longitude` and `latitude` - Rename `x` and `y` to `longitude` and `latitude`
- Create a geographical subset with the function [generate_geographical_subset](../functions.ipynb#generate_geographical_subset) based on the region's bounding box - Create a geographical subset with the function [generate_geographical_subset](../functions.ipynb#generate_geographical_subset) based on the region's bounding box
- Flag negative values - Flag negative values
- Compute the spatial mean of the geographical subset - Compute the spatial mean of the geographical subset
- Append the mean value to a list of mean values - Append the mean value to a list of mean values
- Do the same for the date time instance - Do the same for the date time instance
   
For each region, the dictionary holds two lists, with datetime information and the average tropospheric NO<sub>2</sub> values for the respective day and region. For each region, the dictionary holds two lists, with datetime information and the average tropospheric NO<sub>2</sub> values for the respective day and region.
   
%% Cell type:code id: tags: %% Cell type:code id: tags:
   
``` python ``` python
region_dict={} region_dict={}
# Loop through each region in the region list # Loop through each region in the region list
for region in region_list: for region in region_list:
print(region) print(region)
# Initiate an empty list for date and mean values # Initiate an empty list for date and mean values
date_list=[] date_list=[]
mean_list=[] mean_list=[]
# Loop through each file in the file list # Loop through each file in the file list
for i in range(len(fileList)): for i in range(len(fileList)):
print(i) print(i)
# Open the tif file as xarray.DataArray with the function 'open_rasterio()' # Open the tif file as xarray.DataArray with the function 'open_rasterio()'
tmp = xr.open_rasterio(fileList[i]) tmp = xr.open_rasterio(fileList[i])
# Rename x and y to longitude and latitude in order to use the function 'generate_geographical_subset' # Rename x and y to longitude and latitude in order to use the function 'generate_geographical_subset'
tmp= tmp.rename({'x': 'longitude', 'y':'latitude'}) tmp= tmp.rename({'x': 'longitude', 'y':'latitude'})
   
# Create a geographical subset for the specific region # Create a geographical subset for the specific region
tmp_sub = generate_geographical_subset(xarray=tmp, tmp_sub = generate_geographical_subset(xarray=tmp,
latmin=region['latmin'], latmin=region['latmin'],
latmax=region['latmax'], latmax=region['latmax'],
lonmin=region['lonmin'], lonmin=region['lonmin'],
lonmax=region['lonmax']) lonmax=region['lonmax'])
   
# Flag negative values # Flag negative values
tmp_sub_flag = tmp_sub.where(tmp_sub>0,np.nan) tmp_sub_flag = tmp_sub.where(tmp_sub>0,np.nan)
   
# Create the daily average tropospheric NO2 value for the specific region # Create the daily average tropospheric NO2 value for the specific region
tmp_sub_mean = tmp_sub_flag.mean() tmp_sub_mean = tmp_sub_flag.mean()
   
# Add the mean value to the list # Add the mean value to the list
mean_list.append((tmp_sub_mean.values).item()) mean_list.append((tmp_sub_mean.values).item())
   
# Retrieve the date from the file name # Retrieve the date from the file name
date = (fileList[i].split('_'))[8] date = (fileList[i].split('_'))[8]
# Create a datetime object and append it to the list of dates # Create a datetime object and append it to the list of dates
date_dt = datetime.strptime(date, '%Y%m%d') date_dt = datetime.strptime(date, '%Y%m%d')
date_list.append(date_dt) date_list.append(date_dt)
   
# Combine both lists in a dictionary # Combine both lists in a dictionary
region_dict[region['name']] = {'date':date_list, region_dict[region['name']] = {'date':date_list,
'mean':mean_list} 'mean':mean_list}
``` ```
   
%% Output %% Output
   
{'name': 'eur_extent', 'lonmin': -10.0, 'lonmax': 35, 'latmin': 35.0, 'latmax': 60.0} {'name': 'eur_extent', 'lonmin': -10.0, 'lonmax': 35, 'latmin': 35.0, 'latmax': 60.0}
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
30 30
31 31
32 32
33 33
34 34
35 35
36 36
37 37
38 38
39 39
40 40
41 41
42 42
43 43
44 44
45 45
46 46
47 47
48 48
49 49
50 50
51 51
52 52
53 53
54 54
55 55
56 56
57 57
58 58
59 59
60 60
61 61
62 62
63 63
64 64
65 65
66 66
67 67
68 68
69 69
70 70
71 71
72 72
73 73
74 74
75 75
76 76
77 77
78 78
79 79
80 80
81 81
82 82
83 83
84 84
85 85
86 86
87 87
88 88
89 89
90 90
91 91
92 92
93 93
94 94
95 95
96 96
97 97
98 98
99 99
100 100
101 101
102 102
103 103
104 104
105 105
106 106
107 107
108 108
109 109
110 110
111 111
112 112
113 113
114 114
115 115
116 116
117 117
118 118
119 119
120 120
121 121
122 122
123 123
124 124
125 125
126 126
127 127
128 128
129 129
130 130
131 131
132 132
133 133
134 134
135 135
136 136
137 137
138 138
139 139
140 140
141 141
142 142
143 143
144 144
145 145
146 146
147 147
148 148
149 149
150 150
151 151
152 152
153 153
154 154
155 155
156 156
157 157
158 158
159 159
160 160
161 161
162 162
163 163
164 164
165 165
166 166
167 167
168 168
169 169
170 170
171 171
172 172
173 173
174 174
175 175
176 176
177 177
178 178
179 179
180 180
181 181
182 182
183 183
184 184
185 185
186 186
187 187
188 188
189 189
190 190
191 191
192 192
193 193
194 194
195 195
196 196
197 197
198 198
199 199
200 200
201 201
202 202
203 203
204 204
205 205
206 206
207 207
208 208
209 209
210 210
211 211
212 212
213 213
214 214
215 215
216 216
217 217
218 218
219 219
220 220
221 221
222 222
223 223
224 224
225 225
226 226
227 227
228 228
229 229
230 230
231 231
232 232
233 233
234 234
235 235
236 236
237 237
238 238
239 239
240 240
241 241
242 242
243 243
244 244
245 245
246 246
247 247
248 248
249 249
250 250
251 251
252 252
253 253
254 254
255 255
256 256
257 257
258 258
259 259
260 260
261 261
262 262
263 263
264 264
265 265
266 266
267 267
268 268
269 269
270 270
271 271
272 272
273 273
274 274
275 275
276 276
277 277
278 278
279 279
280 280
281 281
282 282
283 283
284 284
285 285
286 286
287 287
288 288
289 289
290 290
291 291
292 292
293 293
294 294
295 295
296 296
297 297
298 298
299 299
300 300
301 301
302 302
303 303
304 304
305 305
306 306
307 307
308 308
309 309
310 310
311 311
312 312
313 313
314 314
315 315
316 316
317 317
318 318
319 319
320 320
321 321
322 322
323 323
324 324
325 325
326 326
327 327
328 328
329 329
330 330
331 331
332 332
333 333
334 334
335 335
336 336
337 337
338 338
339 339
340 340
341 341
342 342
343 343
344 344
345 345
346 346
347 347
348 348
349 349
350 350
351 351
352 352
353 353
354 354
355 355
356 356
357 357
358 358
359 359
360 360
361 361
362 362
363 363
364 364
365 365
366 366
367 367
368 368
369 369
370 370
371 371
372 372
373 373
374 374
375 375
376 376
377 377
378 378
379 379
380 380
381 381
382 382
383 383
384 384
385 385
386 386
387 387
388 388
389 389
390 390
391 391
392 392
393 393
394 394
395 395
396 396
397 397
398 398
399 399
400 400
401 401
402 402
403 403
404 404
405 405
406 406
407 407
408 408
409 409
410 410
411 411
412 412
413 413
414 414
415 415
416 416
417 417
418 418
419 419
420 420
421 421
422 422
423 423
424 424
425 425
426 426
427 427
428 428
429 429
430 430
431 431
432 432
433 433
434 434
435 435
436 436
437 437
438 438
439 439
440 440
441 441
442 442
443 443
444 444
445 445
446 446
447 447
448 448
449 449
450 450
451 451
452 452
453 453
454 454
455 455
456 456
457 457
458 458
459 459
460 460
461 461
462 462
463 463
464 464
465 465
466 466
467 467
468 468
469 469
470 470
471 471
472 472
473 473
474 474
475 475
476 476
477 477
478 478
479 479
480 480
481 481
482 482
483 483
{'name': 'povalley_extent', 'lonmin': 7.0, 'lonmax': 13.0, 'latmin': 44.0, 'latmax': 47.0} {'name': 'povalley_extent', 'lonmin': 7.0, 'lonmax': 13.0, 'latmin': 44.0, 'latmax': 47.0}
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
30 30
31 31
32 32
33 33
34 34
35 35
36 36
37 37
38 38
39 39
40 40
41 41
42 42
43 43
44 44
45 45
46 46
47 47
48 48
49 49
50 50
51 51
52 52
53 53
54 54
55 55
56 56
57 57
58 58
59 59
60 60
61 61
62 62
63 63
64 64
65 65
66 66
67 67
68 68
69 69
70 70
71 71
72 72
73 73
74 74
75 75
76 76
77 77
78 78
79 79
80 80
81 81
82 82
83 83
84 84
85 85
86 86
87 87
88 88
89 89
90 90
91 91
92 92
93 93
94 94
95 95
96 96
97 97
98 98
99 99
100 100
101 101
102 102
103 103
104 104
105 105
106 106
107 107
108 108
109 109
110 110
111 111
112 112
113 113
114 114
115 115
116 116
117 117
118 118
119 119
120 120
121 121
122 122
123 123
124 124
125 125
126 126
127 127
128 128
129 129
130 130
131 131
132 132
133 133
134 134
135 135
136 136
137 137
138 138
139 139
140 140
141 141
142 142
143 143
144 144
145 145
146 146
147 147
148 148
149 149
150 150
151 151
152 152
153 153
154 154
155 155
156 156
157 157
158 158
159 159
160 160
161 161
162 162
163 163
164 164
165 165
166 166
167 167
168 168
169 169
170 170
171 171
172 172
173 173
174 174
175 175
176 176
177 177
178 178
179 179
180 180
181 181
182 182
183 183
184 184
185 185
186 186
187 187
188 188
189 189
190 190
191 191
192 192
193 193
194 194
195 195
196 196
197 197
198 198
199 199
200 200
201 201
202 202
203 203
204 204
205 205
206 206
207 207
208 208
209 209
210 210
211 211
212 212
213 213
214 214
215 215
216 216
217 217
218 218
219 219
220 220
221 221
222 222
223 223
224 224
225 225
226 226
227 227
228 228
229 229
230 230
231 231
232 232
233 233
234 234
235 235
236 236
237 237
238 238
239 239
240 240
241 241
242 242
243 243
244 244
245 245
246 246
247 247
248 248
249 249
250 250
251 251
252 252
253 253
254 254
255 255
256 256
257 257
258 258
259 259
260 260
261 261
262 262
263 263
264 264
265 265
266 266
267 267
268 268
269 269
270 270
271 271
272 272
273 273
274 274
275 275
276 276
277 277
278 278
279 279
280 280
281 281
282 282
283 283
284 284
285 285
286 286
287 287
288 288
289 289
290 290
291 291
292 292
293 293
294 294
295 295
296 296
297 297
298 298
299 299
300 300
301 301
302 302
303 303
304 304
305 305
306 306
307 307
308 308
309 309
310 310
311 311
312 312
313 313
314 314
315 315
316 316
317 317
318 318
319 319
320 320
321 321
322 322
323 323
324 324
325 325
326 326
327 327
328 328
329 329
330 330
331 331
332 332
333 333
334 334
335 335
336 336
337 337
338 338
339 339
340 340
341 341
342 342
343 343
344 344
345 345
346 346
347 347
348 348
349 349
350 350
351 351
352 352
353 353
354 354
355 355
356 356
357 357
358 358
359 359
360 360
361 361
362 362
363 363
364 364
365 365
366 366
367 367
368 368
369 369
370 370
371 371
372 372
373 373
374 374
375 375
376 376
377 377
378 378
379 379
380 380
381 381
382 382
383 383
384 384
385 385
386 386
387 387
388 388
389 389
390 390
391 391
392 392
393 393
394 394
395 395
396 396
397 397
398 398
399 399
400 400
401 401
402 402
403 403
404 404
405 405
406 406
407 407
408 408
409 409
410 410
411 411
412 412
413 413
414 414
415 415
416 416
417 417
418 418
419 419
420 420
421 421
422 422
423 423
424 424
425 425
426 426
427 427
428 428
429 429
430 430
431 431
432 432
433 433
434 434
435 435
436 436
437 437
438 438
439 439
440 440
441 441
442 442
443 443
444 444
445 445
446 446
447 447
448 448
449 449
450 450
451 451
452 452
453 453
454 454
455 455
456 456
457 457
458 458
459 459
460 460
461 461
462 462
463 463
464 464
465 465
466 466
467 467
468 468
469 469
470 470
471 471
472 472
473 473
474 474
475 475
476 476
477 477
478 478
479 479
480 480
481 481
482 482
483 483
{'name': 'hubei_extent', 'lonmin': 108.3, 'lonmax': 116.1, 'latmin': 29.1, 'latmax': 33.3} {'name': 'hubei_extent', 'lonmin': 108.3, 'lonmax': 116.1, 'latmin': 29.1, 'latmax': 33.3}
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
30 30
31 31
32 32
33 33
34 34
35 35
36 36
37 37
38 38
39 39
40 40
41 41
42 42
43 43
44 44
45 45
46 46
47 47
48 48
49 49
50 50
51 51
52 52
53 53
54 54
55 55
56 56
57 57
58 58
59 59
60 60
61 61
62 62
63 63
64 64
65 65
66 66
67 67
68 68
69 69
70 70
71 71
72 72
73 73
74 74
75 75
76 76
77 77
78 78
79 79
80 80
81 81
82 82
83 83
84 84
85 85
86 86
87 87
88 88
89 89
90 90
91 91
92 92
93 93
94 94
95 95
96 96
97 97
98 98
99 99
100 100
101 101
102 102
103 103
104 104
105 105
106 106
107 107
108 108
109 109
110 110
111 111
112 112
113 113
114 114
115 115
116 116
117 117
118 118
119 119
120 120
121 121
122 122
123 123
124 124
125 125
126 126
127 127
128 128
129 129
130 130
131 131
132 132
133 133
134 134
135 135
136 136
137 137
138 138
139 139
140 140
141 141
142 142
143 143
144 144
145 145
146 146
147 147
148 148
149 149
150 150
151 151
152 152
153 153
154 154
155 155
156 156
157 157
158 158
159 159
160 160
161 161
162 162
163 163
164 164
165 165
166 166
167 167
168 168
169 169
170 170
171 171
172 172
173 173
174 174
175 175
176 176
177 177
178 178
179 179
181 181
182 182
183 183
184 184
185 185
186 186
187 187
188 188
189 189
190 190
191 191
192 192
193 193
194 194
195 195
196 196
197 197
198 198
199 199
200 200
201 201
202 202
203 203
204 204
205 205
206 206
207 207
208 208
209 209
210 210
211 211
212 212
213 213
214 214
215 215
216 216
217 217
218 218
219 219
220 220
221 221
222 222
223 223
224 224
225 225
226 226
227 227
228 228
229 229
230 230
231 231
232 232
233 233
234 234
235 235
236 236
237 237
238 238
239 239
240 240
241 241
242 242
243 243
244 244
245 245
246 246
247 247
248 248
249 249
250 250
251 251
252 252
253 253
254 254
255 255
256 256
257 257
258 258
259 259
260 260
261 261
262 262
263 263
264 264
265 265
266 266
267 267
268 268
269 269
270 270
271 271
272 272
273 273
274 274
275 275
276 276
277 277
278 278
279 279
280 280
281 281
282 282
283 283
284 284
285 285
286 286
287 287
288 288
289 289
290 290
291 291
292 292
293 293
294 294
295 295
296 296
297 297
298 298
299 299
300 300
301 301
302 302
303 303
304 304
305 305
306 306
307 307
308 308
309 309
310 310
311 311
312 312
313 313
314 314
315 315
316 316
317 317
318 318
319 319
320 320
321 321
322 322
323 323
324 324
325 325
326 326
327 327
328 328
329 329
330 330
331 331
332 332
333 333
334 334
335 335
336 336
337 337
338 338
339 339
340 340
341 341
342 342
343 343
344 344
345 345
346 346
347 347
348 348
349 349
350 350
351 351
352 352
353 353
354 354
355 355
356 356
357 357
358 358
359 359
360 360
361 361
362 362
363 363
364 364
365 365
366 366
367 367
368 368
369 369
370 370
371 371
372 372
373 373
374 374
375 375
376 376
377 377
378 378
379 379
380 380
381 381
382 382
383 383
384 384
385 385
386 386
387 387
388 388
389 389
390 390
391 391
392 392
393 393
394 394
395 395
396 396
397 397
398 398
399 399
400 400
401 401
402 402
403 403
404 404
405 405
406 406
407 407
408 408
409 409
410 410
411 411
412 412
413 413
414 414
415 415
416 416
417 417
418 418
419 419
420 420
421 421
422 422
423 423
424 424
425 425
426 426
427 427
428 428
429 429
430 430
431 431
432 432
433 433
434 434
435 435
436 436
437 437
438 438
439 439
440 440
441 441
442 442
443 443
444 444
445 445
446 446
447 447
448 448
449 449
450 450
451 451
452 452
453 453
454 454
455 455
456 456
457 457
458 458
459 459
460 460
461 461
462 462
463 463
464 464
465 465
466 466
467 467
468 468
469 469
470 470
471 471
472 472
473 473
474 474
475 475
476 476
477 477
478 478
479 479
480 480
481 481
482 482
483 483
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
#### Save time-series dictionary as JSON file #### Save time-series dictionary as JSON file
   
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
   
Save the dictionary with daily average tropospheric NO<sub>2</sub> values for each region as `JSON` file. You can use the function `json.dump()` to store a dictionary as `JSON`. Save the dictionary with daily average tropospheric NO<sub>2</sub> values for each region as `JSON` file. You can use the function `json.dump()` to store a dictionary as `JSON`.
   
%% Cell type:code id: tags: %% Cell type:code id: tags: