O3as: Ozone assessment service’s documentation

O3as is a service within the framework of the European Open Science Cloud - Synergy (EOSC-Synergy) project, mainly for scientists working on the Chemistry-Climate Model Initiative (CCMI) for the quadrennial global assessment of ozone depletion due in 2022.

The O3as service shall provide an invaluable tool to extract ozone trends from large climate prediction model data to produce figures of stratospheric ozone trends in publication quality, in a coherent way.

Ozone introduction

This introduces you to ozone science: why ozone is important for our everyday life, what is ozone assessment. We present then our O3as service, how it can be used for simple analysis and a more advanced one. In the advanced section we show the underlying software technologies we are using.

Role of ozone for our life

The ozone layer shields life on Earth

The ozone layer in the stratosphere shields life on Earth from most UV-B and UV-C, the most harmful varieties of ultraviolet radiation. Credit: NASA

Ozone is a trace gas in the Earth’s atmosphere, that means that it only occurs in very small quantities on Earth. Trace gases are gases that are not nitrogen (78.1%), oxygen (20.9%) or argon (0.934%), i.e. they make up only about 0.066% of the atmosphere (not including water which makes up about 4%). If all the ozone were compressed to the pressure at the Earth’s surface (at 1013 hPa and 0°C) then the atmospheric content of ozone would make up a layer of 3 mm (which is equivalent to 300 Dobson Units (DU)). The highest content of ozone is found in the stratosphere at a height of about 25 to 30 km where the concentrations are about 10 parts per million parts of air (ppm), i.e. 0.001%.

The ozone present in the stratosphere at about 25 to 30 km is what makes up most ozone in the atmosphere. This ozone is important for life on planet Earth because it is responsible for removing most of the harmful ultraviolet (UV) radiation from the Sun. The longwave UV-A radiation (about 315–400 nm) is not absorbed, medium range UV-B radiation (about 280–315 nm) is mostly absorbed and the most dangerous shortwave UV-C radiation (about 100–280 nm) is totally absorbed by the ozone layer. A decrease in the ozone layer increases the amount of UV-B radiation reaching the Earth’s surface and the risk of skin cancer. Since UV radiation not only has an effect of the health of human beings it also has an effect on vegetation it is important to monitor stratospheric ozone.

Ozone hole and ozone assessment

With support of the World Meteorological Organization (WMO), the United Nations Environment Programme (UNEP), NASA, NOAA, and the European Commission periodic assessments of the state of ozone in the stratosphere are produced. Monitoring and the assessment of stratospheric ozone was started after the discovery of the ozone hole in the early eighties. Realizing that the decline of stratospheric ozone was due to harmful ozone destroying substances (ODSs) consisting of chlorofluorocarbons (CFCs) and hydrochlorofluorocarbons (HCFCs) the Montreal protocol (1987) and successor protocols were established to gradually curb the production of ODSs. The first assessment of the state of ozone was published in 1985, since 1994 they appear quadrennially.

Ozone simulations and observations (e.g. CCMI, SBUV etc)

There is a huge effort to predict the future development of stratospheric ozone under different scenarios. These scenarios are modelled in different groups with different model setups/different boundary/initial conditions. In order to get a robust prediction many different model runs can be combined into ensembles. Model runs of total ozone often don’t have same absolute values and are therefore normalized using satellite observations of ozone data. A date can then be picked at which the ozone of all the models agrees with the measured ozone. Only then they can be compared. For a more robust prediction of the behaviour of future ozone an average of all the model realizations can be produced to make a multi model mean so that a more robust prediction can be made.

Total Column Ozone, zonal mean

Total Column Ozone, zonal mean

Total column ozone time series for Antarctic in October from 19 individual CCMs for the REF-C2 simulations with respect to mean 1980–1984 observations. The dashed black line indicates 1980 reference value. Credit: S.S. Dhomse et al., Atmos. Chem. Phys., 18, 8409–8438, 2018

The model results for the ozone data can come in different units, like volume or mass mixing ratios, partial pressure, number densities or ozone density. Those units can be converted into each other:

Conversions of ozone volume mixing ratio (vmr) into common other units:

The volume mixing ratio is given in ppmv (parts per million, 10-6,) pressure in hPa and temperature in K, then:

  • Ozone partial pressure pO3 [nbar]:

pO3 = vmrO3 × pressure

  • Ozone density ρO3[μg/m3]:

ρO3 = vmrO3 × 577.3 × pressure / temperature

  • Ozone mass mixing ratio mO3 [μg/g]:

mO3 = vmrO3 × 1.66 (mol_m_O3/mol_m_air = 48/28.9)

  • Ozone number density NO3 [molecules/cm3]:

NO3 = vmrO3 × pressure / (1.38 × 10-19 × temperature)

Also all these units can be converted to ozone volume mixing ratio (vmr) can be converted by inverting the above equations: The volume mixing ratio is given in ppmv, pressure in hPa and temperature in K.

  • Ozone partial pressure pO3 [nbar]:

vmrO3 = pO3 / pressure

  • Ozone density ρO3 [μg/m3]:

vmrO3 = ρO3 × 1.7322 × 10-3 × temperature / pressure

  • Ozone mass mixing ratio mO3 [μg/g]:

vmrO3 = mO3 × 0.602

  • Ozone number density NO3 [molecules/cm3]:

vmrO3 = NO3 × 1.38 × 10-19 × temperature / pressure

(http://www.meteo.mcgill.ca/hydroxyl/wiki/doku.php?id=ozone from Thilo Erbertseder, Frank Baier, last modified: October 2005)

Once ozone number density values are calculated, the values can be integrated over all heights to get a total column of ozone. Often the integration is done only partially either over the heights in the troposphere (from the ground to the tropopause) to get a tropospheric partial column of ozone or over the heights of the stratosphere (from the tropopause to the top of the atmosphere) to get a stratospheric partial column. The unit most often used for the column values of ozone is the Dobson unit:

  • 1 Dobson Unit (DU) is:

2.6867 × 10+20 molecules per square meter

4.4615 × 10-04 mol per square meter

2.1415 × 10-05 kilogram of ozone per square meter

Also, a Dobson Unit can also be seen as a measurement of thickness of the ozone column: A typical column amount of 300 DU of atmospheric ozone corresponds to a 3 mm layer of pure gas at the surface of the Earth.

It can be seen that the integration over altitude in m could be done over those other units (mol, kg) as well, instead of only the number densities.

Often we deal with large data sets. Since we are interested mainly in the latitudinal distribution of ozone zonally (E-W direction) averaged values of ozone can be used.

Now we have reduced the 4 dimensional dataset (time, latitude, longitude and altitude) into a two dimensional dataset (time, latitude) by first integrating over the altitudes and then taking the zonal mean across the longitudes. Of these values time series can be plotted to see the trend in future ozone over different latitude bands.

Total Column Ozone, Return years

Total Column Ozone, return years

Estimated MMM1S return dates (red triangles) of total column ozone from the SEN-C2-fCH4 simulations for different latitude bands. Credit: S.S. Dhomse et al., Supplement of Atmos. Chem. Phys., 18, 8409–8438, 2018

As mentioned in the previous section, the time series of total column ozone (zonally averaged) can be normalized using satellite observations of ozone data. Usually a year before the decline of ozone in the 1980s is used for the normalization. If the year 1980 is taken, then we use the measurements of the ozone column and move all the model time series up or down so that they pass through the point of measurement. Since ozone has been decreasing from that point and has slowly recovered and is rising again, we are able to check when in the future ozone will be at the same level as in 1980 again. Having done this we can plot the time of ozone returning to 1980 level for each model and for different seasons/months/latitude bands.

Quizzes about Ozone Science

Quiz: Ozone Introduction

  1. Why is stratospheric ozone important for life on Earth?

  2. How much ozone is present in the Earth’s atmosphere?

  3. What happened in the seventies that was discovered in the early eighties?

  4. What was done to reduce the destruction of ozone?

  5. What is done to publicize the state of ozone every four years?

Quiz: Total Column Ozone

  1. What is the difference between a total column and a partial column of ozone?

  2. What is a Dobson Unit?

  3. How do you get from a data field of volume mixing ratios (latitude, longitude, height) into a total column? What steps are necessary?

  4. What is a zonal mean?

  5. Why would one use a multi model mean?

  6. What is ozone return?

  7. How can models be compared that have totally different values (offsets) from each other?

Wanna cross-check your answers? Have a look here

O3as Project

Motivation

Monitoring and projecting stratospheric ozone is mandated by UN Environment to safeguard a healthy planet. Regularly many climate models project future climate and ozone change, producing huge amounts of data that have to be analysed for key metrics. Those key metrics help policy makers to judge if measures implemented to protect the stratospheric ozone layer are working.

Project goals

To provide a framework to efficiently explore ozone projections, including the calculation of key metrics:

  • Improve the existing workflow and provide a reliable tool for scientists to perform analysis in a more efficient manner

  • Ensure reproducibility of results

  • Simplify data access and the use

  • Publish high-level data to citizens

Problem to solve

  • A typical workflow of today has many manual steps

  • Full processing from raw data takes hours

  • The code is not always accessible or well maintained

Consequences:
=> Plots are not easy to rebuild for various inputs
=> Possible inconsistency in results
=> No-way to assess the results by non-specialists

O3as solution

O3as service general structure

O3as service general structure

  • Climate Models data (10’s TB) are collected in one place (Large Scale Data Facility, LSDF at KIT)

  • The data are reduced to the parameters of interest and homogenized at HPC by the means of o3skim component

  • The reduced data (100’s MB) can be accessed with the REST API in seconds (o3api component)

  • A user may do final processing and plotting by leveraging the WebApp (o3webapp to come)

All components are open source (GPLv3), documented, implemented with continuous integration and delivery (CI/CD) based on Jenkins (JePL), and dockerised: o3skim is run via udocker in HPC, o3api and o3webapp are in the cloud (Kubernetes cluster).

Getting Started

  1. Main entry point to our service is https://o3as.data.kit.edu. There you find a general information about the service and links to corresponding resources like this documentation site, git repository, docker hub organization etc.

    Note

    O3as Service is also offered via the EOSC Marketplace.

  2. From the main website (https://o3as.data.kit.edu) you access our WebApp for a user-friendly communication with the service (to come) and O3as REST API for a programmatic usage of the service.

  3. By using our service you agree to the Terms of Use.

    Important

    Once your ozone plots are produced, please, respect data policies, references and acknowledgments for the O3as service and original data.

  4. In the case of questions, suggestions, or for any feedback, please contact us.

Tutorials

How to use API

How to use API (command line)

Introduction

This HowTo demonstrates basic communication with the O3as API by using cURL tool. Though cURL is a command-line tool, libcurl library is implemented in many programming languages (e.g. pycurl for Python). The examples below could also help understanding how the API calls can be implemented in your program using other means (e.g. urllib in Python).

Note

O3as API is based on the Open API 3 and Swagger, which provides Swagger UI, visual documentation allowing to interact with the API in a friendly way via web. The O3AS API Swagger UI webpage is accessible at https://api.o3as.fedcloud.eu/api/v1/ui/.

Tip

For the complete description of the REST API, please, check O3API Endpoints and https://api.o3as.fedcloud.eu/api/v1/ui/.

Info about available models
Get list of all available models
curl -X 'GET' 'https://api.o3as.fedcloud.eu/api/v1/models' -H 'accept: application/json'
List models with a certain pattern

e.g select models with ‘refC2’ in the name:

curl -X 'GET' \
'https://api.o3as.fedcloud.eu/api/v1/models?select=refc2' \
-H 'accept: application/json'
Get information about a particular model

e.g. about CCMI-1_ACCESS_ACCESS-CCM-refC2:

curl -X 'GET' \
'https://api.o3as.fedcloud.eu/api/v1/models/CCMI-1_ACCESS_ACCESS-CCM-refC2' \
-H 'accept: application/json'
Get default plot styles of selected models

e.g for CCMI-1_ACCESS_ACCESS-CCM-refC2, CCMI-1_CCCma_CMAM-refC2, CCMI-1_CHASER-MIROC-ESM-refC2

curl -X 'POST' \
  'https://api.o3as.fedcloud.eu/api/v1/models/plotstyle' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '[
  "CCMI-1_ACCESS_ACCESS-CCM-refC2",
  "CCMI-1_CCCma_CMAM-refC2",
  "CCMI-1_CHASER-MIROC-ESM-refC2"
]'
Creating plots
Get list of possible plots
curl -X 'GET' \
  'https://api.o3as.fedcloud.eu/api/v1/plots' \
  -H 'accept: application/json'
Create tco3_zm plot

This example shows how to retrieve a total column ozone (zonal mean) figure either in PDF or JSON format. The query parameters used in the example are shown in the table below.

Tip

For the explanation of parameters, please, check O3API Endpoints

Table: Query parameters to create a tco3_zm plot (in bold are required parameters)

Query parameter

Value

begin

1959

end

2100

month

[9,10,11]

lat_min

-90

lat_max

90

ref_meas

SBUV_GSFC_merged-SAT-ozone

ref_year

1980

Request body (for the list of models)

e.g. all refC2 models

Example for PDF (tco3_zm.pdf is created)
curl -o tco3_zm.pdf -X 'POST' \
  'https://api.o3as.fedcloud.eu/api/v1/plots/tco3_zm?begin=1959&end=2100&month=9,10,11&lat_min=-90&lat_max=90&ref_meas=SBUV_GSFC_merged-SAT-ozone&ref_year=1980' \
  -H 'accept: application/pdf' \
  -H 'Content-Type: application/json' \
  -d '[
"CCMI-1_ACCESS_ACCESS-CCM-refC2",
"CCMI-1_CCCma_CMAM-refC2",
"CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1",
"CCMI-1_CESM1-WACCM_refC2_r1i1p1",
"CCMI-1_CESM1-WACCM_refC2_r2i1p1",
"CCMI-1_CESM1-WACCM_refC2_r3i1p1",
"CCMI-1_CHASER-MIROC-ESM-refC2",
"CCMI-1_CNRM-CERFACS_CNRM-CM5-3-refC2",
"CCMI-1_CNRM-CERFACS_MOCAGE-refC2",
"CCMI-1_ETH-PMOD_SOCOL3-refC2",
"CCMI-1_GSFC_GEOSCCM-refC2",
"CCMI-1_MESSy_EMAC-L90MA-refC2",
"CCMI-1_MOHC_HadGEM3-ES-refC2",
"CCMI-1_MRI_ESM1r1-refC2",
"CCMI-1_NIES_CCSRNIES-MIROC3.2-refC2",
"CCMI-1_NIWA_NIWA-UKCA-refC2",
"CCMI-1_U-CAMBRIDGE_UMUKCA-UCAM-refC2",
"CCMI-1_U-LAQUILA_CCM-refC2",
"CCMI-1_U-LEEDS_UMSLIMCAT-refC2"
]'
Example for JSON (tco3_zm.json is created)
curl -o tco3_zm.json -X 'POST' \
  'https://api.o3as.fedcloud.eu/api/v1/plots/tco3_zm?begin=1959&end=2100&month=9,10,11&lat_min=-90&lat_max=90&ref_meas=SBUV_GSFC_merged-SAT-ozone&ref_year=1980' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '[
"CCMI-1_ACCESS_ACCESS-CCM-refC2",
"CCMI-1_CCCma_CMAM-refC2",
"CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1",
"CCMI-1_CESM1-WACCM_refC2_r1i1p1",
"CCMI-1_CESM1-WACCM_refC2_r2i1p1",
"CCMI-1_CESM1-WACCM_refC2_r3i1p1",
"CCMI-1_CHASER-MIROC-ESM-refC2",
"CCMI-1_CNRM-CERFACS_CNRM-CM5-3-refC2",
"CCMI-1_CNRM-CERFACS_MOCAGE-refC2",
"CCMI-1_ETH-PMOD_SOCOL3-refC2",
"CCMI-1_GSFC_GEOSCCM-refC2",
"CCMI-1_MESSy_EMAC-L90MA-refC2",
"CCMI-1_MOHC_HadGEM3-ES-refC2",
"CCMI-1_MRI_ESM1r1-refC2",
"CCMI-1_NIES_CCSRNIES-MIROC3.2-refC2",
"CCMI-1_NIWA_NIWA-UKCA-refC2",
"CCMI-1_U-CAMBRIDGE_UMUKCA-UCAM-refC2",
"CCMI-1_U-LAQUILA_CCM-refC2",
"CCMI-1_U-LEEDS_UMSLIMCAT-refC2"
]'
Create tco3_return plot

The example shows how to retrieve a total column ozone (return years) figure either in PDF or JSON format. The query parameters used in the example are shown in the table below.

Tip

For the explanation of parameters, please, check O3API Endpoints

Table: Query parameters to create a tco3_return plot (in bold are required parameters)

Query parameter

Value

month

[9,10,11]

lat_min

-90

lat_max

90

ref_meas

SBUV_GSFC_merged-SAT-ozone

ref_year

1980

Request body (for the list of models)

e.g. all refC2 models

Example for PDF (tco3_return.pdf is created)
curl  -o tco3_return.pdf -X 'POST' \
  'https://api.o3as.fedcloud.eu/api/v1/plots/tco3_return?month=9,10,11&lat_min=-90&lat_max=90&ref_meas=SBUV_GSFC_merged-SAT-ozone&ref_year=1980' \
  -H 'accept: application/pdf' \
  -H 'Content-Type: application/json' \
  -d '[
"CCMI-1_ACCESS_ACCESS-CCM-refC2",
"CCMI-1_CCCma_CMAM-refC2",
"CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1",
"CCMI-1_CESM1-WACCM_refC2_r1i1p1",
"CCMI-1_CESM1-WACCM_refC2_r2i1p1",
"CCMI-1_CESM1-WACCM_refC2_r3i1p1",
"CCMI-1_CHASER-MIROC-ESM-refC2",
"CCMI-1_CNRM-CERFACS_CNRM-CM5-3-refC2",
"CCMI-1_CNRM-CERFACS_MOCAGE-refC2",
"CCMI-1_ETH-PMOD_SOCOL3-refC2",
"CCMI-1_GSFC_GEOSCCM-refC2",
"CCMI-1_MESSy_EMAC-L90MA-refC2",
"CCMI-1_MOHC_HadGEM3-ES-refC2",
"CCMI-1_MRI_ESM1r1-refC2",
"CCMI-1_NIES_CCSRNIES-MIROC3.2-refC2",
"CCMI-1_NIWA_NIWA-UKCA-refC2",
"CCMI-1_U-CAMBRIDGE_UMUKCA-UCAM-refC2",
"CCMI-1_U-LAQUILA_CCM-refC2",
"CCMI-1_U-LEEDS_UMSLIMCAT-refC2"
]'
Example for JSON (tco3_return.json is created)
curl  -o tco3_return.json -X 'POST' \
  'https://api.o3as.fedcloud.eu/api/v1/plots/tco3_return?month=9,10,11&lat_min=-90&lat_max=90&ref_meas=SBUV_GSFC_merged-SAT-ozone&ref_year=1980' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '[
"CCMI-1_ACCESS_ACCESS-CCM-refC2",
"CCMI-1_CCCma_CMAM-refC2",
"CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1",
"CCMI-1_CESM1-WACCM_refC2_r1i1p1",
"CCMI-1_CESM1-WACCM_refC2_r2i1p1",
"CCMI-1_CESM1-WACCM_refC2_r3i1p1",
"CCMI-1_CHASER-MIROC-ESM-refC2",
"CCMI-1_CNRM-CERFACS_CNRM-CM5-3-refC2",
"CCMI-1_CNRM-CERFACS_MOCAGE-refC2",
"CCMI-1_ETH-PMOD_SOCOL3-refC2",
"CCMI-1_GSFC_GEOSCCM-refC2",
"CCMI-1_MESSy_EMAC-L90MA-refC2",
"CCMI-1_MOHC_HadGEM3-ES-refC2",
"CCMI-1_MRI_ESM1r1-refC2",
"CCMI-1_NIES_CCSRNIES-MIROC3.2-refC2",
"CCMI-1_NIWA_NIWA-UKCA-refC2",
"CCMI-1_U-CAMBRIDGE_UMUKCA-UCAM-refC2",
"CCMI-1_U-LAQUILA_CCM-refC2",
"CCMI-1_U-LEEDS_UMSLIMCAT-refC2"
]'
Info on skimmed data

o3skim component produces skimmed data which are further processed by the o3api to build plots for the Ozone assessment (e.g. total column ozone (zonal mean) and total column ozone (return years)).

Get list of plot types with the available skimmed data
curl -X 'GET' 'https://api.o3as.fedcloud.eu/api/v1/data' -H 'accept: application/json'
Get skimmed data used to build tco3_zm plot

Tip

For the explanation of parameters, please, check O3API Endpoints

Table: Query parameters for retrieving skimmed data used to build a tco3_zm plot (in bold are required parameters)

Query parameter

Value

begin

1959

end

2100

month

[9,10,11]

lat_min

-90

lat_max

90

Request body (for the list of models)

e.g. all refC2 models

tco3_zm_skimmed.json is created:

curl -o tco3_zm_skimmed.json -X 'POST' \
  'https://api.o3as.fedcloud.eu/api/v1/data/tco3_zm?begin=1959&end=2100&month=9,10,11&lat_min=-90&lat_max=90' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '[
"CCMI-1_ACCESS_ACCESS-CCM-refC2",
"CCMI-1_CCCma_CMAM-refC2",
"CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1",
"CCMI-1_CESM1-WACCM_refC2_r1i1p1",
"CCMI-1_CESM1-WACCM_refC2_r2i1p1",
"CCMI-1_CESM1-WACCM_refC2_r3i1p1",
"CCMI-1_CHASER-MIROC-ESM-refC2",
"CCMI-1_CNRM-CERFACS_CNRM-CM5-3-refC2",
"CCMI-1_CNRM-CERFACS_MOCAGE-refC2",
"CCMI-1_ETH-PMOD_SOCOL3-refC2",
"CCMI-1_GSFC_GEOSCCM-refC2",
"CCMI-1_MESSy_EMAC-L90MA-refC2",
"CCMI-1_MOHC_HadGEM3-ES-refC2",
"CCMI-1_MRI_ESM1r1-refC2",
"CCMI-1_NIES_CCSRNIES-MIROC3.2-refC2",
"CCMI-1_NIWA_NIWA-UKCA-refC2",
"CCMI-1_U-CAMBRIDGE_UMUKCA-UCAM-refC2",
"CCMI-1_U-LAQUILA_CCM-refC2",
"CCMI-1_U-LEEDS_UMSLIMCAT-refC2"
]'
Get skimmed data used to build tco3_return plot

Tip

For the explanation of parameters, please, check O3API Endpoints

Table: Query parameters for retrieving skimmed data used to build a tco3_return plot (in bold are required parameters)

Query parameter

Value

begin

1959

end

2100

month

[9,10,11]

lat_min

-90

lat_max

90

Request body (for the list of models)

e.g. all refC2 models

tco3_return_skimmed.json is created:

curl -o tco3_return_skimmed.json -X 'POST' \
  'https://api.o3as.fedcloud.eu/api/v1/data/tco3_return?begin=1959&end=2100&month=9,10,11&lat_min=-90&lat_max=90' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '[
"CCMI-1_ACCESS_ACCESS-CCM-refC2",
"CCMI-1_CCCma_CMAM-refC2",
"CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1",
"CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1",
"CCMI-1_CESM1-WACCM_refC2_r1i1p1",
"CCMI-1_CESM1-WACCM_refC2_r2i1p1",
"CCMI-1_CESM1-WACCM_refC2_r3i1p1",
"CCMI-1_CHASER-MIROC-ESM-refC2",
"CCMI-1_CNRM-CERFACS_CNRM-CM5-3-refC2",
"CCMI-1_CNRM-CERFACS_MOCAGE-refC2",
"CCMI-1_ETH-PMOD_SOCOL3-refC2",
"CCMI-1_GSFC_GEOSCCM-refC2",
"CCMI-1_MESSy_EMAC-L90MA-refC2",
"CCMI-1_MOHC_HadGEM3-ES-refC2",
"CCMI-1_MRI_ESM1r1-refC2",
"CCMI-1_NIES_CCSRNIES-MIROC3.2-refC2",
"CCMI-1_NIWA_NIWA-UKCA-refC2",
"CCMI-1_U-CAMBRIDGE_UMUKCA-UCAM-refC2",
"CCMI-1_U-LAQUILA_CCM-refC2",
"CCMI-1_U-LEEDS_UMSLIMCAT-refC2"
]'

How to retrieve tco3 plots (jupyter)

This tutorial shows how to use a Jupyter notebook to retrieve data points of either tco3_zm plot or tco3_return plot in the JSON format and plot them. The Jupyter notebook can be downloaded from here.

System installations

If necessary, install required libraries or python packages

[1]:
### If needed, install additional modules:
#!pip3 install pandas
#!pip3 install matplotlib
### interactive plotting in jupyterlab requires node.js (pip does not install it!!):
#!apt update && apt install -y nodejs
#!pip3 install ipympl
#!jupyter labextension install @jupyter-widgets/jupyterlab-manager
#!jupyter labextension install jupyter-matplotlib
#!jupyter nbextension enable --py widgetsnbextension
### DON'T FORGET TO RESTART JupyterLab !!
# start jupyterlab:
# jupyter lab --ip=0.0.0.0
Import necessary packages

In this tutorial we need the following python packages:

json - to decode JSON data

matplotlib - to plot the data

numpy and pandas - to manipulate the data

os - to manipulate URL paths

requests - to communicate with the O3as API and retrieve data

[2]:
import json
import matplotlib.style as mplstyle
mplstyle.use('fast')
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import requests
Define global variables

we set a few variables: e.g. the base URL of O3AS API and the default figure size

[3]:
# for interactive plot, may change to widget, if installed
%matplotlib inline

# Set default size of plots
plt.rcParams['figure.figsize'] = [12, 8]

# A few variables needed for every REST API call:
url_o3api = "http://api.o3as.fedcloud.eu/api/v1/"  # base URL of the O3as API
headers = {'Content-Type': 'application/json',
           'Accept': 'application/json'}

# Define Reference Measurement and Reference Year
refMeasurement = 'SBUV_GSFC_merged-SAT-ozone'
refYear = 1980
Retrieve the list of models

We will analyse refC2 models, therefore we first request the list of corresponding models via the REST API

[4]:
# Use '/models' API Endpoint, i.e. append "models" to the base url_o3api:
url_o3api_tco3_zm_models = os.path.join(url_o3api, "models")

# request the list of modesl from O3as API, select "refC2" models:
tco3_zm_models = requests.request("GET",
                                  url=url_o3api_tco3_zm_models,
                                  params={'select': 'refc2'},
                                  headers=headers).json()
print(tco3_zm_models)
['CCMI-1_ACCESS_ACCESS-CCM-refC2', 'CCMI-1_CCCma_CMAM-refC2', 'CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1', 'CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1', 'CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1', 'CCMI-1_CESM1-WACCM_refC2_r1i1p1', 'CCMI-1_CESM1-WACCM_refC2_r2i1p1', 'CCMI-1_CESM1-WACCM_refC2_r3i1p1', 'CCMI-1_CHASER-MIROC-ESM-refC2', 'CCMI-1_CNRM-CERFACS_CNRM-CM5-3-refC2', 'CCMI-1_CNRM-CERFACS_MOCAGE-refC2', 'CCMI-1_ETH-PMOD_SOCOL3-refC2', 'CCMI-1_GSFC_GEOSCCM-refC2', 'CCMI-1_MESSy_EMAC-L90MA-refC2', 'CCMI-1_MOHC_HadGEM3-ES-refC2', 'CCMI-1_MRI_ESM1r1-refC2', 'CCMI-1_NIES_CCSRNIES-MIROC3.2-refC2', 'CCMI-1_NIWA_NIWA-UKCA-refC2', 'CCMI-1_U-CAMBRIDGE_UMUKCA-UCAM-refC2', 'CCMI-1_U-LAQUILA_CCM-refC2', 'CCMI-1_U-LEEDS_UMSLIMCAT-refC2']

We also add a reference measurement, refMeasurement (defined above in the Global Variables, e.g. SBUV_GSFC_merged-SAT-ozone), to the list of models to be plotted

[5]:
tco3_zm_models.append(refMeasurement)
Request points of the tco3_zm plot
  1. we configure parameters of interest to get the plot. In the example we specify that we want a plot for:

  • Range of years: (1960, 2100)

  • month: September, October, November

  • South Hemisphere (SH, latitudes: -90, -60)

  • reference measurement: refMeasurement (e.g. SBUV_GSFC_merged-SAT-ozone)

  • reference year: refYear (e.g. 1980, see Global Variables)

[6]:
# initialize an empty dictionary
kwargs_tco3_zm = {}

# Build kwargs with tco3_zm parameters for O3as API.
# Keys have to correspond to expected by the API keys!

kwargs_tco3_zm = {
    'begin'   : 1960,
    'end'     : 2100,
    'month'   : '9,10,11',
    'lat_min' : -90,
    'lat_max' : -60,
    'ref_meas': refMeasurement,
    'ref_year': refYear
}
  1. We want to retrieve “tco3_zm” plot: we use ‘/plots’ endpoint, plot type ‘tco3_zm’, therefore we append ‘plots/tco3_zm’ to the base URL of the O3as API

  2. Then we retrieve tco3_zm plot data for the parameters of interest and the list of refC2 models defined above

[7]:
# Build the API URL, use /plots/tco3_zm endpoint:
url_o3api_plot_tco3_zm = os.path.join(url_o3api, "plots/tco3_zm")

# Request data
response = requests.request("POST",
                            url=url_o3api_plot_tco3_zm,
                            params=kwargs_tco3_zm,
                            headers=headers,
                            data=json.dumps(tco3_zm_models))
# print(response.request.url)  # uncomment if you like to see the API call
# print(response.request.body) # uncomment if you like to see the API call Request Body

# Read the status_code. Normal response => 200
print(response.status_code)
tco3_zm_data = response.json()
print(tco3_zm_data[:5])  # print first five for cross-checking
200
[{'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_ACCESS_ACCESS-CCM-refC2', 'plotstyle': {'color': 'purple', 'linestyle': 'solid', 'marker': ''}, 'x': ['1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025', '2026', '2027', '2028', '2029', '2030', '2031', '2032', '2033', '2034', '2035', '2036', '2037', '2038', '2039', '2040', '2041', '2042', '2043', '2044', '2045', '2046', '2047', '2048', '2049', '2050', '2051', '2052', '2053', '2054', '2055', '2056', '2057', '2058', '2059', '2060', '2061', '2062', '2063', '2064', '2065', '2066', '2067', '2068', '2069', '2070', '2071', '2072', '2073', '2074', '2075', '2076', '2077', '2078', '2079', '2080', '2081', '2082', '2083', '2084', '2085', '2086', '2087', '2088', '2089', '2090', '2091', '2092', '2093', '2094', '2095', '2096', '2097', '2098', '2099', '2100'], 'y': [346.2776153564453, 346.2776153564453, 344.19089660644534, 345.2399810791016, 344.79651794433596, 343.2049926757813, 341.64759521484376, 341.9790252685547, 339.6935241699219, 339.7173004150391, 336.461865234375, 334.004965209961, 332.95016479492193, 330.1485961914063, 327.3143676757813, 326.07980957031253, 323.82362060546876, 320.05503234863284, 317.1924194335938, 314.53354187011723, 310.925, 307.60857543945315, 304.67973937988285, 302.41758117675784, 299.28678894042974, 295.69349060058596, 291.8769836425782, 287.95793762207035, 286.21589965820317, 281.78271789550786, 277.63332672119145, 273.80351562500005, 267.4904983520508, 261.4915878295899, 258.9700561523438, 255.55068511962895, 251.66219329833987, 248.30885620117192, 244.19300231933596, 243.56174621582034, 246.0753860473633, 243.7281616210938, 245.28644866943364, 247.0736755371094, 245.87856597900395, 245.76735992431645, 246.93642578125002, 248.34758758544925, 249.08704528808596, 247.95865173339848, 245.86597137451176, 247.63198699951175, 247.2372985839844, 250.01163787841801, 250.87575683593752, 251.80886383056645, 254.18242492675785, 253.67160949707034, 254.85982360839847, 256.2275970458985, 255.62308349609378, 257.060238647461, 258.2514282226563, 256.82307128906257, 257.3615539550782, 257.3642623901368, 256.9719482421875, 258.62582092285163, 258.0639465332032, 259.03634338378913, 261.9813705444336, 261.95432586669926, 263.4834625244141, 262.60323791503913, 264.1455886840821, 265.7035308837891, 266.6639846801758, 268.2940048217774, 271.5132202148438, 275.7468170166016, 279.5189178466797, 280.585482788086, 281.6898101806641, 284.5627624511719, 288.2847290039063, 290.4588958740235, 291.752035522461, 293.22461853027346, 297.2641906738282, 295.0239471435547, 296.0662506103516, 295.928125, 297.671859741211, 298.8583190917969, 298.3798034667969, 299.8877807617188, 301.73552856445315, 302.51728515625, 301.0359985351563, 303.35169677734376, 302.41975708007817, 305.3851501464844, 307.1610443115235, 308.31840515136724, 310.8793548583985, 311.1203918457032, 312.7027984619141, 312.83945007324223, 314.6934448242188, 317.3296325683594, 317.4012817382813, 318.46606750488286, 321.8202758789063, 323.72616577148443, 322.7880340576172, 325.6069763183594, 326.15849609375005, 330.8311218261719, 330.8529205322266, 328.95618896484376, 331.4684204101563, 331.71318359375005, 329.0909851074219, 331.5364959716797, 331.30587768554693, 330.81463317871095, 331.09461364746096, 329.43330078125, 330.2022674560547, 331.39458923339845, 331.2634979248047, 332.8045166015625, 334.02109680175784, 333.03064575195316, 334.6632781982422, 335.09021911621096, 334.4844055175782, 334.8290222167969, 335.1350799560547, 336.1991668701172, 336.1889068603516]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CCCma_CMAM-refC2', 'plotstyle': {'color': 'red', 'linestyle': 'solid', 'marker': ''}, 'x': ['1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025', '2026', '2027', '2028', '2029', '2030', '2031', '2032', '2033', '2034', '2035', '2036', '2037', '2038', '2039', '2040', '2041', '2042', '2043', '2044', '2045', '2046', '2047', '2048', '2049', '2050', '2051', '2052', '2053', '2054', '2055', '2056', '2057', '2058', '2059', '2060', '2061', '2062', '2063', '2064', '2065', '2066', '2067', '2068', '2069', '2070', '2071', '2072', '2073', '2074', '2075', '2076', '2077', '2078', '2079', '2080', '2081', '2082', '2083', '2084', '2085', '2086', '2087', '2088', '2089', '2090', '2091', '2092', '2093', '2094', '2095', '2096', '2097', '2098', '2099', '2100'], 'y': [351.86401214599607, 351.86401214599607, 351.35542449951174, 355.57737884521487, 354.23424530029297, 349.9771499633789, 356.3275833129883, 345.24928131103513, 344.44151458740237, 345.22654876708987, 346.2831344604492, 341.86380767822266, 342.0477890014648, 341.26673736572263, 339.75594024658204, 334.4859817504883, 326.0071304321289, 326.3966567993164, 321.5586196899414, 320.67137603759767, 310.925, 311.5148620605469, 307.7693115234375, 294.7178695678711, 292.1662796020508, 282.9051818847656, 275.12669982910154, 269.04498901367185, 259.7135833740234, 251.92035980224608, 256.55771484375, 248.9955078125, 238.1190200805664, 234.03816680908204, 224.7013168334961, 222.19364166259766, 220.26981506347656, 215.7968719482422, 219.48813018798828, 213.17967834472657, 207.5328384399414, 204.23307189941406, 207.8407974243164, 212.4969940185547, 212.18795318603514, 218.69286193847657, 221.2501998901367, 221.17481689453126, 221.1938903808594, 227.6576904296875, 225.0509796142578, 234.98327178955077, 234.98602294921875, 237.02869567871093, 238.43987426757812, 238.3752471923828, 236.18712615966797, 238.46255950927736, 240.05568084716796, 238.20476989746095, 238.92852935791015, 230.1319580078125, 230.97845153808595, 229.5811981201172, 231.7886001586914, 235.01458587646485, 238.0358139038086, 238.99495849609374, 239.9964614868164, 239.98670654296876, 240.03091430664062, 241.85446319580078, 242.5213394165039, 247.2451370239258, 246.31226196289063, 246.52247619628906, 246.8947525024414, 250.33602600097657, 246.45228424072266, 249.7035171508789, 260.76424102783204, 261.41114196777346, 264.77335968017576, 260.86240539550784, 269.04332427978517, 268.7472579956055, 274.6591110229492, 277.1489990234375, 282.8788528442383, 287.6033767700195, 279.7131683349609, 282.2228973388672, 282.45654296875, 289.9041122436523, 286.9389083862305, 284.4388595581055, 282.1350357055664, 278.26026153564453, 278.1993606567383, 279.877180480957, 282.81798095703124, 288.4872848510742, 292.3008804321289, 287.47315826416013, 289.4187515258789, 290.8007614135742, 291.95507659912107, 297.0407119750977, 298.56753997802736, 294.8441329956055, 292.26769866943357, 290.61450042724607, 288.0403823852539, 286.97046966552733, 286.7638961791992, 292.0441146850586, 294.35302276611327, 291.24938201904297, 293.5563430786133, 297.3076736450195, 303.9276718139648, 301.899592590332, 305.82518463134767, 311.614030456543, 310.26675567626955, 307.07715301513673, 306.7837661743164, 311.4630630493164, 311.95809478759764, 307.93372650146483, 307.5526840209961, 307.6130996704102, 303.91739959716796, 301.8792190551758, 306.58191070556643, 310.2178237915039, 313.8189407348633, 316.07857513427734, 316.5812423706055, 318.24852752685547, 315.255143737793]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1', 'plotstyle': {'color': 'darkorange', 'linestyle': 'dashed', 'marker': ''}, 'x': ['1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025', '2026', '2027', '2028', '2029', '2030', '2031', '2032', '2033', '2034', '2035', '2036', '2037', '2038', '2039', '2040', '2041', '2042', '2043', '2044', '2045', '2046', '2047', '2048', '2049', '2050', '2051', '2052', '2053', '2054', '2055', '2056', '2057', '2058', '2059', '2060', '2061', '2062', '2063', '2064', '2065', '2066', '2067', '2068', '2069', '2070', '2071', '2072', '2073', '2074', '2075', '2076', '2077', '2078', '2079', '2080', '2081', '2082', '2083', '2084', '2085', '2086', '2087', '2088', '2089', '2090', '2091', '2092', '2093', '2094', '2095', '2096', '2097', '2098', '2099', '2100'], 'y': [381.5714828491211, 381.5714828491211, 378.1163040161133, 376.7183303833008, 373.4070816040039, 373.9780899047852, 371.36494903564454, 374.6709915161133, 372.29052886962893, 368.84549713134766, 360.6159408569336, 357.20666656494143, 358.3512130737305, 353.1654281616211, 347.95308074951174, 343.93371734619143, 339.44506988525393, 332.83027496337894, 324.23018341064454, 316.62638092041016, 310.925, 309.10517578125, 295.56228790283205, 286.91331329345707, 282.9828369140625, 274.90110778808594, 268.45367126464845, 260.7116943359375, 255.36284942626955, 246.2650131225586, 240.69790496826172, 238.53372650146486, 236.68260955810547, 235.21825408935547, 232.4727493286133, 232.3526565551758, 228.981396484375, 229.0142776489258, 231.5090072631836, 233.72310180664064, 235.9229507446289, 239.2064651489258, 244.14745025634767, 243.71172943115235, 246.54490356445314, 244.62928771972656, 247.7969497680664, 246.57124481201174, 247.98087158203126, 249.27813110351565, 250.37484130859377, 240.65921478271486, 239.19200439453127, 238.1973861694336, 238.8849060058594, 241.07554931640627, 240.70039520263674, 241.2245315551758, 244.44255218505862, 250.5711639404297, 252.26995697021485, 255.21909790039064, 256.73286743164067, 260.87877502441404, 257.2423797607422, 256.60435638427737, 260.96625366210935, 265.16857147216797, 264.61548004150393, 261.60374450683594, 266.724592590332, 267.9991058349609, 267.2556259155274, 272.199365234375, 276.57763519287107, 279.6867080688477, 281.87621307373047, 280.0746719360352, 284.0301498413086, 286.6323913574219, 285.63535766601564, 289.1129653930664, 292.9555603027344, 290.94317321777345, 293.01483459472655, 294.6231369018555, 292.56831207275394, 296.7857070922852, 294.065885925293, 296.3155227661133, 296.8630111694336, 296.3875228881836, 297.7808303833008, 302.0857528686524, 303.6337173461914, 305.208317565918, 309.0577835083008, 311.7471145629883, 313.35450286865233, 315.879216003418, 315.09557342529297, 317.8024612426758, 318.81419219970707, 320.1314193725586, 321.8469467163086, 326.888151550293, 326.52049713134767, 325.1462661743164, 325.89070281982424, 324.04972381591796, 329.67862091064455, 330.1620834350586, 330.31318817138674, 328.13028717041016, 329.53011322021484, 326.86878509521483, 326.78084564208984, 330.5340835571289, 329.8897872924805, 334.3519912719727, 335.313688659668, 335.37488555908203, 334.43797454833987, 336.69957122802737, 339.33396759033207, 339.751188659668, 341.9354843139649, 340.37446441650394, 346.79536590576174, 344.0474655151367, 342.09180755615233, 343.31050262451174, 344.09497833251953, 342.79658355712894, 340.02554168701175, 340.67451324462894, 338.10611419677736, 337.42491302490237, 333.48226470947264, 333.1030715942383, 331.86889801025393]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1', 'plotstyle': {'color': 'darkorange', 'linestyle': 'dashed', 'marker': ''}, 'x': ['1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025', '2026', '2027', '2028', '2029', '2030', '2031', '2032', '2033', '2034', '2035', '2036', '2037', '2038', '2039', '2040', '2041', '2042', '2043', '2044', '2045', '2046', '2047', '2048', '2049', '2050', '2051', '2052', '2053', '2054', '2055', '2056', '2057', '2058', '2059', '2060', '2061', '2062', '2063', '2064', '2065', '2066', '2067', '2068', '2069', '2070', '2071', '2072', '2073', '2074', '2075', '2076', '2077', '2078', '2079', '2080', '2081', '2082', '2083', '2084', '2085', '2086', '2087', '2088', '2089', '2090', '2091', '2092', '2093', '2094', '2095', '2096', '2097', '2098', '2099', '2100'], 'y': [358.6359558105469, 358.6359558105469, 357.95749816894534, 358.44141235351566, 359.3844879150391, 359.0133544921875, 354.6981109619141, 353.3206817626953, 352.1751342773438, 350.15040283203126, 345.91631469726565, 342.6816680908203, 338.2875183105469, 333.2715118408203, 331.16810302734376, 327.3575012207031, 323.2553405761719, 321.2728179931641, 317.3791473388672, 309.56711425781253, 310.925, 309.24676818847655, 308.69524230957035, 309.64970703125, 304.7010070800781, 300.38481750488285, 300.2701385498047, 291.2830490112305, 280.99983673095704, 276.5548492431641, 266.0521423339844, 257.6220001220703, 252.01848449707032, 240.39391326904297, 231.2869857788086, 227.9185012817383, 221.7367172241211, 221.01917724609376, 223.24974060058594, 222.3900100708008, 223.3753387451172, 224.31804199218752, 222.1968185424805, 225.74407806396485, 227.56508789062502, 231.21707611083986, 231.67010650634768, 232.9335479736328, 235.1730728149414, 237.97268066406252, 237.90101165771486, 237.39969482421876, 238.73965606689455, 240.7696243286133, 243.3038299560547, 240.22039642333985, 240.6954299926758, 239.92261047363283, 242.710546875, 245.2356903076172, 246.5360336303711, 252.18057403564455, 253.35039672851565, 251.01851043701174, 253.4172805786133, 254.85916137695312, 256.3019271850586, 256.0974868774414, 255.30174102783204, 256.98720703125, 257.12850189208984, 258.35796508789065, 262.17308807373047, 268.0345748901367, 271.59240875244143, 274.1342208862305, 278.1360504150391, 284.0222351074219, 288.8552017211914, 292.12681732177737, 294.62740020751954, 298.9747817993164, 302.2896011352539, 303.68848114013673, 304.14416961669923, 306.8114929199219, 307.885986328125, 309.46814880371096, 306.3762573242188, 306.3796752929688, 308.3333374023438, 306.14597167968753, 304.1287475585938, 302.96336059570314, 304.9953887939453, 305.5959197998047, 308.2728546142578, 309.0998504638672, 313.55296325683594, 313.0412628173828, 314.37506103515625, 318.391796875, 318.3229461669922, 321.5603729248047, 321.32123107910155, 323.6040252685547, 322.73389892578126, 323.77886657714845, 326.3802795410156, 326.79912109375, 331.80604858398436, 328.8478546142578, 331.20375061035156, 331.2844146728516, 337.35638122558595, 337.2773895263672, 337.6394073486328, 341.7844207763672, 337.78045043945315, 341.5189453125, 342.05064086914064, 343.88139953613285, 346.0853668212891, 348.1514434814453, 343.58464660644535, 343.0266967773438, 345.3072845458984, 342.8584014892578, 346.1903106689453, 346.3204620361328, 344.6767913818359, 344.90953369140624, 343.5954986572266, 344.3072143554688, 342.5970825195313, 344.10809020996095, 343.57060852050785, 344.4231201171875, 342.29920349121096, 343.61365356445316, 342.4048767089844]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1', 'plotstyle': {'color': 'darkorange', 'linestyle': 'dashed', 'marker': ''}, 'x': ['1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025', '2026', '2027', '2028', '2029', '2030', '2031', '2032', '2033', '2034', '2035', '2036', '2037', '2038', '2039', '2040', '2041', '2042', '2043', '2044', '2045', '2046', '2047', '2048', '2049', '2050', '2051', '2052', '2053', '2054', '2055', '2056', '2057', '2058', '2059', '2060', '2061', '2062', '2063', '2064', '2065', '2066', '2067', '2068', '2069', '2070', '2071', '2072', '2073', '2074', '2075', '2076', '2077', '2078', '2079', '2080', '2081', '2082', '2083', '2084', '2085', '2086', '2087', '2088', '2089', '2090', '2091', '2092', '2093', '2094', '2095', '2096', '2097', '2098', '2099', '2100'], 'y': [365.4360290527344, 365.4360290527344, 366.3817901611328, 370.3562286376953, 370.0383636474609, 368.7543701171875, 363.65330505371094, 362.13975830078124, 362.7178039550781, 363.755908203125, 362.38750610351565, 360.49403991699216, 355.80242614746095, 350.2475311279297, 345.21844482421875, 343.0520751953125, 338.33714904785154, 333.865087890625, 327.39000244140624, 318.34383087158204, 310.925, 304.46538696289065, 299.0312774658203, 291.35950622558596, 288.34351806640626, 282.4365234375, 276.03794250488284, 271.8182373046875, 263.2386703491211, 262.28236083984376, 256.69469299316404, 252.03939971923828, 248.528076171875, 247.79768829345704, 240.75631256103514, 235.02481231689453, 230.83321533203124, 224.58261260986328, 226.68485412597656, 227.8892333984375, 230.0491973876953, 233.94886322021483, 235.38610076904297, 236.56617126464843, 239.3690414428711, 246.90138092041016, 253.57110748291015, 259.4573577880859, 258.7451919555664, 257.60504150390625, 257.0888076782227, 254.17039642333984, 255.1963134765625, 256.12268524169923, 259.8720077514648, 255.56302185058593, 260.1665542602539, 260.2986724853516, 264.5683395385742, 267.7353576660156, 270.566650390625, 276.5804504394531, 276.32234649658204, 276.3282241821289, 275.2374801635742, 278.22037506103516, 275.76917877197263, 277.9089553833008, 276.6732666015625, 277.34466552734375, 279.9870849609375, 277.62059631347654, 279.3583251953125, 280.8967742919922, 284.52840118408204, 285.99884643554685, 283.9988784790039, 286.9042510986328, 288.2472900390625, 288.2276809692383, 288.45092010498047, 290.03744354248045, 293.49230041503904, 294.37877502441404, 290.1622573852539, 289.8346633911133, 293.2915893554688, 294.0444580078125, 296.50605926513674, 298.96287231445314, 301.6950622558594, 304.6785858154297, 306.6046600341797, 308.448747253418, 310.9706726074219, 313.1002166748047, 312.72008056640624, 313.1872253417969, 314.9825103759766, 316.8722778320313, 316.04274597167966, 318.5152069091797, 318.5831359863281, 320.08416748046875, 324.6519805908203, 327.76747131347656, 330.9547088623047, 330.2920715332031, 331.4086059570312, 332.7617950439453, 334.48505249023435, 331.79441528320314, 333.61553649902345, 335.93740234375, 338.03192138671875, 339.3437164306641, 340.1692321777344, 345.2793029785156, 347.0900177001953, 346.4639862060547, 349.43590087890624, 349.12818298339846, 348.1135589599609, 346.2927307128906, 346.17779235839845, 342.52085266113284, 346.2075622558594, 343.29247131347654, 342.37383422851565, 343.1639038085938, 341.8174591064453, 342.67644958496095, 343.50169677734374, 346.4277709960937, 344.9670471191406, 347.34112548828125, 343.3644195556641, 343.538671875, 343.063525390625, 343.6079162597656, 343.7228485107422]}]
  1. The received JSON data are converted into pandas Dataframe for an easier data manipulation

[8]:
tco3_zm_pd = pd.json_normalize(tco3_zm_data)
  1. Finally, we plot the retrieved data:

[9]:
# set default linewidth:
linewidth_default = 2
tco3_zm_pd_plot = tco3_zm_pd.copy()

if not 'plotstyle.linewidth' in tco3_zm_pd_plot.columns:
  tco3_zm_pd_plot['plotstyle.linewidth'] = linewidth_default
else:
  tco3_zm_pd_plot['plotstyle.linewidth'] = tco3_zm_pd_plot['plotstyle.linewidth'].fillna(linewidth_default)

# plot every model
for index, c in tco3_zm_pd_plot.iterrows():
  plt.plot(pd.to_datetime(c['x']), c['y'], label=c['model'],
           color=c['plotstyle.color'], linestyle=c['plotstyle.linestyle'],
           marker=c['plotstyle.marker'], linewidth=c['plotstyle.linewidth'])

# let's fill the area of (MMMean +/- 1 Std)
tco3_zm_mmmean_minus_std_pd = tco3_zm_pd_plot[tco3_zm_pd_plot['model']=='MMMean-Std']
tco3_zm_mmmean_plus_std_pd = tco3_zm_pd_plot[tco3_zm_pd_plot['model']=='MMMean+Std']

plt.fill_between(pd.to_datetime(tco3_zm_mmmean_minus_std_pd['x'].iloc[0]),
                 tco3_zm_mmmean_minus_std_pd['y'].iloc[0],
                 tco3_zm_mmmean_plus_std_pd['y'].iloc[0],
                 color='g', alpha=0.2);

# tune the plot
# show the legend
ax = plt.gca() # get axis instance
ax.legend(bbox_to_anchor=(1.0, 1.0))

plt.xticks(fontsize=14)
plt.yticks(fontsize=14)

# put titels for axes
plt.xlabel('Year', fontsize='x-large')
plt.ylabel('tco3_zm (DU)', fontsize='x-large')
[9]:
Text(0, 0.5, 'tco3_zm (DU)')
_images/user_jupyter_o3api_plot_tco3_18_1.png
Request points of the tco3_return plot
  1. Similar to the previous task, we configure parameters of interest to get the tco3_return plot. In the example we specify that we want a plot for:

  • month: September, October, November

  • South Hemisphere (SH, latitudes: -90, -60)

  • reference measurement: refMeasurement (e.g. SBUV_GSFC_merged-SAT-ozone, see Global Variables)

  • reference year: refYear (e.g. 1980, see Global Variables)

  • we don’t provide a specific range of years, like in the previous example, but use all available data

[10]:
# initialize an empty dictionary
kwargs_tco3_return = {}

# Build kwargs with tco3_zm parameters for O3as API.
# Keys have to correspond to expected by the API keys!

kwargs_tco3_return = {
    'month'   : '9,10,11',
    'lat_min' : -90,
    'lat_max' : -60,
    'ref_meas': refMeasurement,
    'ref_year': refYear
}
  1. We want to retrieve “tco3_retrun” plot: we use ‘/plots’ endpoint, plot type ‘tco3_return’, therefore we append ‘plots/tco3_return’ to the base URL of the O3as API

  2. Then we retrieve tco3_retrun plot data for the parameters of interest and the list of refC2 models defined above (this time we exclude the reference measurement)

[11]:
# Build the API URL, use /plots/tco3_return endpoint:
url_o3api_plot_tco3_return = os.path.join(url_o3api, "plots/tco3_return")

# Request data
response = requests.request("POST",
                            url=url_o3api_plot_tco3_return,
                            params=kwargs_tco3_return,
                            headers=headers,
                            data=json.dumps(tco3_zm_models))
# Read the status_code. Normal response => 200
print(response.status_code)
tco3_return_data = response.json()
print(tco3_return_data[:5])  # print first five for cross-checking
200
[{'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_ACCESS_ACCESS-CCM-refC2', 'plotstyle': {'color': 'purple', 'linestyle': 'none', 'marker': 'o'}, 'x': ['Antarctic(Oct)', 'SH mid-lat', 'Tropics', 'NH mid-lat', 'Arctic(Mar)', 'Near global', 'Global', 'User region'], 'y': [2064, 2051, 2060, 2041, 2040, 2049, 2052, 2065]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CCCma_CMAM-refC2', 'plotstyle': {'color': 'red', 'linestyle': 'none', 'marker': 'x'}, 'x': ['Antarctic(Oct)', 'SH mid-lat', 'NH mid-lat', 'Arctic(Mar)', 'Near global', 'Global', 'User region'], 'y': [2087.0, 2049.0, 1986.0, 1986.0, 2045.0, 2048.0, 2083.0]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1', 'plotstyle': {'color': 'darkorange', 'linestyle': 'none', 'marker': 'd'}, 'x': ['Antarctic(Oct)', 'SH mid-lat', 'Tropics', 'NH mid-lat', 'Arctic(Mar)', 'Near global', 'Global', 'User region'], 'y': [2056, 2049, 2026, 1987, 2009, 2026, 2038, 2057]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1', 'plotstyle': {'color': 'darkorange', 'linestyle': 'none', 'marker': 'd'}, 'x': ['Antarctic(Oct)', 'SH mid-lat', 'Tropics', 'NH mid-lat', 'Arctic(Mar)', 'Near global', 'Global', 'User region'], 'y': [2057, 2038, 2022, 2006, 2017, 2026, 2036, 2058]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1', 'plotstyle': {'color': 'darkorange', 'linestyle': 'none', 'marker': 'd'}, 'x': ['Antarctic(Oct)', 'SH mid-lat', 'Tropics', 'NH mid-lat', 'Arctic(Mar)', 'Near global', 'Global', 'User region'], 'y': [2055, 2037, 2025, 2002, 2020, 2022, 2034, 2054]}]
  1. The received JSON data can be converted into pandas Dataframe for an easier data manipulation

[12]:
tco3_return_pd = pd.json_normalize(tco3_return_data)
  1. Finally, we plot the retrieved data:

[13]:
# set default markersize:
markersize_default = 6
tco3_return_pd_plot = tco3_return_pd.copy()

if not 'plotstyle.markersize' in tco3_return_pd_plot.columns:
  tco3_return_pd_plot['plotstyle.markersize'] = markersize_default
else:
  tco3_return_pd_plot['plotstyle.markersize'] = tco3_return_pd_plot['plotstyle.markersize'].fillna(markersize_default)

# plot every model
for index, c in tco3_return_pd_plot.iterrows():
  plt.plot(c['x'], c['y'], label=c['model'],
           color=c['plotstyle.color'], linestyle=c['plotstyle.linestyle'],
           marker=c['plotstyle.marker'], markersize=c['plotstyle.markersize'])

# show the legend
ax = plt.gca() # get axis instance
ax.legend(bbox_to_anchor=(1.0, 1.0))

# put titels for axes
plt.xlabel('Region', fontsize='x-large')
plt.ylabel('tco3_zm (DU)', fontsize='x-large')
[13]:
Text(0, 0.5, 'tco3_zm (DU)')
_images/user_jupyter_o3api_plot_tco3_26_1.png

The example is how to use a Jupyter notebook to retrieve data points of either tco3_zm plot or tco3_return plot in the JSON format and plot them. The corresponding Jupyter notebook can be downloaded here .

How to retrieve data, analyse, and plot tco3 plots (jupyter)

This tutorial shows how to use a Jupyter notebook to retrieve skimmed data points in the JSON format and analyse for either tco3_zm or tco3_return plot. The Jupyter notebook can be downloaded from here.

System installations

If necessary, install required libraries or python packages

[1]:
### If needed, install additional modules:
#!pip3 install pandas
#!pip3 install matplotlib
### interactive plotting in jupyterlab requires node.js (pip does not install it!!):
#!apt update && apt install -y nodejs
#!pip3 install ipympl
#!jupyter labextension install @jupyter-widgets/jupyterlab-manager
#!jupyter labextension install jupyter-matplotlib
#!jupyter nbextension enable --py widgetsnbextension
### DON'T FORGET TO RESTART JupyterLab !!
# start jupyterlab:
# jupyter lab --ip=0.0.0.0
Import necessary packages

In this tutorial we need the following python packages:

json - to decode JSON data

matplotlib - to plot the data

numpy and pandas - to manipulate the data

os - to manipulate URL paths

requests - to communicate with the O3as API and retrieve data

scipy - to apply boxcar smoothing on the skimmed data

[2]:
import json
import matplotlib.style as mplstyle
mplstyle.use('fast')
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import requests
from scipy import signal
Define global variables

we set a few variables: e.g. the base URL of O3AS API and the default figure size

[3]:
debug = False  # global debug flag, set to True to get more print-outs

pd.options.display.max_columns = None  # prints all columns of the pandas' DataFrame

# for interactive plot, may change to widget, if installed
%matplotlib inline

# Set default size of plots
plt.rcParams['figure.figsize'] = [12, 8]

# A few variables needed for every REST API call:
url_o3api = "http://api.o3as.fedcloud.eu/api/v1/"  # base URL of the O3as API
headers = {'Content-Type': 'application/json',
           'Accept': 'application/json'}

# Define Reference Measurement and Reference Year
refMeasurement = 'SBUV_GSFC_merged-SAT-ozone'
refYear = 1980
Retrieve list of models

We will analyse refC2 models, therefore we first request the list of corresponding models via the REST API

[4]:
# Use '/models' API Endpoint, i.e. append "models" to the base url_o3api:
url_o3api_tco3_zm_models = os.path.join(url_o3api, "models")

# request the list of modesl from O3as API, select "refC2" models:
tco3_zm_models = requests.request("GET",
                                  url=url_o3api_tco3_zm_models,
                                  params={'select': 'refc2'},
                                  headers=headers).json()
print(tco3_zm_models)
['CCMI-1_ACCESS_ACCESS-CCM-refC2', 'CCMI-1_CCCma_CMAM-refC2', 'CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1', 'CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1', 'CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1', 'CCMI-1_CESM1-WACCM_refC2_r1i1p1', 'CCMI-1_CESM1-WACCM_refC2_r2i1p1', 'CCMI-1_CESM1-WACCM_refC2_r3i1p1', 'CCMI-1_CHASER-MIROC-ESM-refC2', 'CCMI-1_CNRM-CERFACS_CNRM-CM5-3-refC2', 'CCMI-1_CNRM-CERFACS_MOCAGE-refC2', 'CCMI-1_ETH-PMOD_SOCOL3-refC2', 'CCMI-1_GSFC_GEOSCCM-refC2', 'CCMI-1_MESSy_EMAC-L90MA-refC2', 'CCMI-1_MOHC_HadGEM3-ES-refC2', 'CCMI-1_MRI_ESM1r1-refC2', 'CCMI-1_NIES_CCSRNIES-MIROC3.2-refC2', 'CCMI-1_NIWA_NIWA-UKCA-refC2', 'CCMI-1_U-CAMBRIDGE_UMUKCA-UCAM-refC2', 'CCMI-1_U-LAQUILA_CCM-refC2', 'CCMI-1_U-LEEDS_UMSLIMCAT-refC2']

We also add a reference measurement, refMeasurement (defined above, e.g. SBUV_GSFC_merged-SAT-ozone), to the list of models to be plotted

[5]:
tco3_zm_models.append(refMeasurement)
Request skimmed data to analyse and to build tco3 plots
  1. we configure parameters of interest to get the data. In the example we specify that we want a plot for:

  • Range of years: (1960, 2100)

  • month: September, October, November

  • South Hemisphere (SH, latitudes: -90, -60)

[6]:
# initialize an empty dictionary
kwargs_tco3_zm = {}

# Build kwargs with tco3_zm parameters for O3as API '/data' Endpoint.
# Keys have to correspond to expected by the API keys!

kwargs_tco3_zm = {
    'begin'   : 1960,
    'end'     : 2100,
    'month'   : '9,10,11',
    'lat_min' : -90,
    'lat_max' : -60
}
  1. We want to retrieve skimmed data to analyse and build “tco3_zm” plot: we use ‘/data’ endpoint, plot type ‘tco3_zm’, therefore we append ‘data/tco3_zm’ to the base URL of the O3as API

  2. Then we retrieve skimmed data for the tco3_zm plot for the parameters of interest and the list of refC2 models defined above

[7]:
# Build the API URL, use /data/tco3_zm endpoint:
url_o3api_data_tco3_zm = os.path.join(url_o3api, "data/tco3_zm")

# Request data
response = requests.request("POST",
                            url=url_o3api_data_tco3_zm,
                            params=kwargs_tco3_zm,
                            headers=headers,
                            data=json.dumps(tco3_zm_models))
if debug: print(response.request.url)  # debug: print the configured API call

# Read the status_code. Normal response => 200
print(response.status_code)
tco3_skim_data = response.json()
print(tco3_skim_data[:5])  # print first five for cross-checking
200
[{'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_ACCESS_ACCESS-CCM-refC2', 'plotstyle': {'color': 'purple', 'linestyle': 'solid', 'marker': 'o'}, 'x': ['1960-09-16 00:00:00', '1960-10-16 00:00:00', '1960-11-16 00:00:00', '1961-09-16 00:00:00', '1961-10-16 00:00:00', '1961-11-16 00:00:00', '1962-09-16 00:00:00', '1962-10-16 00:00:00', '1962-11-16 00:00:00', '1963-09-16 00:00:00', '1963-10-16 00:00:00', '1963-11-16 00:00:00', '1964-09-16 00:00:00', '1964-10-16 00:00:00', '1964-11-16 00:00:00', '1965-09-16 00:00:00', '1965-10-16 00:00:00', '1965-11-16 00:00:00', '1966-09-16 00:00:00', '1966-10-16 00:00:00', '1966-11-16 00:00:00', '1967-09-16 00:00:00', '1967-10-16 00:00:00', '1967-11-16 00:00:00', '1968-09-16 00:00:00', '1968-10-16 00:00:00', '1968-11-16 00:00:00', '1969-09-16 00:00:00', '1969-10-16 00:00:00', '1969-11-16 00:00:00', '1970-09-16 00:00:00', '1970-10-16 00:00:00', '1970-11-16 00:00:00', '1971-09-16 00:00:00', '1971-10-16 00:00:00', '1971-11-16 00:00:00', '1972-09-16 00:00:00', '1972-10-16 00:00:00', '1972-11-16 00:00:00', '1973-09-16 00:00:00', '1973-10-16 00:00:00', '1973-11-16 00:00:00', '1974-09-16 00:00:00', '1974-10-16 00:00:00', '1974-11-16 00:00:00', '1975-09-16 00:00:00', '1975-10-16 00:00:00', '1975-11-16 00:00:00', '1976-09-16 00:00:00', '1976-10-16 00:00:00', '1976-11-16 00:00:00', '1977-09-16 00:00:00', '1977-10-16 00:00:00', '1977-11-16 00:00:00', '1978-09-16 00:00:00', '1978-10-16 00:00:00', '1978-11-16 00:00:00', '1979-09-16 00:00:00', '1979-10-16 00:00:00', '1979-11-16 00:00:00', '1980-09-16 00:00:00', '1980-10-16 00:00:00', '1980-11-16 00:00:00', '1981-09-16 00:00:00', '1981-10-16 00:00:00', '1981-11-16 00:00:00', '1982-09-16 00:00:00', '1982-10-16 00:00:00', '1982-11-16 00:00:00', '1983-09-16 00:00:00', '1983-10-16 00:00:00', '1983-11-16 00:00:00', '1984-09-16 00:00:00', '1984-10-16 00:00:00', '1984-11-16 00:00:00', '1985-09-16 00:00:00', '1985-10-16 00:00:00', '1985-11-16 00:00:00', '1986-09-16 00:00:00', '1986-10-16 00:00:00', '1986-11-16 00:00:00', '1987-09-16 00:00:00', '1987-10-16 00:00:00', '1987-11-16 00:00:00', '1988-09-16 00:00:00', '1988-10-16 00:00:00', '1988-11-16 00:00:00', '1989-09-16 00:00:00', '1989-10-16 00:00:00', '1989-11-16 00:00:00', '1990-09-16 00:00:00', '1990-10-16 00:00:00', '1990-11-16 00:00:00', '1991-09-16 00:00:00', '1991-10-16 00:00:00', '1991-11-16 00:00:00', '1992-09-16 00:00:00', '1992-10-16 00:00:00', '1992-11-16 00:00:00', '1993-09-16 00:00:00', '1993-10-16 00:00:00', '1993-11-16 00:00:00', '1994-09-16 00:00:00', '1994-10-16 00:00:00', '1994-11-16 00:00:00', '1995-09-16 00:00:00', '1995-10-16 00:00:00', '1995-11-16 00:00:00', '1996-09-16 00:00:00', '1996-10-16 00:00:00', '1996-11-16 00:00:00', '1997-09-16 00:00:00', '1997-10-16 00:00:00', '1997-11-16 00:00:00', '1998-09-16 00:00:00', '1998-10-16 00:00:00', '1998-11-16 00:00:00', '1999-09-16 00:00:00', '1999-10-16 00:00:00', '1999-11-16 00:00:00', '2000-09-16 00:00:00', '2000-10-16 00:00:00', '2000-11-16 00:00:00', '2001-09-16 00:00:00', '2001-10-16 00:00:00', '2001-11-16 00:00:00', '2002-09-16 00:00:00', '2002-10-16 00:00:00', '2002-11-16 00:00:00', '2003-09-16 00:00:00', '2003-10-16 00:00:00', '2003-11-16 00:00:00', '2004-09-16 00:00:00', '2004-10-16 00:00:00', '2004-11-16 00:00:00', '2005-09-16 00:00:00', '2005-10-16 00:00:00', '2005-11-16 00:00:00', '2006-09-16 00:00:00', '2006-10-16 00:00:00', '2006-11-16 00:00:00', '2007-09-16 00:00:00', '2007-10-16 00:00:00', '2007-11-16 00:00:00', '2008-09-16 00:00:00', '2008-10-16 00:00:00', '2008-11-16 00:00:00', '2009-09-16 00:00:00', '2009-10-16 00:00:00', '2009-11-16 00:00:00', '2010-09-16 00:00:00', '2010-10-16 00:00:00', '2010-11-16 00:00:00', '2011-09-16 00:00:00', '2011-10-16 00:00:00', '2011-11-16 00:00:00', '2012-09-16 00:00:00', '2012-10-16 00:00:00', '2012-11-16 00:00:00', '2013-09-16 00:00:00', '2013-10-16 00:00:00', '2013-11-16 00:00:00', '2014-09-16 00:00:00', '2014-10-16 00:00:00', '2014-11-16 00:00:00', '2015-09-16 00:00:00', '2015-10-16 00:00:00', '2015-11-16 00:00:00', '2016-09-16 00:00:00', '2016-10-16 00:00:00', '2016-11-16 00:00:00', '2017-09-16 00:00:00', '2017-10-16 00:00:00', '2017-11-16 00:00:00', '2018-09-16 00:00:00', '2018-10-16 00:00:00', '2018-11-16 00:00:00', '2019-09-16 00:00:00', '2019-10-16 00:00:00', '2019-11-16 00:00:00', '2020-09-16 00:00:00', '2020-10-16 00:00:00', '2020-11-16 00:00:00', '2021-09-16 00:00:00', '2021-10-16 00:00:00', '2021-11-16 00:00:00', '2022-09-16 00:00:00', '2022-10-16 00:00:00', '2022-11-16 00:00:00', '2023-09-16 00:00:00', '2023-10-16 00:00:00', '2023-11-16 00:00:00', '2024-09-16 00:00:00', '2024-10-16 00:00:00', '2024-11-16 00:00:00', '2025-09-16 00:00:00', '2025-10-16 00:00:00', '2025-11-16 00:00:00', '2026-09-16 00:00:00', '2026-10-16 00:00:00', '2026-11-16 00:00:00', '2027-09-16 00:00:00', '2027-10-16 00:00:00', '2027-11-16 00:00:00', '2028-09-16 00:00:00', '2028-10-16 00:00:00', '2028-11-16 00:00:00', '2029-09-16 00:00:00', '2029-10-16 00:00:00', '2029-11-16 00:00:00', '2030-09-16 00:00:00', '2030-10-16 00:00:00', '2030-11-16 00:00:00', '2031-09-16 00:00:00', '2031-10-16 00:00:00', '2031-11-16 00:00:00', '2032-09-16 00:00:00', '2032-10-16 00:00:00', '2032-11-16 00:00:00', '2033-09-16 00:00:00', '2033-10-16 00:00:00', '2033-11-16 00:00:00', '2034-09-16 00:00:00', '2034-10-16 00:00:00', '2034-11-16 00:00:00', '2035-09-16 00:00:00', '2035-10-16 00:00:00', '2035-11-16 00:00:00', '2036-09-16 00:00:00', '2036-10-16 00:00:00', '2036-11-16 00:00:00', '2037-09-16 00:00:00', '2037-10-16 00:00:00', '2037-11-16 00:00:00', '2038-09-16 00:00:00', '2038-10-16 00:00:00', '2038-11-16 00:00:00', '2039-09-16 00:00:00', '2039-10-16 00:00:00', '2039-11-16 00:00:00', '2040-09-16 00:00:00', '2040-10-16 00:00:00', '2040-11-16 00:00:00', '2041-09-16 00:00:00', '2041-10-16 00:00:00', '2041-11-16 00:00:00', '2042-09-16 00:00:00', '2042-10-16 00:00:00', '2042-11-16 00:00:00', '2043-09-16 00:00:00', '2043-10-16 00:00:00', '2043-11-16 00:00:00', '2044-09-16 00:00:00', '2044-10-16 00:00:00', '2044-11-16 00:00:00', '2045-09-16 00:00:00', '2045-10-16 00:00:00', '2045-11-16 00:00:00', '2046-09-16 00:00:00', '2046-10-16 00:00:00', '2046-11-16 00:00:00', '2047-09-16 00:00:00', '2047-10-16 00:00:00', '2047-11-16 00:00:00', '2048-09-16 00:00:00', '2048-10-16 00:00:00', '2048-11-16 00:00:00', '2049-09-16 00:00:00', '2049-10-16 00:00:00', '2049-11-16 00:00:00', '2050-09-16 00:00:00', '2050-10-16 00:00:00', '2050-11-16 00:00:00', '2051-09-16 00:00:00', '2051-10-16 00:00:00', '2051-11-16 00:00:00', '2052-09-16 00:00:00', '2052-10-16 00:00:00', '2052-11-16 00:00:00', '2053-09-16 00:00:00', '2053-10-16 00:00:00', '2053-11-16 00:00:00', '2054-09-16 00:00:00', '2054-10-16 00:00:00', '2054-11-16 00:00:00', '2055-09-16 00:00:00', '2055-10-16 00:00:00', '2055-11-16 00:00:00', '2056-09-16 00:00:00', '2056-10-16 00:00:00', '2056-11-16 00:00:00', '2057-09-16 00:00:00', '2057-10-16 00:00:00', '2057-11-16 00:00:00', '2058-09-16 00:00:00', '2058-10-16 00:00:00', '2058-11-16 00:00:00', '2059-09-16 00:00:00', '2059-10-16 00:00:00', '2059-11-16 00:00:00', '2060-09-16 00:00:00', '2060-10-16 00:00:00', '2060-11-16 00:00:00', '2061-09-16 00:00:00', '2061-10-16 00:00:00', '2061-11-16 00:00:00', '2062-09-16 00:00:00', '2062-10-16 00:00:00', '2062-11-16 00:00:00', '2063-09-16 00:00:00', '2063-10-16 00:00:00', '2063-11-16 00:00:00', '2064-09-16 00:00:00', '2064-10-16 00:00:00', '2064-11-16 00:00:00', '2065-09-16 00:00:00', '2065-10-16 00:00:00', '2065-11-16 00:00:00', '2066-09-16 00:00:00', '2066-10-16 00:00:00', '2066-11-16 00:00:00', '2067-09-16 00:00:00', '2067-10-16 00:00:00', '2067-11-16 00:00:00', '2068-09-16 00:00:00', '2068-10-16 00:00:00', '2068-11-16 00:00:00', '2069-09-16 00:00:00', '2069-10-16 00:00:00', '2069-11-16 00:00:00', '2070-09-16 00:00:00', '2070-10-16 00:00:00', '2070-11-16 00:00:00', '2071-09-16 00:00:00', '2071-10-16 00:00:00', '2071-11-16 00:00:00', '2072-09-16 00:00:00', '2072-10-16 00:00:00', '2072-11-16 00:00:00', '2073-09-16 00:00:00', '2073-10-16 00:00:00', '2073-11-16 00:00:00', '2074-09-16 00:00:00', '2074-10-16 00:00:00', '2074-11-16 00:00:00', '2075-09-16 00:00:00', '2075-10-16 00:00:00', '2075-11-16 00:00:00', '2076-09-16 00:00:00', '2076-10-16 00:00:00', '2076-11-16 00:00:00', '2077-09-16 00:00:00', '2077-10-16 00:00:00', '2077-11-16 00:00:00', '2078-09-16 00:00:00', '2078-10-16 00:00:00', '2078-11-16 00:00:00', '2079-09-16 00:00:00', '2079-10-16 00:00:00', '2079-11-16 00:00:00', '2080-09-16 00:00:00', '2080-10-16 00:00:00', '2080-11-16 00:00:00', '2081-09-16 00:00:00', '2081-10-16 00:00:00', '2081-11-16 00:00:00', '2082-09-16 00:00:00', '2082-10-16 00:00:00', '2082-11-16 00:00:00', '2083-09-16 00:00:00', '2083-10-16 00:00:00', '2083-11-16 00:00:00', '2084-09-16 00:00:00', '2084-10-16 00:00:00', '2084-11-16 00:00:00', '2085-09-16 00:00:00', '2085-10-16 00:00:00', '2085-11-16 00:00:00', '2086-09-16 00:00:00', '2086-10-16 00:00:00', '2086-11-16 00:00:00', '2087-09-16 00:00:00', '2087-10-16 00:00:00', '2087-11-16 00:00:00', '2088-09-16 00:00:00', '2088-10-16 00:00:00', '2088-11-16 00:00:00', '2089-09-16 00:00:00', '2089-10-16 00:00:00', '2089-11-16 00:00:00', '2090-09-16 00:00:00', '2090-10-16 00:00:00', '2090-11-16 00:00:00', '2091-09-16 00:00:00', '2091-10-16 00:00:00', '2091-11-16 00:00:00', '2092-09-16 00:00:00', '2092-10-16 00:00:00', '2092-11-16 00:00:00', '2093-09-16 00:00:00', '2093-10-16 00:00:00', '2093-11-16 00:00:00', '2094-09-16 00:00:00', '2094-10-16 00:00:00', '2094-11-16 00:00:00', '2095-09-16 00:00:00', '2095-10-16 00:00:00', '2095-11-16 00:00:00', '2096-09-16 00:00:00', '2096-10-16 00:00:00', '2096-11-16 00:00:00', '2097-09-16 00:00:00', '2097-10-16 00:00:00', '2097-11-16 00:00:00', '2098-09-16 00:00:00', '2098-10-16 00:00:00', '2098-11-16 00:00:00', '2099-09-16 00:00:00', '2099-10-16 00:00:00', '2099-11-16 00:00:00', '2100-09-16 00:00:00', '2100-10-16 00:00:00', '2100-11-16 00:00:00'], 'y': [320.9511413574219, 333.2698669433594, 361.1513671875, 319.62957763671875, 329.90435791015625, 351.99432373046875, 323.95928955078125, 333.49688720703125, 351.9967346191406, 301.10845947265625, 318.9958801269531, 337.90045166015625, 326.7186279296875, 345.24346923828125, 368.2457275390625, 329.15325927734375, 342.9112548828125, 368.9132995605469, 314.4475402832031, 324.4623718261719, 338.6962890625, 313.0696716308594, 323.9486999511719, 352.458984375, 315.2423400878906, 324.0968322753906, 356.80987548828125, 307.1667785644531, 314.7663269042969, 331.8493957519531, 317.14031982421875, 323.12701416015625, 328.3831481933594, 325.8026123046875, 337.35614013671875, 348.3123474121094, 296.73944091796875, 312.2994384765625, 331.8489990234375, 313.1903991699219, 315.26885986328125, 330.25885009765625, 312.88128662109375, 314.5570373535156, 315.1064147949219, 309.8940734863281, 315.08343505859375, 342.2933349609375, 305.48162841796875, 310.6967468261719, 329.7838439941406, 292.3639831542969, 295.5267333984375, 317.5395202636719, 303.90606689453125, 303.4534606933594, 303.76263427734375, 308.0885925292969, 304.08612060546875, 304.571044921875, 292.8528747558594, 294.76934814453125, 313.34259033203125, 293.2722473144531, 296.9925231933594, 308.14874267578125, 290.07904052734375, 282.0804443359375, 282.8500671386719, 287.5937194824219, 285.5896911621094, 305.7683410644531, 280.9316101074219, 275.1843566894531, 278.1725158691406, 290.1395568847656, 288.7980041503906, 288.840576171875, 275.3650817871094, 281.0958557128906, 301.6361999511719, 268.7950439453125, 275.72186279296875, 293.0486145019531, 277.6191711425781, 265.67694091796875, 273.90228271484375, 264.92376708984375, 262.2011413574219, 281.8218994140625, 264.5673828125, 251.23760986328125, 270.6645812988281, 262.4004211425781, 257.0200500488281, 261.4216613769531, 274.2939147949219, 256.8444519042969, 271.61004638671875, 260.4425354003906, 245.9104766845703, 239.60330200195312, 245.67608642578125, 226.76229858398438, 237.36837768554688, 255.02687072753906, 243.22496032714844, 254.63192749023438, 237.52601623535156, 218.3738555908203, 212.80673217773438, 228.78549194335938, 212.57167053222656, 216.24105834960938, 246.7681427001953, 239.70101928710938, 255.0833282470703, 246.21258544921875, 227.00770568847656, 233.14537048339844, 235.61033630371094, 220.780029296875, 213.42445373535156, 232.5608673095703, 222.68557739257812, 224.99554443359375, 238.78787231445312, 219.60755920410156, 220.87733459472656, 246.76812744140625, 239.29649353027344, 240.95401000976562, 263.26715087890625, 261.12103271484375, 260.8277587890625, 240.32928466796875, 223.62928771972656, 218.50845336914062, 239.94801330566406, 222.20590209960938, 253.30130004882812, 237.81959533691406, 226.45980834960938, 246.93560791015625, 249.46987915039062, 234.60008239746094, 221.62921142578125, 242.90065002441406, 226.68389892578125, 233.4449005126953, 238.16900634765625, 229.46083068847656, 237.25697326660156, 251.24398803710938, 236.837646484375, 234.4951934814453, 243.40061950683594, 225.595703125, 232.46018981933594, 240.89219665527344, 228.0338592529297, 224.24075317382812, 243.5813751220703, 232.9595489501953, 245.89462280273438, 254.77378845214844, 240.49229431152344, 240.18142700195312, 237.91824340820312, 229.13064575195312, 236.56570434570312, 251.4462890625, 251.75778198242188, 291.2410888671875, 243.5029296875, 243.51437377929688, 244.60545349121094, 244.62106323242188, 234.22642517089844, 252.17518615722656, 259.82147216796875, 253.94825744628906, 262.3238525390625, 241.91818237304688, 233.77456665039062, 231.5596466064453, 251.64364624023438, 238.0005645751953, 247.45870971679688, 250.23460388183594, 244.02792358398438, 239.9375, 246.21987915039062, 231.83529663085938, 226.24493408203125, 258.68109130859375, 253.71719360351562, 266.1638488769531, 240.39974975585938, 238.03883361816406, 260.91168212890625, 242.51083374023438, 240.5770721435547, 268.506591796875, 245.82138061523438, 238.75674438476562, 263.1990966796875, 250.04684448242188, 242.31057739257812, 238.74649047851562, 254.63845825195312, 250.39834594726562, 259.2873840332031, 257.47613525390625, 250.20571899414062, 249.18670654296875, 247.41952514648438, 237.47723388671875, 235.34994506835938, 258.51934814453125, 248.27032470703125, 256.5822448730469, 264.91412353515625, 261.2141418457031, 266.5226745605469, 259.5149230957031, 253.67477416992188, 264.56109619140625, 257.94268798828125, 250.30714416503906, 276.97454833984375, 248.61819458007812, 238.04916381835938, 238.52040100097656, 262.4573059082031, 267.564697265625, 264.0257568359375, 265.5270690917969, 254.58303833007812, 257.7320861816406, 271.1839599609375, 260.71234130859375, 261.2414855957031, 269.9574890136719, 263.3025817871094, 272.5090637207031, 276.9688720703125, 269.89654541015625, 269.957763671875, 276.43603515625, 288.83367919921875, 325.1101379394531, 271.0771484375, 287.29522705078125, 347.4416198730469, 268.6408996582031, 263.44232177734375, 277.66455078125, 274.1307373046875, 268.27593994140625, 275.9475402832031, 269.0600891113281, 270.9355163574219, 271.38067626953125, 293.0168762207031, 294.1997985839844, 318.4900817871094, 287.87811279296875, 275.90338134765625, 279.28570556640625, 276.4892883300781, 274.3894958496094, 281.05322265625, 289.52545166015625, 282.6499328613281, 277.77130126953125, 295.5430908203125, 303.8149719238281, 338.65228271484375, 277.68658447265625, 273.61993408203125, 271.86602783203125, 301.6903381347656, 303.47186279296875, 331.92083740234375, 268.11431884765625, 265.869140625, 271.62054443359375, 287.63287353515625, 283.4216613769531, 299.6116943359375, 281.35736083984375, 277.9797668457031, 287.63299560546875, 289.4767761230469, 294.99078369140625, 306.8837585449219, 298.0177917480469, 292.9007263183594, 297.3879699707031, 287.3365783691406, 294.0700988769531, 305.9577331542969, 282.1213073730469, 285.92303466796875, 305.35498046875, 288.8056640625, 298.2877502441406, 306.47833251953125, 291.7304992675781, 294.57305908203125, 306.3399353027344, 306.17864990234375, 303.9519958496094, 298.9942626953125, 292.0149841308594, 296.72991943359375, 305.8209228515625, 309.55792236328125, 305.7448425292969, 308.6402587890625, 292.7779541015625, 292.1789855957031, 296.7340087890625, 308.33599853515625, 314.016845703125, 345.8269348144531, 294.3402099609375, 293.4899597167969, 307.7074890136719, 304.92327880859375, 308.2930908203125, 321.6202697753906, 290.6161804199219, 292.92132568359375, 293.96142578125, 315.560546875, 314.1277770996094, 319.50323486328125, 317.7062072753906, 314.522705078125, 339.5002136230469, 304.98284912109375, 302.94146728515625, 303.35003662109375, 305.9152526855469, 307.2983093261719, 313.29583740234375, 312.3543701171875, 332.01654052734375, 380.19842529296875, 309.08001708984375, 310.548828125, 319.23876953125, 309.73565673828125, 309.91546630859375, 320.3847351074219, 315.052490234375, 316.8179016113281, 348.2354736328125, 308.9962463378906, 313.2668151855469, 329.119140625, 313.6253662109375, 338.2978210449219, 365.75445556640625, 303.8120422363281, 307.92913818359375, 338.1043395996094, 297.4571533203125, 304.5600280761719, 312.8099365234375, 317.88592529296875, 329.4150085449219, 339.34033203125, 300.689697265625, 312.9947509765625, 320.1678161621094, 304.79022216796875, 312.5983581542969, 328.5147705078125, 312.03228759765625, 329.92449951171875, 370.2761535644531, 301.82470703125, 309.4911193847656, 321.80145263671875, 312.37823486328125, 324.86871337890625, 328.1216125488281, 309.9021301269531, 320.7536315917969, 329.12591552734375, 318.4219055175781, 323.5434265136719, 325.87298583984375, 313.8462219238281, 317.9273681640625, 341.14093017578125, 309.899658203125, 313.1237487792969, 327.5733947753906, 326.27655029296875, 326.5853271484375, 329.8466491699219, 319.37091064453125, 328.3035888671875, 332.4083557128906, 324.29376220703125, 328.0825500488281, 330.0244140625, 313.10382080078125, 323.1716613769531, 346.24395751953125, 321.2017822265625, 332.5537109375, 328.3407897949219, 322.56915283203125, 329.0609130859375, 326.54669189453125, 303.34466552734375, 311.45166015625, 326.8108825683594]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CCCma_CMAM-refC2', 'plotstyle': {'color': 'red', 'linestyle': 'solid', 'marker': 'x'}, 'x': ['1960-09-16 00:00:00', '1960-10-16 12:00:00', '1960-11-16 00:00:00', '1961-09-16 00:00:00', '1961-10-16 12:00:00', '1961-11-16 00:00:00', '1962-09-16 00:00:00', '1962-10-16 12:00:00', '1962-11-16 00:00:00', '1963-09-16 00:00:00', '1963-10-16 12:00:00', '1963-11-16 00:00:00', '1964-09-16 00:00:00', '1964-10-16 12:00:00', '1964-11-16 00:00:00', '1965-09-16 00:00:00', '1965-10-16 12:00:00', '1965-11-16 00:00:00', '1966-09-16 00:00:00', '1966-10-16 12:00:00', '1966-11-16 00:00:00', '1967-09-16 00:00:00', '1967-10-16 12:00:00', '1967-11-16 00:00:00', '1968-09-16 00:00:00', '1968-10-16 12:00:00', '1968-11-16 00:00:00', '1969-09-16 00:00:00', '1969-10-16 12:00:00', '1969-11-16 00:00:00', '1970-09-16 00:00:00', '1970-10-16 12:00:00', '1970-11-16 00:00:00', '1971-09-16 00:00:00', '1971-10-16 12:00:00', '1971-11-16 00:00:00', '1972-09-16 00:00:00', '1972-10-16 12:00:00', '1972-11-16 00:00:00', '1973-09-16 00:00:00', '1973-10-16 12:00:00', '1973-11-16 00:00:00', '1974-09-16 00:00:00', '1974-10-16 12:00:00', '1974-11-16 00:00:00', '1975-09-16 00:00:00', '1975-10-16 12:00:00', '1975-11-16 00:00:00', '1976-09-16 00:00:00', '1976-10-16 12:00:00', '1976-11-16 00:00:00', '1977-09-16 00:00:00', '1977-10-16 12:00:00', '1977-11-16 00:00:00', '1978-09-16 00:00:00', '1978-10-16 12:00:00', '1978-11-16 00:00:00', '1979-09-16 00:00:00', '1979-10-16 12:00:00', '1979-11-16 00:00:00', '1980-09-16 00:00:00', '1980-10-16 12:00:00', '1980-11-16 00:00:00', '1981-09-16 00:00:00', '1981-10-16 12:00:00', '1981-11-16 00:00:00', '1982-09-16 00:00:00', '1982-10-16 12:00:00', '1982-11-16 00:00:00', '1983-09-16 00:00:00', '1983-10-16 12:00:00', '1983-11-16 00:00:00', '1984-09-16 00:00:00', '1984-10-16 12:00:00', '1984-11-16 00:00:00', '1985-09-16 00:00:00', '1985-10-16 12:00:00', '1985-11-16 00:00:00', '1986-09-16 00:00:00', '1986-10-16 12:00:00', '1986-11-16 00:00:00', '1987-09-16 00:00:00', '1987-10-16 12:00:00', '1987-11-16 00:00:00', '1988-09-16 00:00:00', '1988-10-16 12:00:00', '1988-11-16 00:00:00', '1989-09-16 00:00:00', '1989-10-16 12:00:00', '1989-11-16 00:00:00', '1990-09-16 00:00:00', '1990-10-16 12:00:00', '1990-11-16 00:00:00', '1991-09-16 00:00:00', '1991-10-16 12:00:00', '1991-11-16 00:00:00', '1992-09-16 00:00:00', '1992-10-16 12:00:00', '1992-11-16 00:00:00', '1993-09-16 00:00:00', '1993-10-16 12:00:00', '1993-11-16 00:00:00', '1994-09-16 00:00:00', '1994-10-16 12:00:00', '1994-11-16 00:00:00', '1995-09-16 00:00:00', '1995-10-16 12:00:00', '1995-11-16 00:00:00', '1996-09-16 00:00:00', '1996-10-16 12:00:00', '1996-11-16 00:00:00', '1997-09-16 00:00:00', '1997-10-16 12:00:00', '1997-11-16 00:00:00', '1998-09-16 00:00:00', '1998-10-16 12:00:00', '1998-11-16 00:00:00', '1999-09-16 00:00:00', '1999-10-16 12:00:00', '1999-11-16 00:00:00', '2000-09-16 00:00:00', '2000-10-16 12:00:00', '2000-11-16 00:00:00', '2001-09-16 00:00:00', '2001-10-16 12:00:00', '2001-11-16 00:00:00', '2002-09-16 00:00:00', '2002-10-16 12:00:00', '2002-11-16 00:00:00', '2003-09-16 00:00:00', '2003-10-16 12:00:00', '2003-11-16 00:00:00', '2004-09-16 00:00:00', '2004-10-16 12:00:00', '2004-11-16 00:00:00', '2005-09-16 00:00:00', '2005-10-16 12:00:00', '2005-11-16 00:00:00', '2006-09-16 00:00:00', '2006-10-16 12:00:00', '2006-11-16 00:00:00', '2007-09-16 00:00:00', '2007-10-16 12:00:00', '2007-11-16 00:00:00', '2008-09-16 00:00:00', '2008-10-16 12:00:00', '2008-11-16 00:00:00', '2009-09-16 00:00:00', '2009-10-16 12:00:00', '2009-11-16 00:00:00', '2010-09-16 00:00:00', '2010-10-16 12:00:00', '2010-11-16 00:00:00', '2011-09-16 00:00:00', '2011-10-16 12:00:00', '2011-11-16 00:00:00', '2012-09-16 00:00:00', '2012-10-16 12:00:00', '2012-11-16 00:00:00', '2013-09-16 00:00:00', '2013-10-16 12:00:00', '2013-11-16 00:00:00', '2014-09-16 00:00:00', '2014-10-16 12:00:00', '2014-11-16 00:00:00', '2015-09-16 00:00:00', '2015-10-16 12:00:00', '2015-11-16 00:00:00', '2016-09-16 00:00:00', '2016-10-16 12:00:00', '2016-11-16 00:00:00', '2017-09-16 00:00:00', '2017-10-16 12:00:00', '2017-11-16 00:00:00', '2018-09-16 00:00:00', '2018-10-16 12:00:00', '2018-11-16 00:00:00', '2019-09-16 00:00:00', '2019-10-16 12:00:00', '2019-11-16 00:00:00', '2020-09-16 00:00:00', '2020-10-16 12:00:00', '2020-11-16 00:00:00', '2021-09-16 00:00:00', '2021-10-16 12:00:00', '2021-11-16 00:00:00', '2022-09-16 00:00:00', '2022-10-16 12:00:00', '2022-11-16 00:00:00', '2023-09-16 00:00:00', '2023-10-16 12:00:00', '2023-11-16 00:00:00', '2024-09-16 00:00:00', '2024-10-16 12:00:00', '2024-11-16 00:00:00', '2025-09-16 00:00:00', '2025-10-16 12:00:00', '2025-11-16 00:00:00', '2026-09-16 00:00:00', '2026-10-16 12:00:00', '2026-11-16 00:00:00', '2027-09-16 00:00:00', '2027-10-16 12:00:00', '2027-11-16 00:00:00', '2028-09-16 00:00:00', '2028-10-16 12:00:00', '2028-11-16 00:00:00', '2029-09-16 00:00:00', '2029-10-16 12:00:00', '2029-11-16 00:00:00', '2030-09-16 00:00:00', '2030-10-16 12:00:00', '2030-11-16 00:00:00', '2031-09-16 00:00:00', '2031-10-16 12:00:00', '2031-11-16 00:00:00', '2032-09-16 00:00:00', '2032-10-16 12:00:00', '2032-11-16 00:00:00', '2033-09-16 00:00:00', '2033-10-16 12:00:00', '2033-11-16 00:00:00', '2034-09-16 00:00:00', '2034-10-16 12:00:00', '2034-11-16 00:00:00', '2035-09-16 00:00:00', '2035-10-16 12:00:00', '2035-11-16 00:00:00', '2036-09-16 00:00:00', '2036-10-16 12:00:00', '2036-11-16 00:00:00', '2037-09-16 00:00:00', '2037-10-16 12:00:00', '2037-11-16 00:00:00', '2038-09-16 00:00:00', '2038-10-16 12:00:00', '2038-11-16 00:00:00', '2039-09-16 00:00:00', '2039-10-16 12:00:00', '2039-11-16 00:00:00', '2040-09-16 00:00:00', '2040-10-16 12:00:00', '2040-11-16 00:00:00', '2041-09-16 00:00:00', '2041-10-16 12:00:00', '2041-11-16 00:00:00', '2042-09-16 00:00:00', '2042-10-16 12:00:00', '2042-11-16 00:00:00', '2043-09-16 00:00:00', '2043-10-16 12:00:00', '2043-11-16 00:00:00', '2044-09-16 00:00:00', '2044-10-16 12:00:00', '2044-11-16 00:00:00', '2045-09-16 00:00:00', '2045-10-16 12:00:00', '2045-11-16 00:00:00', '2046-09-16 00:00:00', '2046-10-16 12:00:00', '2046-11-16 00:00:00', '2047-09-16 00:00:00', '2047-10-16 12:00:00', '2047-11-16 00:00:00', '2048-09-16 00:00:00', '2048-10-16 12:00:00', '2048-11-16 00:00:00', '2049-09-16 00:00:00', '2049-10-16 12:00:00', '2049-11-16 00:00:00', '2050-09-16 00:00:00', '2050-10-16 12:00:00', '2050-11-16 00:00:00', '2051-09-16 00:00:00', '2051-10-16 12:00:00', '2051-11-16 00:00:00', '2052-09-16 00:00:00', '2052-10-16 12:00:00', '2052-11-16 00:00:00', '2053-09-16 00:00:00', '2053-10-16 12:00:00', '2053-11-16 00:00:00', '2054-09-16 00:00:00', '2054-10-16 12:00:00', '2054-11-16 00:00:00', '2055-09-16 00:00:00', '2055-10-16 12:00:00', '2055-11-16 00:00:00', '2056-09-16 00:00:00', '2056-10-16 12:00:00', '2056-11-16 00:00:00', '2057-09-16 00:00:00', '2057-10-16 12:00:00', '2057-11-16 00:00:00', '2058-09-16 00:00:00', '2058-10-16 12:00:00', '2058-11-16 00:00:00', '2059-09-16 00:00:00', '2059-10-16 12:00:00', '2059-11-16 00:00:00', '2060-09-16 00:00:00', '2060-10-16 12:00:00', '2060-11-16 00:00:00', '2061-09-16 00:00:00', '2061-10-16 12:00:00', '2061-11-16 00:00:00', '2062-09-16 00:00:00', '2062-10-16 12:00:00', '2062-11-16 00:00:00', '2063-09-16 00:00:00', '2063-10-16 12:00:00', '2063-11-16 00:00:00', '2064-09-16 00:00:00', '2064-10-16 12:00:00', '2064-11-16 00:00:00', '2065-09-16 00:00:00', '2065-10-16 12:00:00', '2065-11-16 00:00:00', '2066-09-16 00:00:00', '2066-10-16 12:00:00', '2066-11-16 00:00:00', '2067-09-16 00:00:00', '2067-10-16 12:00:00', '2067-11-16 00:00:00', '2068-09-16 00:00:00', '2068-10-16 12:00:00', '2068-11-16 00:00:00', '2069-09-16 00:00:00', '2069-10-16 12:00:00', '2069-11-16 00:00:00', '2070-09-16 00:00:00', '2070-10-16 12:00:00', '2070-11-16 00:00:00', '2071-09-16 00:00:00', '2071-10-16 12:00:00', '2071-11-16 00:00:00', '2072-09-16 00:00:00', '2072-10-16 12:00:00', '2072-11-16 00:00:00', '2073-09-16 00:00:00', '2073-10-16 12:00:00', '2073-11-16 00:00:00', '2074-09-16 00:00:00', '2074-10-16 12:00:00', '2074-11-16 00:00:00', '2075-09-16 00:00:00', '2075-10-16 12:00:00', '2075-11-16 00:00:00', '2076-09-16 00:00:00', '2076-10-16 12:00:00', '2076-11-16 00:00:00', '2077-09-16 00:00:00', '2077-10-16 12:00:00', '2077-11-16 00:00:00', '2078-09-16 00:00:00', '2078-10-16 12:00:00', '2078-11-16 00:00:00', '2079-09-16 00:00:00', '2079-10-16 12:00:00', '2079-11-16 00:00:00', '2080-09-16 00:00:00', '2080-10-16 12:00:00', '2080-11-16 00:00:00', '2081-09-16 00:00:00', '2081-10-16 12:00:00', '2081-11-16 00:00:00', '2082-09-16 00:00:00', '2082-10-16 12:00:00', '2082-11-16 00:00:00', '2083-09-16 00:00:00', '2083-10-16 12:00:00', '2083-11-16 00:00:00', '2084-09-16 00:00:00', '2084-10-16 12:00:00', '2084-11-16 00:00:00', '2085-09-16 00:00:00', '2085-10-16 12:00:00', '2085-11-16 00:00:00', '2086-09-16 00:00:00', '2086-10-16 12:00:00', '2086-11-16 00:00:00', '2087-09-16 00:00:00', '2087-10-16 12:00:00', '2087-11-16 00:00:00', '2088-09-16 00:00:00', '2088-10-16 12:00:00', '2088-11-16 00:00:00', '2089-09-16 00:00:00', '2089-10-16 12:00:00', '2089-11-16 00:00:00', '2090-09-16 00:00:00', '2090-10-16 12:00:00', '2090-11-16 00:00:00', '2091-09-16 00:00:00', '2091-10-16 12:00:00', '2091-11-16 00:00:00', '2092-09-16 00:00:00', '2092-10-16 12:00:00', '2092-11-16 00:00:00', '2093-09-16 00:00:00', '2093-10-16 12:00:00', '2093-11-16 00:00:00', '2094-09-16 00:00:00', '2094-10-16 12:00:00', '2094-11-16 00:00:00', '2095-09-16 00:00:00', '2095-10-16 12:00:00', '2095-11-16 00:00:00', '2096-09-16 00:00:00', '2096-10-16 12:00:00', '2096-11-16 00:00:00', '2097-09-16 00:00:00', '2097-10-16 12:00:00', '2097-11-16 00:00:00', '2098-09-16 00:00:00', '2098-10-16 12:00:00', '2098-11-16 00:00:00', '2099-09-16 00:00:00', '2099-10-16 12:00:00', '2099-11-16 00:00:00', '2100-09-16 00:00:00', '2100-10-16 12:00:00', '2100-11-16 00:00:00'], 'y': [312.01544189453125, 321.8052978515625, 318.4827880859375, 373.5628967285156, 427.5948791503906, 400.84918212890625, 306.7142639160156, 329.4429016113281, 394.7228698730469, 313.3193664550781, 314.0513916015625, 332.553955078125, 300.83721923828125, 322.06768798828125, 374.71234130859375, 329.58880615234375, 334.6397705078125, 357.74755859375, 321.6456298828125, 326.34283447265625, 334.3711853027344, 324.7497253417969, 357.7966003417969, 404.03704833984375, 327.3304443359375, 320.51251220703125, 342.7430725097656, 340.0590515136719, 357.45513916015625, 376.7799072265625, 394.953125, 362.32061767578125, 385.54278564453125, 287.12469482421875, 281.5145568847656, 301.01861572265625, 309.72601318359375, 324.8658142089844, 372.05517578125, 332.909423828125, 311.63006591796875, 338.9363098144531, 322.7637939453125, 334.6484680175781, 371.902587890625, 304.3301086425781, 292.67156982421875, 292.39471435546875, 299.1558837890625, 325.49249267578125, 363.230712890625, 344.06671142578125, 346.3625793457031, 372.7225646972656, 321.47698974609375, 313.2578125, 310.52728271484375, 303.9569396972656, 298.3292541503906, 313.9091491699219, 289.7911071777344, 290.7610778808594, 307.8988037109375, 277.49273681640625, 272.6202392578125, 331.23065185546875, 289.68841552734375, 273.2861328125, 298.5314025878906, 311.4185791015625, 315.7268371582031, 329.7130126953125, 257.7281188964844, 232.57305908203125, 246.62240600585938, 281.7569580078125, 281.5671081542969, 343.7681579589844, 286.9586181640625, 280.95062255859375, 307.6033020019531, 237.86260986328125, 206.41189575195312, 227.33407592773438, 297.22674560546875, 284.2293395996094, 287.25830078125, 236.30657958984375, 189.95278930664062, 212.10302734375, 237.62188720703125, 201.34251403808594, 216.13211059570312, 246.57431030273438, 212.2509307861328, 240.06710815429688, 215.38287353515625, 164.74615478515625, 201.4347381591797, 252.10641479492188, 226.8505859375, 244.104736328125, 292.19146728515625, 288.90716552734375, 294.945556640625, 223.27359008789062, 182.56277465820312, 274.3896484375, 203.39166259765625, 153.09133911132812, 192.7349395751953, 207.366455078125, 157.0463409423828, 184.77017211914062, 202.83901977539062, 171.65333557128906, 214.1165771484375, 197.46685791015625, 152.93301391601562, 212.73223876953125, 226.1682891845703, 175.1841583251953, 196.029296875, 198.10987854003906, 163.6394500732422, 202.95472717285156, 243.79519653320312, 211.00863647460938, 237.4976806640625, 194.27247619628906, 151.04623413085938, 188.48947143554688, 237.41622924804688, 217.73675537109375, 251.48605346679688, 215.3482666015625, 170.17315673828125, 195.7115936279297, 218.75985717773438, 214.1609649658203, 224.5288848876953, 237.1565704345703, 193.3150634765625, 258.397216796875, 206.32005310058594, 174.82298278808594, 198.19467163085938, 247.32272338867188, 231.63563537597656, 279.321044921875, 232.88058471679688, 199.65554809570312, 241.56573486328125, 213.29037475585938, 168.49774169921875, 180.65444946289062, 256.9222106933594, 201.46484375, 234.4866485595703, 262.0504455566406, 231.41836547851562, 234.25340270996094, 224.51638793945312, 191.8742218017578, 212.0470733642578, 273.3935546875, 305.19451904296875, 300.61370849609375, 235.7860870361328, 191.82229614257812, 229.9238739013672, 250.47042846679688, 232.12864685058594, 267.54998779296875, 234.28518676757812, 185.7843017578125, 201.60357666015625, 273.01336669921875, 232.46702575683594, 250.86016845703125, 222.879638671875, 176.82994079589844, 208.74867248535156, 237.44076538085938, 199.92279052734375, 193.34197998046875, 280.7780456542969, 226.6374969482422, 233.25181579589844, 240.9012451171875, 203.2626953125, 228.03091430664062, 243.83233642578125, 201.94593811035156, 204.37222290039062, 236.458984375, 187.44285583496094, 191.40281677246094, 238.91358947753906, 205.51388549804688, 238.49957275390625, 243.65711975097656, 225.85870361328125, 238.71560668945312, 249.88990783691406, 221.92959594726562, 216.07559204101562, 284.20538330078125, 293.71832275390625, 275.19647216796875, 252.03933715820312, 212.94815063476562, 234.10757446289062, 236.72018432617188, 197.2996826171875, 225.4600067138672, 262.1656799316406, 238.1283416748047, 270.41839599609375, 237.76019287109375, 196.27313232421875, 237.868896484375, 242.56405639648438, 202.6681365966797, 206.2445068359375, 243.76702880859375, 208.06695556640625, 218.17713928222656, 257.31329345703125, 217.80154418945312, 227.81849670410156, 286.9660339355469, 263.3874206542969, 299.5919189453125, 251.55613708496094, 199.07594299316406, 209.27676391601562, 275.63824462890625, 272.8795471191406, 310.90875244140625, 264.97772216796875, 222.54087829589844, 222.7447509765625, 257.0205078125, 252.53036499023438, 253.16720581054688, 245.5787353515625, 198.80113220214844, 209.8203125, 259.9139404296875, 235.1575164794922, 274.36773681640625, 321.09869384765625, 319.83038330078125, 342.36932373046875, 248.2819366455078, 207.65968322753906, 233.47650146484375, 272.4914855957031, 250.78038024902344, 280.52801513671875, 266.4096984863281, 227.0115203857422, 239.19552612304688, 293.8797912597656, 278.2767333984375, 333.179931640625, 289.09625244140625, 276.0455322265625, 285.40277099609375, 296.13482666015625, 295.1759948730469, 296.30810546875, 281.10369873046875, 272.2876281738281, 284.0234375, 268.8075256347656, 281.95367431640625, 275.3345947265625, 300.2385559082031, 290.67230224609375, 320.2640380859375, 270.08123779296875, 233.30471801757812, 243.20620727539062, 276.41436767578125, 243.27572631835938, 245.01992797851562, 266.3614807128906, 261.0185546875, 283.4292297363281, 277.75762939453125, 309.000732421875, 369.28546142578125, 285.9642333984375, 267.0955505371094, 263.32049560546875, 276.75726318359375, 246.17767333984375, 252.60818481445312, 289.3187561035156, 263.9275817871094, 265.2579345703125, 257.1279602050781, 230.58856201171875, 233.45498657226562, 289.55841064453125, 264.52960205078125, 270.1807861328125, 315.7706604003906, 304.7431335449219, 340.9957275390625, 278.408447265625, 262.8204040527344, 293.58734130859375, 290.67987060546875, 299.0083923339844, 345.10089111328125, 310.1650390625, 306.5872802734375, 308.46478271484375, 275.6328125, 255.29432678222656, 280.28497314453125, 303.5191955566406, 280.819580078125, 290.4093017578125, 278.7304382324219, 269.536376953125, 268.73663330078125, 293.6918640136719, 283.7518310546875, 275.69000244140625, 301.6622314453125, 280.521484375, 291.556884765625, 283.381103515625, 278.75543212890625, 307.9370422363281, 292.0855712890625, 271.94000244140625, 285.7817687988281, 271.4925842285156, 244.1055145263672, 241.925048828125, 294.2793884277344, 292.35357666015625, 298.56024169921875, 288.7666015625, 271.3594665527344, 287.8674621582031, 275.1510314941406, 249.36611938476562, 254.5976104736328, 293.3354187011719, 279.18768310546875, 296.02777099609375, 317.8662109375, 311.8207702636719, 345.7229919433594, 304.28887939453125, 297.58734130859375, 320.52471923828125, 269.85638427734375, 249.4162139892578, 261.3587646484375, 316.92706298828125, 308.8054504394531, 313.5499572753906, 322.54412841796875, 314.77496337890625, 325.02813720703125, 327.51513671875, 315.546875, 313.0611267089844, 278.20135498046875, 259.76629638671875, 286.3831787109375, 314.5423278808594, 317.61236572265625, 333.60662841796875, 304.7137451171875, 306.5250244140625, 341.5413818359375, 284.80853271484375, 269.23724365234375, 274.0869140625, 282.0198974609375, 279.8678894042969, 317.8340759277344, 313.3314514160156, 300.4289855957031, 299.8388977050781, 305.6490478515625, 297.69720458984375, 317.6639709472656, 321.02197265625, 312.2932434082031, 320.81817626953125, 292.4630126953125, 274.04180908203125, 275.1113586425781, 312.26007080078125, 315.3774719238281, 317.0543212890625, 282.6333923339844, 266.8158874511719, 276.7140197753906, 295.3541259765625, 277.2128601074219, 282.3233642578125, 302.38616943359375, 296.98089599609375, 292.2677001953125, 317.2266845703125, 320.1060791015625, 331.880615234375, 331.47857666015625, 321.4004211425781, 335.9202880859375, 337.67657470703125, 342.46221923828125, 341.49407958984375]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CESM1-CAM4Chem_refC2_r1i1p1', 'plotstyle': {'color': 'darkorange', 'linestyle': 'dashed', 'marker': 'd'}, 'x': ['1960-09-16 00:00:00', '1960-10-16 12:00:00', '1960-11-16 00:00:00', '1961-09-16 00:00:00', '1961-10-16 12:00:00', '1961-11-16 00:00:00', '1962-09-16 00:00:00', '1962-10-16 12:00:00', '1962-11-16 00:00:00', '1963-09-16 00:00:00', '1963-10-16 12:00:00', '1963-11-16 00:00:00', '1964-09-16 00:00:00', '1964-10-16 12:00:00', '1964-11-16 00:00:00', '1965-09-16 00:00:00', '1965-10-16 12:00:00', '1965-11-16 00:00:00', '1966-09-16 00:00:00', '1966-10-16 12:00:00', '1966-11-16 00:00:00', '1967-09-16 00:00:00', '1967-10-16 12:00:00', '1967-11-16 00:00:00', '1968-09-16 00:00:00', '1968-10-16 12:00:00', '1968-11-16 00:00:00', '1969-09-16 00:00:00', '1969-10-16 12:00:00', '1969-11-16 00:00:00', '1970-09-16 00:00:00', '1970-10-16 12:00:00', '1970-11-16 00:00:00', '1971-09-16 00:00:00', '1971-10-16 12:00:00', '1971-11-16 00:00:00', '1972-09-16 00:00:00', '1972-10-16 12:00:00', '1972-11-16 00:00:00', '1973-09-16 00:00:00', '1973-10-16 12:00:00', '1973-11-16 00:00:00', '1974-09-16 00:00:00', '1974-10-16 12:00:00', '1974-11-16 00:00:00', '1975-09-16 00:00:00', '1975-10-16 12:00:00', '1975-11-16 00:00:00', '1976-09-16 00:00:00', '1976-10-16 12:00:00', '1976-11-16 00:00:00', '1977-09-16 00:00:00', '1977-10-16 12:00:00', '1977-11-16 00:00:00', '1978-09-16 00:00:00', '1978-10-16 12:00:00', '1978-11-16 00:00:00', '1979-09-16 00:00:00', '1979-10-16 12:00:00', '1979-11-16 00:00:00', '1980-09-16 00:00:00', '1980-10-16 12:00:00', '1980-11-16 00:00:00', '1981-09-16 00:00:00', '1981-10-16 12:00:00', '1981-11-16 00:00:00', '1982-09-16 00:00:00', '1982-10-16 12:00:00', '1982-11-16 00:00:00', '1983-09-16 00:00:00', '1983-10-16 12:00:00', '1983-11-16 00:00:00', '1984-09-16 00:00:00', '1984-10-16 12:00:00', '1984-11-16 00:00:00', '1985-09-16 00:00:00', '1985-10-16 12:00:00', '1985-11-16 00:00:00', '1986-09-16 00:00:00', '1986-10-16 12:00:00', '1986-11-16 00:00:00', '1987-09-16 00:00:00', '1987-10-16 12:00:00', '1987-11-16 00:00:00', '1988-09-16 00:00:00', '1988-10-16 12:00:00', '1988-11-16 00:00:00', '1989-09-16 00:00:00', '1989-10-16 12:00:00', '1989-11-16 00:00:00', '1990-09-16 00:00:00', '1990-10-16 12:00:00', '1990-11-16 00:00:00', '1991-09-16 00:00:00', '1991-10-16 12:00:00', '1991-11-16 00:00:00', '1992-09-16 00:00:00', '1992-10-16 12:00:00', '1992-11-16 00:00:00', '1993-09-16 00:00:00', '1993-10-16 12:00:00', '1993-11-16 00:00:00', '1994-09-16 00:00:00', '1994-10-16 12:00:00', '1994-11-16 00:00:00', '1995-09-16 00:00:00', '1995-10-16 12:00:00', '1995-11-16 00:00:00', '1996-09-16 00:00:00', '1996-10-16 12:00:00', '1996-11-16 00:00:00', '1997-09-16 00:00:00', '1997-10-16 12:00:00', '1997-11-16 00:00:00', '1998-09-16 00:00:00', '1998-10-16 12:00:00', '1998-11-16 00:00:00', '1999-09-16 00:00:00', '1999-10-16 12:00:00', '1999-11-16 00:00:00', '2000-09-16 00:00:00', '2000-10-16 12:00:00', '2000-11-16 00:00:00', '2001-09-16 00:00:00', '2001-10-16 12:00:00', '2001-11-16 00:00:00', '2002-09-16 00:00:00', '2002-10-16 12:00:00', '2002-11-16 00:00:00', '2003-09-16 00:00:00', '2003-10-16 12:00:00', '2003-11-16 00:00:00', '2004-09-16 00:00:00', '2004-10-16 12:00:00', '2004-11-16 00:00:00', '2005-09-16 00:00:00', '2005-10-16 12:00:00', '2005-11-16 00:00:00', '2006-09-16 00:00:00', '2006-10-16 12:00:00', '2006-11-16 00:00:00', '2007-09-16 00:00:00', '2007-10-16 12:00:00', '2007-11-16 00:00:00', '2008-09-16 00:00:00', '2008-10-16 12:00:00', '2008-11-16 00:00:00', '2009-09-16 00:00:00', '2009-10-16 12:00:00', '2009-11-16 00:00:00', '2010-09-16 00:00:00', '2010-10-16 12:00:00', '2010-11-16 00:00:00', '2011-09-16 00:00:00', '2011-10-16 12:00:00', '2011-11-16 00:00:00', '2012-09-16 00:00:00', '2012-10-16 12:00:00', '2012-11-16 00:00:00', '2013-09-16 00:00:00', '2013-10-16 12:00:00', '2013-11-16 00:00:00', '2014-09-16 00:00:00', '2014-10-16 12:00:00', '2014-11-16 00:00:00', '2015-09-16 00:00:00', '2015-10-16 12:00:00', '2015-11-16 00:00:00', '2016-09-16 00:00:00', '2016-10-16 12:00:00', '2016-11-16 00:00:00', '2017-09-16 00:00:00', '2017-10-16 12:00:00', '2017-11-16 00:00:00', '2018-09-16 00:00:00', '2018-10-16 12:00:00', '2018-11-16 00:00:00', '2019-09-16 00:00:00', '2019-10-16 12:00:00', '2019-11-16 00:00:00', '2020-09-16 00:00:00', '2020-10-16 12:00:00', '2020-11-16 00:00:00', '2021-09-16 00:00:00', '2021-10-16 12:00:00', '2021-11-16 00:00:00', '2022-09-16 00:00:00', '2022-10-16 12:00:00', '2022-11-16 00:00:00', '2023-09-16 00:00:00', '2023-10-16 12:00:00', '2023-11-16 00:00:00', '2024-09-16 00:00:00', '2024-10-16 12:00:00', '2024-11-16 00:00:00', '2025-09-16 00:00:00', '2025-10-16 12:00:00', '2025-11-16 00:00:00', '2026-09-16 00:00:00', '2026-10-16 12:00:00', '2026-11-16 00:00:00', '2027-09-16 00:00:00', '2027-10-16 12:00:00', '2027-11-16 00:00:00', '2028-09-16 00:00:00', '2028-10-16 12:00:00', '2028-11-16 00:00:00', '2029-09-16 00:00:00', '2029-10-16 12:00:00', '2029-11-16 00:00:00', '2030-09-16 00:00:00', '2030-10-16 12:00:00', '2030-11-16 00:00:00', '2031-09-16 00:00:00', '2031-10-16 12:00:00', '2031-11-16 00:00:00', '2032-09-16 00:00:00', '2032-10-16 12:00:00', '2032-11-16 00:00:00', '2033-09-16 00:00:00', '2033-10-16 12:00:00', '2033-11-16 00:00:00', '2034-09-16 00:00:00', '2034-10-16 12:00:00', '2034-11-16 00:00:00', '2035-09-16 00:00:00', '2035-10-16 12:00:00', '2035-11-16 00:00:00', '2036-09-16 00:00:00', '2036-10-16 12:00:00', '2036-11-16 00:00:00', '2037-09-16 00:00:00', '2037-10-16 12:00:00', '2037-11-16 00:00:00', '2038-09-16 00:00:00', '2038-10-16 12:00:00', '2038-11-16 00:00:00', '2039-09-16 00:00:00', '2039-10-16 12:00:00', '2039-11-16 00:00:00', '2040-09-16 00:00:00', '2040-10-16 12:00:00', '2040-11-16 00:00:00', '2041-09-16 00:00:00', '2041-10-16 12:00:00', '2041-11-16 00:00:00', '2042-09-16 00:00:00', '2042-10-16 12:00:00', '2042-11-16 00:00:00', '2043-09-16 00:00:00', '2043-10-16 12:00:00', '2043-11-16 00:00:00', '2044-09-16 00:00:00', '2044-10-16 12:00:00', '2044-11-16 00:00:00', '2045-09-16 00:00:00', '2045-10-16 12:00:00', '2045-11-16 00:00:00', '2046-09-16 00:00:00', '2046-10-16 12:00:00', '2046-11-16 00:00:00', '2047-09-16 00:00:00', '2047-10-16 12:00:00', '2047-11-16 00:00:00', '2048-09-16 00:00:00', '2048-10-16 12:00:00', '2048-11-16 00:00:00', '2049-09-16 00:00:00', '2049-10-16 12:00:00', '2049-11-16 00:00:00', '2050-09-16 00:00:00', '2050-10-16 12:00:00', '2050-11-16 00:00:00', '2051-09-16 00:00:00', '2051-10-16 12:00:00', '2051-11-16 00:00:00', '2052-09-16 00:00:00', '2052-10-16 12:00:00', '2052-11-16 00:00:00', '2053-09-16 00:00:00', '2053-10-16 12:00:00', '2053-11-16 00:00:00', '2054-09-16 00:00:00', '2054-10-16 12:00:00', '2054-11-16 00:00:00', '2055-09-16 00:00:00', '2055-10-16 12:00:00', '2055-11-16 00:00:00', '2056-09-16 00:00:00', '2056-10-16 12:00:00', '2056-11-16 00:00:00', '2057-09-16 00:00:00', '2057-10-16 12:00:00', '2057-11-16 00:00:00', '2058-09-16 00:00:00', '2058-10-16 12:00:00', '2058-11-16 00:00:00', '2059-09-16 00:00:00', '2059-10-16 12:00:00', '2059-11-16 00:00:00', '2060-09-16 00:00:00', '2060-10-16 12:00:00', '2060-11-16 00:00:00', '2061-09-16 00:00:00', '2061-10-16 12:00:00', '2061-11-16 00:00:00', '2062-09-16 00:00:00', '2062-10-16 12:00:00', '2062-11-16 00:00:00', '2063-09-16 00:00:00', '2063-10-16 12:00:00', '2063-11-16 00:00:00', '2064-09-16 00:00:00', '2064-10-16 12:00:00', '2064-11-16 00:00:00', '2065-09-16 00:00:00', '2065-10-16 12:00:00', '2065-11-16 00:00:00', '2066-09-16 00:00:00', '2066-10-16 12:00:00', '2066-11-16 00:00:00', '2067-09-16 00:00:00', '2067-10-16 12:00:00', '2067-11-16 00:00:00', '2068-09-16 00:00:00', '2068-10-16 12:00:00', '2068-11-16 00:00:00', '2069-09-16 00:00:00', '2069-10-16 12:00:00', '2069-11-16 00:00:00', '2070-09-16 00:00:00', '2070-10-16 12:00:00', '2070-11-16 00:00:00', '2071-09-16 00:00:00', '2071-10-16 12:00:00', '2071-11-16 00:00:00', '2072-09-16 00:00:00', '2072-10-16 12:00:00', '2072-11-16 00:00:00', '2073-09-16 00:00:00', '2073-10-16 12:00:00', '2073-11-16 00:00:00', '2074-09-16 00:00:00', '2074-10-16 12:00:00', '2074-11-16 00:00:00', '2075-09-16 00:00:00', '2075-10-16 12:00:00', '2075-11-16 00:00:00', '2076-09-16 00:00:00', '2076-10-16 12:00:00', '2076-11-16 00:00:00', '2077-09-16 00:00:00', '2077-10-16 12:00:00', '2077-11-16 00:00:00', '2078-09-16 00:00:00', '2078-10-16 12:00:00', '2078-11-16 00:00:00', '2079-09-16 00:00:00', '2079-10-16 12:00:00', '2079-11-16 00:00:00', '2080-09-16 00:00:00', '2080-10-16 12:00:00', '2080-11-16 00:00:00', '2081-09-16 00:00:00', '2081-10-16 12:00:00', '2081-11-16 00:00:00', '2082-09-16 00:00:00', '2082-10-16 12:00:00', '2082-11-16 00:00:00', '2083-09-16 00:00:00', '2083-10-16 12:00:00', '2083-11-16 00:00:00', '2084-09-16 00:00:00', '2084-10-16 12:00:00', '2084-11-16 00:00:00', '2085-09-16 00:00:00', '2085-10-16 12:00:00', '2085-11-16 00:00:00', '2086-09-16 00:00:00', '2086-10-16 12:00:00', '2086-11-16 00:00:00', '2087-09-16 00:00:00', '2087-10-16 12:00:00', '2087-11-16 00:00:00', '2088-09-16 00:00:00', '2088-10-16 12:00:00', '2088-11-16 00:00:00', '2089-09-16 00:00:00', '2089-10-16 12:00:00', '2089-11-16 00:00:00', '2090-09-16 00:00:00', '2090-10-16 12:00:00', '2090-11-16 00:00:00', '2091-09-16 00:00:00', '2091-10-16 12:00:00', '2091-11-16 00:00:00', '2092-09-16 00:00:00', '2092-10-16 12:00:00', '2092-11-16 00:00:00', '2093-09-16 00:00:00', '2093-10-16 12:00:00', '2093-11-16 00:00:00', '2094-09-16 00:00:00', '2094-10-16 12:00:00', '2094-11-16 00:00:00', '2095-09-16 00:00:00', '2095-10-16 12:00:00', '2095-11-16 00:00:00', '2096-09-16 00:00:00', '2096-10-16 12:00:00', '2096-11-16 00:00:00', '2097-09-16 00:00:00', '2097-10-16 12:00:00', '2097-11-16 00:00:00', '2098-09-16 00:00:00', '2098-10-16 12:00:00', '2098-11-16 00:00:00', '2099-09-16 00:00:00', '2099-10-16 12:00:00', '2099-11-16 00:00:00', '2100-09-16 00:00:00', '2100-10-16 12:00:00', '2100-11-16 00:00:00'], 'y': [353.1313171386719, 352.05389404296875, 370.7903747558594, 331.83526611328125, 337.29351806640625, 332.6077880859375, 366.6236572265625, 348.2923889160156, 349.31707763671875, 377.1514587402344, 368.1007995605469, 354.50299072265625, 355.24749755859375, 355.0059814453125, 396.5921630859375, 343.625244140625, 339.8108215332031, 336.17059326171875, 349.7147521972656, 327.5218505859375, 325.9536437988281, 350.941650390625, 334.7482604980469, 372.12615966796875, 328.00408935546875, 322.44189453125, 314.44970703125, 347.700439453125, 323.0464782714844, 348.11993408203125, 335.816650390625, 321.13153076171875, 340.6331787109375, 375.8186950683594, 369.19891357421875, 355.9002380371094, 317.88916015625, 317.1134033203125, 357.81671142578125, 326.8087463378906, 324.02178955078125, 345.57379150390625, 294.02435302734375, 283.5927734375, 282.34185791015625, 310.98260498046875, 295.81097412109375, 310.5348815917969, 337.1804504394531, 342.4287109375, 357.91748046875, 299.5369873046875, 294.21051025390625, 308.4949951171875, 279.06268310546875, 260.83258056640625, 268.6300354003906, 302.1304626464844, 297.5106201171875, 298.6448974609375, 293.54278564453125, 274.1562194824219, 295.22296142578125, 303.22491455078125, 289.29840087890625, 309.95068359375, 274.97412109375, 225.72972106933594, 234.11268615722656, 278.4093322753906, 237.65679931640625, 252.22413635253906, 254.16744995117188, 207.97671508789062, 226.77337646484375, 292.9732666015625, 266.5666198730469, 303.19384765625, 223.18942260742188, 193.5574951171875, 214.49310302734375, 248.40126037597656, 195.49913024902344, 198.87286376953125, 245.44436645507812, 215.40029907226562, 229.76632690429688, 229.512939453125, 193.35397338867188, 232.9671630859375, 251.48158264160156, 200.491455078125, 217.5258331298828, 236.171630859375, 197.66241455078125, 236.38067626953125, 215.7960662841797, 164.34625244140625, 194.20884704589844, 190.6596221923828, 143.3970947265625, 161.2984161376953, 202.7552490234375, 152.3041229248047, 166.84490966796875, 273.95416259765625, 254.91075134277344, 268.9434814453125, 197.26132202148438, 179.90200805664062, 198.543212890625, 227.91986083984375, 180.63983154296875, 190.28289794921875, 220.71348571777344, 181.40133666992188, 206.1310272216797, 235.22702026367188, 199.3326416015625, 217.67161560058594, 205.25796508789062, 163.13133239746094, 199.97177124023438, 244.84280395507812, 205.67701721191406, 220.68133544921875, 243.367919921875, 198.9734649658203, 206.85169982910156, 206.70712280273438, 170.46597290039062, 184.6048583984375, 225.7847442626953, 169.10186767578125, 193.01312255859375, 262.17254638671875, 306.5072021484375, 327.634033203125, 251.97152709960938, 233.08462524414062, 238.87994384765625, 209.99160766601562, 179.4298095703125, 196.34954833984375, 243.5169219970703, 217.50277709960938, 232.22134399414062, 227.8970184326172, 178.02532958984375, 188.8404541015625, 227.5699462890625, 213.9361572265625, 221.8848114013672, 235.15707397460938, 196.99241638183594, 202.28053283691406, 254.8408966064453, 213.40423583984375, 223.2367401123047, 219.37908935546875, 174.5485382080078, 206.7681427001953, 227.16700744628906, 190.26870727539062, 203.3653564453125, 240.80494689941406, 177.6494598388672, 186.390625, 246.6778564453125, 215.19174194335938, 218.0501708984375, 207.89053344726562, 165.97158813476562, 182.07028198242188, 249.66305541992188, 223.8021240234375, 240.40147399902344, 243.5272979736328, 201.12022399902344, 215.83460998535156, 240.736328125, 191.8094482421875, 219.59051513671875, 230.91152954101562, 202.10987854003906, 217.1326904296875, 265.2745666503906, 256.36102294921875, 266.38690185546875, 271.3406982421875, 254.64208984375, 258.5712890625, 257.3938903808594, 206.166015625, 208.20492553710938, 243.80508422851562, 203.1929168701172, 246.32122802734375, 252.5797119140625, 221.6053466796875, 251.14779663085938, 259.15826416015625, 205.0536651611328, 216.09771728515625, 224.69772338867188, 177.83493041992188, 202.24212646484375, 246.10226440429688, 190.968505859375, 204.2706298828125, 252.00741577148438, 261.3140869140625, 269.6717224121094, 289.88873291015625, 243.98374938964844, 242.3511199951172, 254.69119262695312, 246.4996337890625, 270.23895263671875, 253.2159881591797, 213.2776336669922, 227.70840454101562, 285.171630859375, 260.11859130859375, 280.10003662109375, 262.0959777832031, 223.57742309570312, 245.88124084472656, 259.88568115234375, 216.56655883789062, 226.57620239257812, 280.505615234375, 260.0455017089844, 288.0707092285156, 262.0877685546875, 231.99356079101562, 242.04156494140625, 257.6296081542969, 235.16845703125, 241.81553649902344, 293.13336181640625, 275.9891052246094, 279.555908203125, 259.70562744140625, 220.05020141601562, 242.42156982421875, 295.663330078125, 292.07049560546875, 302.3602294921875, 267.1206359863281, 246.20022583007812, 258.9483947753906, 271.2991943359375, 247.4454345703125, 276.734619140625, 290.7255859375, 270.3551025390625, 274.80218505859375, 281.03814697265625, 267.5129699707031, 269.7552185058594, 267.5831298828125, 246.04873657226562, 254.61831665039062, 275.1285095214844, 256.146728515625, 266.99749755859375, 280.8775634765625, 249.7889862060547, 252.19615173339844, 265.5966796875, 252.64764404296875, 268.7893371582031, 284.9729919433594, 275.19854736328125, 288.5277099609375, 285.708251953125, 257.555419921875, 265.23577880859375, 295.0673828125, 271.67236328125, 273.0186767578125, 285.01104736328125, 251.4252166748047, 275.46771240234375, 285.79119873046875, 261.3714904785156, 274.45550537109375, 292.3905944824219, 285.37164306640625, 282.3432922363281, 313.6703796386719, 294.56121826171875, 289.1662902832031, 291.8369445800781, 265.3492736816406, 287.52545166015625, 290.74432373046875, 268.9522399902344, 270.40411376953125, 305.7489929199219, 298.8329162597656, 297.93572998046875, 291.506591796875, 312.843505859375, 325.029052734375, 300.7225341796875, 277.1959228515625, 278.80267333984375, 318.2765197753906, 302.36376953125, 294.8594970703125, 275.3856201171875, 253.2352294921875, 259.7738342285156, 305.40020751953125, 292.4349670410156, 304.98968505859375, 320.77423095703125, 287.8369445800781, 281.84625244140625, 316.5269470214844, 302.156982421875, 318.2308044433594, 296.7737121582031, 283.07281494140625, 316.3309326171875, 336.8802490234375, 320.1484069824219, 324.30816650390625, 307.2872314453125, 288.72100830078125, 295.4797058105469, 304.8622741699219, 288.8728942871094, 294.4170837402344, 300.52569580078125, 292.74017333984375, 285.788330078125, 285.154541015625, 273.82781982421875, 301.2880859375, 318.467041015625, 318.5018310546875, 320.29266357421875, 310.9317626953125, 295.8368835449219, 310.56005859375, 308.94830322265625, 289.0935363769531, 296.9487609863281, 301.06005859375, 282.27117919921875, 288.0964050292969, 328.5723876953125, 306.0311279296875, 303.56878662109375, 302.9425048828125, 294.712890625, 303.841552734375, 307.3906555175781, 288.142578125, 293.3165283203125, 339.04241943359375, 327.9918212890625, 333.71514892578125, 294.6421203613281, 279.448486328125, 285.63470458984375, 330.2760925292969, 318.9078369140625, 344.95257568359375, 325.3250732421875, 317.8257751464844, 342.961669921875, 313.13507080078125, 298.18475341796875, 307.84478759765625, 290.19427490234375, 282.7154541015625, 293.9735107421875, 316.61328125, 300.4488220214844, 322.2135009765625, 345.2583923339844, 338.6092224121094, 333.3365783691406, 307.564453125, 296.70306396484375, 309.74609375, 312.7708435058594, 315.27935791015625, 326.3284606933594, 334.68511962890625, 312.59930419921875, 306.63433837890625, 342.91925048828125, 369.09967041015625, 340.3334655761719, 312.7289733886719, 298.4283447265625, 300.542236328125, 307.9903259277344, 313.7489929199219, 305.70343017578125, 310.59722900390625, 321.51043701171875, 323.61785888671875, 304.8424987792969, 292.567138671875, 293.0079345703125, 301.80706787109375, 291.90484619140625, 306.6117858886719, 317.9581604003906, 306.66436767578125, 309.45037841796875, 319.3812255859375, 307.36676025390625, 306.7347412109375, 301.4939270019531, 286.20526123046875, 289.62750244140625]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CESM1-CAM4Chem_refC2_r2i1p1', 'plotstyle': {'color': 'darkorange', 'linestyle': 'dashed', 'marker': 'd'}, 'x': ['1960-09-16 00:00:00', '1960-10-16 12:00:00', '1960-11-16 00:00:00', '1961-09-16 00:00:00', '1961-10-16 12:00:00', '1961-11-16 00:00:00', '1962-09-16 00:00:00', '1962-10-16 12:00:00', '1962-11-16 00:00:00', '1963-09-16 00:00:00', '1963-10-16 12:00:00', '1963-11-16 00:00:00', '1964-09-16 00:00:00', '1964-10-16 12:00:00', '1964-11-16 00:00:00', '1965-09-16 00:00:00', '1965-10-16 12:00:00', '1965-11-16 00:00:00', '1966-09-16 00:00:00', '1966-10-16 12:00:00', '1966-11-16 00:00:00', '1967-09-16 00:00:00', '1967-10-16 12:00:00', '1967-11-16 00:00:00', '1968-09-16 00:00:00', '1968-10-16 12:00:00', '1968-11-16 00:00:00', '1969-09-16 00:00:00', '1969-10-16 12:00:00', '1969-11-16 00:00:00', '1970-09-16 00:00:00', '1970-10-16 12:00:00', '1970-11-16 00:00:00', '1971-09-16 00:00:00', '1971-10-16 12:00:00', '1971-11-16 00:00:00', '1972-09-16 00:00:00', '1972-10-16 12:00:00', '1972-11-16 00:00:00', '1973-09-16 00:00:00', '1973-10-16 12:00:00', '1973-11-16 00:00:00', '1974-09-16 00:00:00', '1974-10-16 12:00:00', '1974-11-16 00:00:00', '1975-09-16 00:00:00', '1975-10-16 12:00:00', '1975-11-16 00:00:00', '1976-09-16 00:00:00', '1976-10-16 12:00:00', '1976-11-16 00:00:00', '1977-09-16 00:00:00', '1977-10-16 12:00:00', '1977-11-16 00:00:00', '1978-09-16 00:00:00', '1978-10-16 12:00:00', '1978-11-16 00:00:00', '1979-09-16 00:00:00', '1979-10-16 12:00:00', '1979-11-16 00:00:00', '1980-09-16 00:00:00', '1980-10-16 12:00:00', '1980-11-16 00:00:00', '1981-09-16 00:00:00', '1981-10-16 12:00:00', '1981-11-16 00:00:00', '1982-09-16 00:00:00', '1982-10-16 12:00:00', '1982-11-16 00:00:00', '1983-09-16 00:00:00', '1983-10-16 12:00:00', '1983-11-16 00:00:00', '1984-09-16 00:00:00', '1984-10-16 12:00:00', '1984-11-16 00:00:00', '1985-09-16 00:00:00', '1985-10-16 12:00:00', '1985-11-16 00:00:00', '1986-09-16 00:00:00', '1986-10-16 12:00:00', '1986-11-16 00:00:00', '1987-09-16 00:00:00', '1987-10-16 12:00:00', '1987-11-16 00:00:00', '1988-09-16 00:00:00', '1988-10-16 12:00:00', '1988-11-16 00:00:00', '1989-09-16 00:00:00', '1989-10-16 12:00:00', '1989-11-16 00:00:00', '1990-09-16 00:00:00', '1990-10-16 12:00:00', '1990-11-16 00:00:00', '1991-09-16 00:00:00', '1991-10-16 12:00:00', '1991-11-16 00:00:00', '1992-09-16 00:00:00', '1992-10-16 12:00:00', '1992-11-16 00:00:00', '1993-09-16 00:00:00', '1993-10-16 12:00:00', '1993-11-16 00:00:00', '1994-09-16 00:00:00', '1994-10-16 12:00:00', '1994-11-16 00:00:00', '1995-09-16 00:00:00', '1995-10-16 12:00:00', '1995-11-16 00:00:00', '1996-09-16 00:00:00', '1996-10-16 12:00:00', '1996-11-16 00:00:00', '1997-09-16 00:00:00', '1997-10-16 12:00:00', '1997-11-16 00:00:00', '1998-09-16 00:00:00', '1998-10-16 12:00:00', '1998-11-16 00:00:00', '1999-09-16 00:00:00', '1999-10-16 12:00:00', '1999-11-16 00:00:00', '2000-09-16 00:00:00', '2000-10-16 12:00:00', '2000-11-16 00:00:00', '2001-09-16 00:00:00', '2001-10-16 12:00:00', '2001-11-16 00:00:00', '2002-09-16 00:00:00', '2002-10-16 12:00:00', '2002-11-16 00:00:00', '2003-09-16 00:00:00', '2003-10-16 12:00:00', '2003-11-16 00:00:00', '2004-09-16 00:00:00', '2004-10-16 12:00:00', '2004-11-16 00:00:00', '2005-09-16 00:00:00', '2005-10-16 12:00:00', '2005-11-16 00:00:00', '2006-09-16 00:00:00', '2006-10-16 12:00:00', '2006-11-16 00:00:00', '2007-09-16 00:00:00', '2007-10-16 12:00:00', '2007-11-16 00:00:00', '2008-09-16 00:00:00', '2008-10-16 12:00:00', '2008-11-16 00:00:00', '2009-09-16 00:00:00', '2009-10-16 12:00:00', '2009-11-16 00:00:00', '2010-09-16 00:00:00', '2010-10-16 12:00:00', '2010-11-16 00:00:00', '2011-09-16 00:00:00', '2011-10-16 12:00:00', '2011-11-16 00:00:00', '2012-09-16 00:00:00', '2012-10-16 12:00:00', '2012-11-16 00:00:00', '2013-09-16 00:00:00', '2013-10-16 12:00:00', '2013-11-16 00:00:00', '2014-09-16 00:00:00', '2014-10-16 12:00:00', '2014-11-16 00:00:00', '2015-09-16 00:00:00', '2015-10-16 12:00:00', '2015-11-16 00:00:00', '2016-09-16 00:00:00', '2016-10-16 12:00:00', '2016-11-16 00:00:00', '2017-09-16 00:00:00', '2017-10-16 12:00:00', '2017-11-16 00:00:00', '2018-09-16 00:00:00', '2018-10-16 12:00:00', '2018-11-16 00:00:00', '2019-09-16 00:00:00', '2019-10-16 12:00:00', '2019-11-16 00:00:00', '2020-09-16 00:00:00', '2020-10-16 12:00:00', '2020-11-16 00:00:00', '2021-09-16 00:00:00', '2021-10-16 12:00:00', '2021-11-16 00:00:00', '2022-09-16 00:00:00', '2022-10-16 12:00:00', '2022-11-16 00:00:00', '2023-09-16 00:00:00', '2023-10-16 12:00:00', '2023-11-16 00:00:00', '2024-09-16 00:00:00', '2024-10-16 12:00:00', '2024-11-16 00:00:00', '2025-09-16 00:00:00', '2025-10-16 12:00:00', '2025-11-16 00:00:00', '2026-09-16 00:00:00', '2026-10-16 12:00:00', '2026-11-16 00:00:00', '2027-09-16 00:00:00', '2027-10-16 12:00:00', '2027-11-16 00:00:00', '2028-09-16 00:00:00', '2028-10-16 12:00:00', '2028-11-16 00:00:00', '2029-09-16 00:00:00', '2029-10-16 12:00:00', '2029-11-16 00:00:00', '2030-09-16 00:00:00', '2030-10-16 12:00:00', '2030-11-16 00:00:00', '2031-09-16 00:00:00', '2031-10-16 12:00:00', '2031-11-16 00:00:00', '2032-09-16 00:00:00', '2032-10-16 12:00:00', '2032-11-16 00:00:00', '2033-09-16 00:00:00', '2033-10-16 12:00:00', '2033-11-16 00:00:00', '2034-09-16 00:00:00', '2034-10-16 12:00:00', '2034-11-16 00:00:00', '2035-09-16 00:00:00', '2035-10-16 12:00:00', '2035-11-16 00:00:00', '2036-09-16 00:00:00', '2036-10-16 12:00:00', '2036-11-16 00:00:00', '2037-09-16 00:00:00', '2037-10-16 12:00:00', '2037-11-16 00:00:00', '2038-09-16 00:00:00', '2038-10-16 12:00:00', '2038-11-16 00:00:00', '2039-09-16 00:00:00', '2039-10-16 12:00:00', '2039-11-16 00:00:00', '2040-09-16 00:00:00', '2040-10-16 12:00:00', '2040-11-16 00:00:00', '2041-09-16 00:00:00', '2041-10-16 12:00:00', '2041-11-16 00:00:00', '2042-09-16 00:00:00', '2042-10-16 12:00:00', '2042-11-16 00:00:00', '2043-09-16 00:00:00', '2043-10-16 12:00:00', '2043-11-16 00:00:00', '2044-09-16 00:00:00', '2044-10-16 12:00:00', '2044-11-16 00:00:00', '2045-09-16 00:00:00', '2045-10-16 12:00:00', '2045-11-16 00:00:00', '2046-09-16 00:00:00', '2046-10-16 12:00:00', '2046-11-16 00:00:00', '2047-09-16 00:00:00', '2047-10-16 12:00:00', '2047-11-16 00:00:00', '2048-09-16 00:00:00', '2048-10-16 12:00:00', '2048-11-16 00:00:00', '2049-09-16 00:00:00', '2049-10-16 12:00:00', '2049-11-16 00:00:00', '2050-09-16 00:00:00', '2050-10-16 12:00:00', '2050-11-16 00:00:00', '2051-09-16 00:00:00', '2051-10-16 12:00:00', '2051-11-16 00:00:00', '2052-09-16 00:00:00', '2052-10-16 12:00:00', '2052-11-16 00:00:00', '2053-09-16 00:00:00', '2053-10-16 12:00:00', '2053-11-16 00:00:00', '2054-09-16 00:00:00', '2054-10-16 12:00:00', '2054-11-16 00:00:00', '2055-09-16 00:00:00', '2055-10-16 12:00:00', '2055-11-16 00:00:00', '2056-09-16 00:00:00', '2056-10-16 12:00:00', '2056-11-16 00:00:00', '2057-09-16 00:00:00', '2057-10-16 12:00:00', '2057-11-16 00:00:00', '2058-09-16 00:00:00', '2058-10-16 12:00:00', '2058-11-16 00:00:00', '2059-09-16 00:00:00', '2059-10-16 12:00:00', '2059-11-16 00:00:00', '2060-09-16 00:00:00', '2060-10-16 12:00:00', '2060-11-16 00:00:00', '2061-09-16 00:00:00', '2061-10-16 12:00:00', '2061-11-16 00:00:00', '2062-09-16 00:00:00', '2062-10-16 12:00:00', '2062-11-16 00:00:00', '2063-09-16 00:00:00', '2063-10-16 12:00:00', '2063-11-16 00:00:00', '2064-09-16 00:00:00', '2064-10-16 12:00:00', '2064-11-16 00:00:00', '2065-09-16 00:00:00', '2065-10-16 12:00:00', '2065-11-16 00:00:00', '2066-09-16 00:00:00', '2066-10-16 12:00:00', '2066-11-16 00:00:00', '2067-09-16 00:00:00', '2067-10-16 12:00:00', '2067-11-16 00:00:00', '2068-09-16 00:00:00', '2068-10-16 12:00:00', '2068-11-16 00:00:00', '2069-09-16 00:00:00', '2069-10-16 12:00:00', '2069-11-16 00:00:00', '2070-09-16 00:00:00', '2070-10-16 12:00:00', '2070-11-16 00:00:00', '2071-09-16 00:00:00', '2071-10-16 12:00:00', '2071-11-16 00:00:00', '2072-09-16 00:00:00', '2072-10-16 12:00:00', '2072-11-16 00:00:00', '2073-09-16 00:00:00', '2073-10-16 12:00:00', '2073-11-16 00:00:00', '2074-09-16 00:00:00', '2074-10-16 12:00:00', '2074-11-16 00:00:00', '2075-09-16 00:00:00', '2075-10-16 12:00:00', '2075-11-16 00:00:00', '2076-09-16 00:00:00', '2076-10-16 12:00:00', '2076-11-16 00:00:00', '2077-09-16 00:00:00', '2077-10-16 12:00:00', '2077-11-16 00:00:00', '2078-09-16 00:00:00', '2078-10-16 12:00:00', '2078-11-16 00:00:00', '2079-09-16 00:00:00', '2079-10-16 12:00:00', '2079-11-16 00:00:00', '2080-09-16 00:00:00', '2080-10-16 12:00:00', '2080-11-16 00:00:00', '2081-09-16 00:00:00', '2081-10-16 12:00:00', '2081-11-16 00:00:00', '2082-09-16 00:00:00', '2082-10-16 12:00:00', '2082-11-16 00:00:00', '2083-09-16 00:00:00', '2083-10-16 12:00:00', '2083-11-16 00:00:00', '2084-09-16 00:00:00', '2084-10-16 12:00:00', '2084-11-16 00:00:00', '2085-09-16 00:00:00', '2085-10-16 12:00:00', '2085-11-16 00:00:00', '2086-09-16 00:00:00', '2086-10-16 12:00:00', '2086-11-16 00:00:00', '2087-09-16 00:00:00', '2087-10-16 12:00:00', '2087-11-16 00:00:00', '2088-09-16 00:00:00', '2088-10-16 12:00:00', '2088-11-16 00:00:00', '2089-09-16 00:00:00', '2089-10-16 12:00:00', '2089-11-16 00:00:00', '2090-09-16 00:00:00', '2090-10-16 12:00:00', '2090-11-16 00:00:00', '2091-09-16 00:00:00', '2091-10-16 12:00:00', '2091-11-16 00:00:00', '2092-09-16 00:00:00', '2092-10-16 12:00:00', '2092-11-16 00:00:00', '2093-09-16 00:00:00', '2093-10-16 12:00:00', '2093-11-16 00:00:00', '2094-09-16 00:00:00', '2094-10-16 12:00:00', '2094-11-16 00:00:00', '2095-09-16 00:00:00', '2095-10-16 12:00:00', '2095-11-16 00:00:00', '2096-09-16 00:00:00', '2096-10-16 12:00:00', '2096-11-16 00:00:00', '2097-09-16 00:00:00', '2097-10-16 12:00:00', '2097-11-16 00:00:00', '2098-09-16 00:00:00', '2098-10-16 12:00:00', '2098-11-16 00:00:00', '2099-09-16 00:00:00', '2099-10-16 12:00:00', '2099-11-16 00:00:00'], 'y': [365.67962646484375, 346.0793151855469, 337.948486328125, 329.0875244140625, 324.39495849609375, 322.264892578125, 318.7379150390625, 330.5285339355469, 332.8694763183594, 332.62481689453125, 323.270263671875, 333.7188720703125, 337.9796142578125, 330.56011962890625, 324.10614013671875, 332.2137451171875, 321.5126953125, 317.12884521484375, 334.7716979980469, 325.10174560546875, 312.418701171875, 346.1999206542969, 333.0426025390625, 324.8887939453125, 337.77532958984375, 333.488037109375, 339.164794921875, 332.9766845703125, 320.0009460449219, 311.63568115234375, 309.53094482421875, 302.31231689453125, 308.4068603515625, 326.95355224609375, 309.387939453125, 298.0830078125, 314.005126953125, 319.617431640625, 314.14691162109375, 323.99005126953125, 300.84039306640625, 304.0415344238281, 301.97796630859375, 277.7290954589844, 285.91619873046875, 305.3645935058594, 282.5006408691406, 285.95068359375, 286.9250183105469, 275.80438232421875, 277.73822021484375, 287.52685546875, 275.34552001953125, 290.77874755859375, 310.16192626953125, 313.78851318359375, 323.37542724609375, 306.471435546875, 272.3183288574219, 271.5054931640625, 286.2471008300781, 251.84544372558594, 259.0927429199219, 301.53155517578125, 277.6706237792969, 295.74658203125, 279.865966796875, 270.9371032714844, 280.15625, 256.37139892578125, 211.02586364746094, 227.1137237548828, 314.4520568847656, 292.81707763671875, 299.0906982421875, 292.77203369140625, 258.16632080078125, 272.53057861328125, 280.9613037109375, 275.0679626464844, 267.892578125, 316.2608642578125, 284.4984436035156, 281.52581787109375, 271.05511474609375, 249.45079040527344, 278.3589782714844, 272.83477783203125, 221.68052673339844, 226.29429626464844, 277.26727294921875, 254.65167236328125, 261.82598876953125, 209.07394409179688, 187.19403076171875, 209.06813049316406, 199.30828857421875, 154.69320678710938, 168.4615020751953, 216.11944580078125, 163.78268432617188, 181.25921630859375, 201.72344970703125, 172.91456604003906, 216.64056396484375, 213.54833984375, 172.09713745117188, 184.91921997070312, 231.08425903320312, 201.98629760742188, 222.74583435058594, 204.15032958984375, 157.3826141357422, 172.01502990722656, 204.56503295898438, 155.07931518554688, 166.0127410888672, 227.6422882080078, 187.46139526367188, 204.65139770507812, 222.10501098632812, 180.28549194335938, 205.90087890625, 211.42318725585938, 170.01268005371094, 202.3740234375, 220.9741973876953, 179.29592895507812, 189.1097412109375, 195.51596069335938, 151.8114013671875, 188.04209899902344, 234.43191528320312, 191.187255859375, 195.21929931640625, 229.66763305664062, 181.24278259277344, 187.9353790283203, 211.7122802734375, 176.60513305664062, 203.86228942871094, 222.95114135742188, 206.64349365234375, 210.37112426757812, 219.32330322265625, 172.19161987304688, 188.77244567871094, 270.74261474609375, 224.33218383789062, 234.23989868164062, 233.05105590820312, 183.9254150390625, 204.90582275390625, 223.28822326660156, 198.62127685546875, 199.80364990234375, 230.47462463378906, 186.67245483398438, 239.41854858398438, 237.36654663085938, 188.44532775878906, 193.54580688476562, 233.7919158935547, 186.1747589111328, 198.72169494628906, 220.40049743652344, 180.4084930419922, 182.997314453125, 245.7755889892578, 187.22637939453125, 199.3765869140625, 258.98046875, 211.48202514648438, 230.4022979736328, 242.24420166015625, 193.50584411621094, 220.56349182128906, 226.34262084960938, 200.42689514160156, 210.04217529296875, 244.67239379882812, 193.3527069091797, 198.10821533203125, 228.389892578125, 182.2486572265625, 187.8900146484375, 271.7317810058594, 225.82131958007812, 242.65060424804688, 250.28219604492188, 216.58343505859375, 228.24636840820312, 244.0384521484375, 202.89418029785156, 210.76605224609375, 265.0697021484375, 243.6649932861328, 244.40782165527344, 234.81436157226562, 198.82513427734375, 233.833740234375, 235.49331665039062, 188.89712524414062, 206.51776123046875, 251.85009765625, 224.09713745117188, 252.3294219970703, 245.26634216308594, 215.87603759765625, 218.92575073242188, 247.89317321777344, 206.29493713378906, 225.22817993164062, 230.15707397460938, 177.81753540039062, 184.42074584960938, 251.72488403320312, 220.90802001953125, 243.69845581054688, 266.525390625, 238.71543884277344, 240.4351348876953, 249.81634521484375, 199.6676025390625, 212.45358276367188, 273.00152587890625, 254.92520141601562, 262.09967041015625, 272.98944091796875, 249.75372314453125, 259.18377685546875, 277.86810302734375, 263.841796875, 265.04290771484375, 295.59893798828125, 268.6759948730469, 270.73675537109375, 266.40478515625, 235.5479736328125, 254.36973571777344, 282.2143859863281, 256.596435546875, 260.66033935546875, 251.84512329101562, 257.15643310546875, 259.97930908203125, 299.96246337890625, 266.4241943359375, 294.93365478515625, 297.15191650390625, 269.71234130859375, 276.96014404296875, 263.6552429199219, 227.76864624023438, 245.5311279296875, 314.21331787109375, 299.9593505859375, 306.2751770019531, 300.88250732421875, 287.1684265136719, 293.3205871582031, 293.6396179199219, 270.69219970703125, 284.3874206542969, 291.73846435546875, 272.0585021972656, 284.88531494140625, 295.922119140625, 264.05859375, 276.3614807128906, 289.7493896484375, 263.8038330078125, 278.1527099609375, 283.79302978515625, 261.6714172363281, 270.9813537597656, 261.09747314453125, 243.06170654296875, 264.4044189453125, 288.13604736328125, 277.436767578125, 278.3541259765625, 280.0375671386719, 255.5471649169922, 259.98016357421875, 296.27447509765625, 277.73126220703125, 280.82110595703125, 282.7865295410156, 263.0016174316406, 275.06658935546875, 290.5851745605469, 260.81109619140625, 262.361328125, 312.7702331542969, 297.28509521484375, 299.5877990722656, 284.57623291015625, 283.4933166503906, 286.28857421875, 292.01739501953125, 292.58795166015625, 327.40863037109375, 286.7989807128906, 275.954833984375, 278.5018310546875, 307.450439453125, 294.8807067871094, 299.82586669921875, 284.80413818359375, 268.7020263671875, 275.06982421875, 283.9456481933594, 271.4902648925781, 280.1429443359375, 329.25738525390625, 334.0030517578125, 312.0684814453125, 282.804931640625, 268.1392822265625, 267.8450622558594, 307.85455322265625, 288.05523681640625, 314.97064208984375, 305.4913330078125, 297.33154296875, 299.64599609375, 313.9474182128906, 304.20123291015625, 304.6933288574219, 303.546630859375, 279.74090576171875, 302.6227111816406, 292.5414733886719, 279.241943359375, 300.8212890625, 323.9566650390625, 326.1233825683594, 330.11932373046875, 296.361572265625, 270.56005859375, 274.2196044921875, 328.7759704589844, 324.5758361816406, 332.434814453125, 286.6151428222656, 284.0872497558594, 315.8807373046875, 290.605224609375, 295.6073303222656, 303.25360107421875, 314.1800231933594, 293.4572448730469, 305.6630859375, 361.5279541015625, 358.6900329589844, 364.4098815917969, 314.656005859375, 305.97515869140625, 299.84100341796875, 299.3919372558594, 293.24200439453125, 304.13677978515625, 328.1431884765625, 323.1903991699219, 345.6214599609375, 296.21435546875, 277.26763916015625, 286.5982666015625, 323.1173095703125, 315.7867431640625, 314.3919982910156, 323.87890625, 347.09759521484375, 330.760986328125, 312.861572265625, 309.095703125, 319.54864501953125, 324.09954833984375, 312.3740234375, 319.111572265625, 318.549072265625, 331.17681884765625, 325.55670166015625, 321.98883056640625, 309.46319580078125, 316.1719970703125, 315.27459716796875, 295.5268249511719, 292.9322509765625, 332.21014404296875, 317.220947265625, 315.75726318359375, 306.894287109375, 302.6873779296875, 313.90692138671875, 330.88055419921875, 317.0320739746094, 312.12493896484375, 319.86346435546875, 308.1696472167969, 329.1674499511719, 313.86016845703125, 307.48583984375, 331.08135986328125, 319.6427001953125, 317.16204833984375, 311.6834411621094, 318.1702880859375, 299.75958251953125, 298.23419189453125, 332.412353515625, 325.9313659667969, 338.29034423828125, 312.30950927734375, 291.6859130859375, 292.32464599609375, 319.62786865234375, 313.8153076171875, 315.6207275390625]}, {'legalinfo': 'https://o3as.data.kit.edu/policies/terms-of-use.html', 'model': 'CCMI-1_CESM1-CAM4Chem_refC2_r3i1p1', 'plotstyle': {'color': 'darkorange', 'linestyle': 'dashed', 'marker': 'd'}, 'x': ['1960-09-16 00:00:00', '1960-10-16 12:00:00', '1960-11-16 00:00:00', '1961-09-16 00:00:00', '1961-10-16 12:00:00', '1961-11-16 00:00:00', '1962-09-16 00:00:00', '1962-10-16 12:00:00', '1962-11-16 00:00:00', '1963-09-16 00:00:00', '1963-10-16 12:00:00', '1963-11-16 00:00:00', '1964-09-16 00:00:00', '1964-10-16 12:00:00', '1964-11-16 00:00:00', '1965-09-16 00:00:00', '1965-10-16 12:00:00', '1965-11-16 00:00:00', '1966-09-16 00:00:00', '1966-10-16 12:00:00', '1966-11-16 00:00:00', '1967-09-16 00:00:00', '1967-10-16 12:00:00', '1967-11-16 00:00:00', '1968-09-16 00:00:00', '1968-10-16 12:00:00', '1968-11-16 00:00:00', '1969-09-16 00:00:00', '1969-10-16 12:00:00', '1969-11-16 00:00:00', '1970-09-16 00:00:00', '1970-10-16 12:00:00', '1970-11-16 00:00:00', '1971-09-16 00:00:00', '1971-10-16 12:00:00', '1971-11-16 00:00:00', '1972-09-16 00:00:00', '1972-10-16 12:00:00', '1972-11-16 00:00:00', '1973-09-16 00:00:00', '1973-10-16 12:00:00', '1973-11-16 00:00:00', '1974-09-16 00:00:00', '1974-10-16 12:00:00', '1974-11-16 00:00:00', '1975-09-16 00:00:00', '1975-10-16 12:00:00', '1975-11-16 00:00:00', '1976-09-16 00:00:00', '1976-10-16 12:00:00', '1976-11-16 00:00:00', '1977-09-16 00:00:00', '1977-10-16 12:00:00', '1977-11-16 00:00:00', '1978-09-16 00:00:00', '1978-10-16 12:00:00', '1978-11-16 00:00:00', '1979-09-16 00:00:00', '1979-10-16 12:00:00', '1979-11-16 00:00:00', '1980-09-16 00:00:00', '1980-10-16 12:00:00', '1980-11-16 00:00:00', '1981-09-16 00:00:00', '1981-10-16 12:00:00', '1981-11-16 00:00:00', '1982-09-16 00:00:00', '1982-10-16 12:00:00', '1982-11-16 00:00:00', '1983-09-16 00:00:00', '1983-10-16 12:00:00', '1983-11-16 00:00:00', '1984-09-16 00:00:00', '1984-10-16 12:00:00', '1984-11-16 00:00:00', '1985-09-16 00:00:00', '1985-10-16 12:00:00', '1985-11-16 00:00:00', '1986-09-16 00:00:00', '1986-10-16 12:00:00', '1986-11-16 00:00:00', '1987-09-16 00:00:00', '1987-10-16 12:00:00', '1987-11-16 00:00:00', '1988-09-16 00:00:00', '1988-10-16 12:00:00', '1988-11-16 00:00:00', '1989-09-16 00:00:00', '1989-10-16 12:00:00', '1989-11-16 00:00:00', '1990-09-16 00:00:00', '1990-10-16 12:00:00', '1990-11-16 00:00:00', '1991-09-16 00:00:00', '1991-10-16 12:00:00', '1991-11-16 00:00:00', '1992-09-16 00:00:00', '1992-10-16 12:00:00', '1992-11-16 00:00:00', '1993-09-16 00:00:00', '1993-10-16 12:00:00', '1993-11-16 00:00:00', '1994-09-16 00:00:00', '1994-10-16 12:00:00', '1994-11-16 00:00:00', '1995-09-16 00:00:00', '1995-10-16 12:00:00', '1995-11-16 00:00:00', '1996-09-16 00:00:00', '1996-10-16 12:00:00', '1996-11-16 00:00:00', '1997-09-16 00:00:00', '1997-10-16 12:00:00', '1997-11-16 00:00:00', '1998-09-16 00:00:00', '1998-10-16 12:00:00', '1998-11-16 00:00:00', '1999-09-16 00:00:00', '1999-10-16 12:00:00', '1999-11-16 00:00:00', '2000-09-16 00:00:00', '2000-10-16 12:00:00', '2000-11-16 00:00:00', '2001-09-16 00:00:00', '2001-10-16 12:00:00', '2001-11-16 00:00:00', '2002-09-16 00:00:00', '2002-10-16 12:00:00', '2002-11-16 00:00:00', '2003-09-16 00:00:00', '2003-10-16 12:00:00', '2003-11-16 00:00:00', '2004-09-16 00:00:00', '2004-10-16 12:00:00', '2004-11-16 00:00:00', '2005-09-16 00:00:00', '2005-10-16 12:00:00', '2005-11-16 00:00:00', '2006-09-16 00:00:00', '2006-10-16 12:00:00', '2006-11-16 00:00:00', '2007-09-16 00:00:00', '2007-10-16 12:00:00', '2007-11-16 00:00:00', '2008-09-16 00:00:00', '2008-10-16 12:00:00', '2008-11-16 00:00:00', '2009-09-16 00:00:00', '2009-10-16 12:00:00', '2009-11-16 00:00:00', '2010-09-16 00:00:00', '2010-10-16 12:00:00', '2010-11-16 00:00:00', '2011-09-16 00:00:00', '2011-10-16 12:00:00', '2011-11-16 00:00:00', '2012-09-16 00:00:00', '2012-10-16 12:00:00', '2012-11-16 00:00:00', '2013-09-16 00:00:00', '2013-10-16 12:00:00', '2013-11-16 00:00:00', '2014-09-16 00:00:00', '2014-10-16 12:00:00', '2014-11-16 00:00:00', '2015-09-16 00:00:00', '2015-10-16 12:00:00', '2015-11-16 00:00:00', '2016-09-16 00:00:00', '2016-10-16 12:00:00', '2016-11-16 00:00:00', '2017-09-16 00:00:00', '2017-10-16 12:00:00', '2017-11-16 00:00:00', '2018-09-16 00:00:00', '2018-10-16 12:00:00', '2018-11-16 00:00:00', '2019-09-16 00:00:00', '2019-10-16 12:00:00', '2019-11-16 00:00:00', '2020-09-16 00:00:00', '2020-10-16 12:00:00', '2020-11-16 00:00:00', '2021-09-16 00:00:00', '2021-10-16 12:00:00', '2021-11-16 00:00:00', '2022-09-16 00:00:00', '2022-10-16 12:00:00', '2022-11-16 00:00:00', '2023-09-16 00:00:00', '2023-10-16 12:00:00', '2023-11-16 00:00:00', '2024-09-16 00:00:00', '2024-10-16 12:00:00', '2024-11-16 00:00:00', '2025-09-16 00:00:00', '2025-10-16 12:00:00', '2025-11-16 00:00:00', '2026-09-16 00:00:00', '2026-10-16 12:00:00', '2026-11-16 00:00:00', '2027-09-16 00:00:00', '2027-10-16 12:00:00', '2027-11-16 00:00:00', '2028-09-16 00:00:00', '2028-10-16 12:00:00', '2028-11-16 00:00:00', '2029-09-16 00:00:00', '2029-10-16 12:00:00', '2029-11-16 00:00:00', '2030-09-16 00:00:00', '2030-10-16 12:00:00', '2030-11-16 00:00:00', '2031-09-16 00:00:00', '2031-10-16 12:00:00', '2031-11-16 00:00:00', '2032-09-16 00:00:00', '2032-10-16 12:00:00', '2032-11-16 00:00:00', '2033-09-16 00:00:00', '2033-10-16 12:00:00', '2033-11-16 00:00:00', '2034-09-16 00:00:00', '2034-10-16 12:00:00', '2034-11-16 00:00:00', '2035-09-16 00:00:00', '2035-10-16 12:00:00', '2035-11-16 00:00:00', '2036-09-16 00:00:00', '2036-10-16 12:00:00', '2036-11-16 00:00:00', '2037-09-16 00:00:00', '2037-10-16 12:00:00', '2037-11-16 00:00:00', '2038-09-16 00:00:00', '2038-10-16 12:00:00', '2038-11-16 00:00:00', '2039-09-16 00:00:00', '2039-10-16 12:00:00', '2039-11-16 00:00:00', '2040-09-16 00:00:00', '2040-10-16 12:00:00', '2040-11-16 00:00:00', '2041-09-16 00:00:00', '2041-10-16 12:00:00', '2041-11-16 00:00:00', '2042-09-16 00:00:00', '2042-10-16 12:00:00', '2042-11-16 00:00:00', '2043-09-16 00:00:00', '2043-10-16 12:00:00', '2043-11-16 00:00:00', '2044-09-16 00:00:00', '2044-10-16 12:00:00', '2044-11-16 00:00:00', '2045-09-16 00:00:00', '2045-10-16 12:00:00', '2045-11-16 00:00:00', '2046-09-16 00:00:00', '2046-10-16 12:00:00', '2046-11-16 00:00:00', '2047-09-16 00:00:00', '2047-10-16 12:00:00', '2047-11-16 00:00:00', '2048-09-16 00:00:00', '2048-10-16 12:00:00', '2048-11-16 00:00:00', '2049-09-16 00:00:00', '2049-10-16 12:00:00', '2049-11-16 00:00:00', '2050-09-16 00:00:00', '2050-10-16 12:00:00', '2050-11-16 00:00:00', '2051-09-16 00:00:00', '2051-10-16 12:00:00', '2051-11-16 00:00:00', '2052-09-16 00:00:00', '2052-10-16 12:00:00', '2052-11-16 00:00:00', '2053-09-16 00:00:00', '2053-10-16 12:00:00', '2053-11-16 00:00:00', '2054-09-16 00:00:00', '2054-10-16 12:00:00', '2054-11-16 00:00:00', '2055-09-16 00:00:00', '2055-10-16 12:00:00', '2055-11-16 00:00:00', '2056-09-16 00:00:00', '2056-10-16 12:00:00', '2056-11-16 00:00:00', '2057-09-16 00:00:00', '2057-10-16 12:00:00', '2057-11-16 00:00:00', '2058-09-16 00:00:00', '2058-10-16 12:00:00', '2058-11-16 00:00:00', '2059-09-16 00:00:00', '2059-10-16 12:00:00', '2059-11-16 00:00:00', '2060-09-16 00:00:00', '2060-10-16 12:00:00', '2060-11-16 00:00:00', '2061-09-16 00:00:00', '2061-10-16 12:00:00', '2061-11-16 00:00:00', '2062-09-16 00:00:00', '2062-10-16 12:00:00', '2062-11-16 00:00:00', '2063-09-16 00:00:00', '2063-10-16 12:00:00', '2063-11-16 00:00:00', '2064-09-16 00:00:00', '2064-10-16 12:00:00', '2064-11-16 00:00:00', '2065-09-16 00:00:00', '2065-10-16 12:00:00', '2065-11-16 00:00:00', '2066-09-16 00:00:00', '2066-10-16 12:00:00', '2066-11-16 00:00:00', '2067-09-16 00:00:00', '2067-10-16 12:00:00', '2067-11-16 00:00:00', '2068-09-16 00:00:00', '2068-10-16 12:00:00', '2068-11-16 00:00:00', '2069-09-16 00:00:00', '2069-10-16 12:00:00', '2069-11-16 00:00:00', '2070-09-16 00:00:00', '2070-10-16 12:00:00', '2070-11-16 00:00:00', '2071-09-16 00:00:00', '2071-10-16 12:00:00', '2071-11-16 00:00:00', '2072-09-16 00:00:00', '2072-10-16 12:00:00', '2072-11-16 00:00:00', '2073-09-16 00:00:00', '2073-10-16 12:00:00', '2073-11-16 00:00:00', '2074-09-16 00:00:00', '2074-10-16 12:00:00', '2074-11-16 00:00:00', '2075-09-16 00:00:00', '2075-10-16 12:00:00', '2075-11-16 00:00:00', '2076-09-16 00:00:00', '2076-10-16 12:00:00', '2076-11-16 00:00:00', '2077-09-16 00:00:00', '2077-10-16 12:00:00', '2077-11-16 00:00:00', '2078-09-16 00:00:00', '2078-10-16 12:00:00', '2078-11-16 00:00:00', '2079-09-16 00:00:00', '2079-10-16 12:00:00', '2079-11-16 00:00:00', '2080-09-16 00:00:00', '2080-10-16 12:00:00', '2080-11-16 00:00:00', '2081-09-16 00:00:00', '2081-10-16 12:00:00', '2081-11-16 00:00:00', '2082-09-16 00:00:00', '2082-10-16 12:00:00', '2082-11-16 00:00:00', '2083-09-16 00:00:00', '2083-10-16 12:00:00', '2083-11-16 00:00:00', '2084-09-16 00:00:00', '2084-10-16 12:00:00', '2084-11-16 00:00:00', '2085-09-16 00:00:00', '2085-10-16 12:00:00', '2085-11-16 00:00:00', '2086-09-16 00:00:00', '2086-10-16 12:00:00', '2086-11-16 00:00:00', '2087-09-16 00:00:00', '2087-10-16 12:00:00', '2087-11-16 00:00:00', '2088-09-16 00:00:00', '2088-10-16 12:00:00', '2088-11-16 00:00:00', '2089-09-16 00:00:00', '2089-10-16 12:00:00', '2089-11-16 00:00:00', '2090-09-16 00:00:00', '2090-10-16 12:00:00', '2090-11-16 00:00:00', '2091-09-16 00:00:00', '2091-10-16 12:00:00', '2091-11-16 00:00:00', '2092-09-16 00:00:00', '2092-10-16 12:00:00', '2092-11-16 00:00:00', '2093-09-16 00:00:00', '2093-10-16 12:00:00', '2093-11-16 00:00:00', '2094-09-16 00:00:00', '2094-10-16 12:00:00', '2094-11-16 00:00:00', '2095-09-16 00:00:00', '2095-10-16 12:00:00', '2095-11-16 00:00:00', '2096-09-16 00:00:00', '2096-10-16 12:00:00', '2096-11-16 00:00:00', '2097-09-16 00:00:00', '2097-10-16 12:00:00', '2097-11-16 00:00:00', '2098-09-16 00:00:00', '2098-10-16 12:00:00', '2098-11-16 00:00:00', '2099-09-16 00:00:00', '2099-10-16 12:00:00', '2099-11-16 00:00:00'], 'y': [384.22412109375, 375.72918701171875, 379.711181640625, 348.16729736328125, 335.81781005859375, 326.1171875, 336.8357238769531, 339.35809326171875, 345.55572509765625, 312.046630859375, 299.92559814453125, 297.560791015625, 340.07330322265625, 332.97918701171875, 314.9057922363281, 340.53643798828125, 329.3346252441406, 320.0054016113281, 340.18267822265625, 335.2765808105469, 340.8718566894531, 346.80584716796875, 340.73321533203125, 341.2271423339844, 330.7149658203125, 319.2563171386719, 362.2423400878906, 326.3066101074219, 322.77886962890625, 322.49700927734375, 338.7818298339844, 321.96893310546875, 325.8817443847656, 325.847412109375, 322.1021728515625, 316.7463684082031, 332.842041015625, 335.1965026855469, 371.0523681640625, 325.72100830078125, 304.7503356933594, 310.2048034667969, 315.69659423828125, 302.3489685058594, 328.8606872558594, 319.1392517089844, 300.3843994140625, 313.5488586425781, 297.31304931640625, 289.8427734375, 288.4268798828125, 297.1722412109375, 277.67852783203125, 287.2685546875, 290.42950439453125, 281.96484375, 288.94671630859375, 293.52899169921875, 302.2109069824219, 310.8515625, 293.5171203613281, 266.0408630371094, 285.626708984375, 281.8075866699219, 273.81561279296875, 274.910888671875, 301.428955078125, 269.2567443847656, 274.1527099609375, 250.22360229492188, 202.693115234375, 216.374267578125, 263.7291259765625, 226.73779296875, 233.87435913085938, 263.52142333984375, 234.3123321533203, 241.45034790039062, 245.73159790039062, 222.0733642578125, 244.7544403076172, 232.29763793945312, 193.4827117919922, 206.18585205078125, 278.8323059082031, 236.29672241210938, 255.73239135742188, 247.70001220703125, 234.7525177001953, 246.92904663085938, 241.0918731689453, 197.22894287109375, 214.906494140625, 257.62457275390625, 212.48312377929688, 233.83522033691406, 206.71038818359375, 178.87744140625, 201.863525390625, 244.32937622070312, 192.06594848632812, 204.20640563964844, 207.7671356201172, 164.15455627441406, 184.78955078125, 220.58370971679688, 172.03533935546875, 207.00628662109375, 229.44943237304688, 183.57916259765625, 194.19110107421875, 217.07760620117188, 185.55215454101562, 207.42477416992188, 203.86874389648438, 165.36537170410156, 190.385986328125, 210.79827880859375, 161.45603942871094, 185.18226623535156, 195.45849609375, 148.44528198242188, 183.57562255859375, 195.21258544921875, 146.91580200195312, 174.2964630126953, 239.3018035888672, 201.22047424316406, 209.996337890625, 249.05072021484375, 206.87261962890625, 220.80975341796875, 238.3411865234375, 185.25897216796875, 197.9100341796875, 265.39447021484375, 225.5625, 225.65834045410156, 245.3487548828125, 198.43649291992188, 206.5515899658203, 234.15594482421875, 194.5332489013672, 216.76747131347656, 234.65750122070312, 193.34771728515625, 215.70098876953125, 264.41363525390625, 259.07330322265625, 259.9197998046875, 271.617431640625, 231.2026824951172, 224.75108337402344, 231.86483764648438, 228.8740234375, 232.27349853515625, 244.2228546142578, 189.39744567871094, 195.5333251953125, 242.82920837402344, 196.91653442382812, 202.78282165527344, 208.58436584472656, 193.71751403808594, 203.72128295898438, 242.7593231201172, 187.69931030273438, 198.6043243408203, 237.52137756347656, 209.77392578125, 233.81903076171875, 235.55194091796875, 217.07162475585938, 220.62423706054688, 277.12603759765625, 228.51832580566406, 250.54153442382812, 246.98077392578125, 196.1932373046875, 210.96316528320312, 274.16412353515625, 277.0319519042969, 314.4810791015625, 248.59652709960938, 226.02557373046875, 222.3538055419922, 278.76007080078125, 241.23895263671875, 237.24461364746094, 260.56256103515625, 236.10745239257812, 240.8690948486328, 261.1882629394531, 208.10629272460938, 221.6674041748047, 266.41656494140625, 265.74639892578125, 277.31402587890625, 247.28089904785156, 207.30691528320312, 218.78341674804688, 248.18057250976562, 202.94580078125, 222.29776000976562, 253.138427734375, 227.9655303955078, 242.359619140625, 266.467041015625, 230.06317138671875, 247.09384155273438, 289.1470947265625, 250.64002990722656, 252.35415649414062, 268.06231689453125, 229.62432861328125, 263.4825439453125, 255.05584716796875, 217.25570678710938, 247.8614501953125, 274.548095703125, 237.36474609375, 245.7682647705078, 265.93511962890625, 246.65061950683594, 257.6488037109375, 258.9908142089844, 225.51148986816406, 253.98001098632812, 259.5974426269531, 222.59664916992188, 243.30899047851562, 259.6005859375, 219.76638793945312, 240.21066284179688, 290.1036376953125, 264.87591552734375, 277.432861328125, 264.7463684082031, 255.60980224609375, 267.3812255859375, 254.6274871826172, 229.95130920410156, 247.56341552734375, 292.78045654296875, 259.828369140625, 295.7215576171875, 261.49444580078125, 235.30831909179688, 263.661376953125, 263.8902893066406, 229.92745971679688, 263.27508544921875, 271.1767578125, 249.62234497070312, 256.132568359375, 284.16094970703125, 248.55810546875, 253.35894775390625, 278.27056884765625, 271.25372314453125, 279.6245422363281, 262.9705810546875, 237.64846801757812, 245.55279541015625, 250.6307373046875, 219.39273071289062, 235.89340209960938, 260.085693359375, 250.0213623046875, 267.802490234375, 290.5187072753906, 272.3798828125, 272.951416015625, 289.266357421875, 280.63580322265625, 301.0142517089844, 282.3924255371094, 276.78375244140625, 275.13604736328125, 288.7718811035156, 268.04034423828125, 273.9850158691406, 282.4685974121094, 286.39654541015625, 290.03228759765625, 304.7532958984375, 281.7134094238281, 289.11700439453125, 297.8353271484375, 278.3941650390625, 310.7015380859375, 276.2542724609375, 247.15347290039062, 278.08673095703125, 279.3991394042969, 239.63592529296875, 262.5395812988281, 298.07696533203125, 273.33221435546875, 270.38671875, 279.50750732421875, 273.23370361328125, 271.7047424316406, 306.75433349609375, 287.339111328125, 290.83734130859375, 293.72845458984375, 292.017578125, 302.4246826171875, 303.15460205078125, 290.48388671875, 293.85174560546875, 282.146728515625, 274.2728576660156, 277.59185791015625, 316.8066711425781, 312.50872802734375, 320.4421081542969, 313.94354248046875, 286.12481689453125, 288.90057373046875, 291.02789306640625, 265.9937744140625, 289.50372314453125, 310.5118408203125, 303.2950439453125, 304.8021240234375, 316.8968505859375, 308.9901428222656, 309.3736572265625, 301.77777099609375, 298.3074951171875, 319.9778137207031, 300.5914611816406, 278.7500305175781, 285.71014404296875, 320.0155334472656, 297.92315673828125, 303.7280578613281, 299.43914794921875, 306.5174865722656, 322.1292724609375, 309.3476257324219, 286.9554138183594, 289.4061279296875, 300.9517822265625, 272.574462890625, 295.5121765136719, 317.9032287597656, 309.6032409667969, 316.0960693359375, 315.4381103515625, 304.0845031738281, 296.6588134765625, 346.25531005859375, 319.4372863769531, 315.75201416015625, 324.4049072265625, 316.59808349609375, 333.6114501953125, 323.2805480957031, 311.0367736816406, 310.51123046875, 355.97705078125, 333.95623779296875, 328.4205322265625, 343.9536437988281, 320.55902099609375, 311.47552490234375, 300.8197021484375, 304.09075927734375, 304.39447021484375, 319.7082824707031, 329.664794921875, 325.4934997558594, 293.6533508300781, 275.99627685546875, 290.1572265625, 314.8209228515625, 301.4293518066406, 296.9135437011719, 299.95831298828125, 277.59088134765625, 284.00738525390625, 315.754638671875, 324.0767822265625, 338.1650085449219, 298.6648254394531, 280.3318176269531, 285.9096374511719, 343.83740234375, 351.5053405761719, 360.0870361328125, 316.98895263671875, 299.349365234375, 314.5627136230469, 315.70379638671875, 312.3668212890625, 320.3585205078125, 320.9887390136719, 307.60028076171875, 304.41802978515625, 321.58465576171875, 303.06671142578125, 309.8219299316406, 286.6208801269531, 291.19873046875, 307.7569885253906, 313.6889343261719, 304.78021240234375, 319.45208740234375, 317.58636474609375, 309.6918029785156, 322.0606384277344, 314.918701171875, 307.1820983886719, 312.07391357421875, 319.29852294921875, 305.7378234863281, 311.0923156738281]}]
  1. The received JSON data are converted into pandas Dataframe for an easier data manipulation

[8]:
tco3_skim_pd = pd.json_normalize(tco3_skim_data)
if debug: print(tco3_skim_pd.head())
  1. Let’s plot the retrieved skimmed data:

[9]:
# set default linewidth:
linewidth_default = 2
if not 'plotstyle.linewidth' in tco3_skim_pd.columns:
  tco3_skim_pd['plotstyle.linewidth'] = linewidth_default

# plot every model
for index, c in tco3_skim_pd.iterrows():
  plt.plot(pd.to_datetime(c['x']), c['y'], label=c['model'],
           color=c['plotstyle.color'], linestyle=c['plotstyle.linestyle'],
           marker=c['plotstyle.marker'], linewidth=c['plotstyle.linewidth'])

# show the legend
ax = plt.gca() # get axis instance
ax.legend(bbox_to_anchor=(1.0, 1.0))

# put titels for axes
plt.xlabel('Year')
plt.ylabel('tco3_zm (DU)')
[9]:
Text(0, 0.5, 'tco3_zm (DU)')
_images/user_jupyter_o3api_data+analysis_tco3_18_1.png
Analyse the skimmed data and plot tco3_zm

To analyse the data and produce tco3_zm plot, we do:

  1. Define a help function for boxcar smoothing

  2. Transform the Pandas Dataframe for easier data manipulation

  3. Average skimmed data over one year

  4. Apply boxcar smoothing, keep the reference year as-it-is, i.e. without smoothing

  5. For the reference year, find the TCO3 value in the measured data (reference value)

  6. Find biases in the simulation data in relation to the reference year

  7. Shift all simulations to the reference value at the reference year

  8. Plot shifted models together with the reference value.

Define a help function for boxcar smoothing
[10]:
def boxcar(data, bwin):
  """Function to apply boxcar, following
  https://scipy-cookbook.readthedocs.io/items/SignalSmooth.html
  N.B. 'valid' replaced with 'same' !

  :param data: input data
  :param bwin: width of the boxcar window
  :return boxcar_values: smoothed values
  """
  debug_boxcar = False

  boxcar = np.ones(bwin)

  if debug_boxcar: print("signal(raw) (len={}): {}".format(len(data),data))

  # mirror start and end of the original signal:
  sgnl = np.r_[data[bwin-1:0:-1],data,data[-2:-bwin-1:-1]]
  boxcar_values = signal.convolve(sgnl,
                                  boxcar,
                                  mode='same')/bwin
  if debug_boxcar: print("signal (len={}): {}".format(len(sgnl),sgnl))
  if debug_boxcar: print("signal+boxcar (len={}): {}".format(len(boxcar_values),
                                                             boxcar_values))
  return boxcar_values[bwin-1:-(bwin-1)]
Transform the DataFrame
[11]:
tco3_zm_pd = pd.DataFrame({'time': pd.to_datetime(tco3_skim_pd.loc[0,'x']),
                           tco3_skim_pd.loc[0,'model']: tco3_skim_pd.loc[0,'y']})

for i in range(1, len(tco3_skim_pd)):
  curve = pd.DataFrame({'time': pd.to_datetime(tco3_skim_pd.loc[i,'x']),
                        tco3_skim_pd.loc[i,'model']: tco3_skim_pd.loc[i,'y']})
  tco3_zm_pd = tco3_zm_pd.merge(curve, how='outer', on=['time'], sort=True)

tco3_zm_pd = tco3_zm_pd.set_index('time')
tco3_zm_pd = tco3_zm_pd.replace({0: np.nan})

# print(tco3_zm_pd.head()) # uncomment if you like to see the created DataFrame
Average data over one year
[12]:
# Average model data per year, index -> year
tco3_zm_year_pd = tco3_zm_pd.groupby([tco3_zm_pd.index.year]).mean()

# we may use pandas.plot() immediately
# Optionally, we can set matplotlib colors to the default values specified by the API:
import matplotlib as mpl
from cycler import cycler
mpl.rcParams['axes.prop_cycle'] = cycler(color=tco3_skim_pd['plotstyle.color'].values)

tco3_zm_year_pd.plot(legend=False)
[12]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f49e7fde350>
_images/user_jupyter_o3api_data+analysis_tco3_25_1.png
Apply boxcar smoothing

we use 10-point boxcar smoothing, when applied after averaging per year, it is an equivalent of 10-years

[13]:
boxcar_window = 10 # boxcar window for smoothing

# different models may have data point until a different year
# if last years have NaNs fill them with "before NaN values"
last_year = tco3_zm_year_pd.index.values[-1]
tco3_zm_year_pd[tco3_zm_year_pd.index > (last_year - boxcar_window)] = tco3_zm_year_pd[tco3_zm_year_pd.index > (last_year - boxcar_window)].fillna(method='ffill')

# apply boxcar smoothing
tco3_zm_smooth_pd = tco3_zm_year_pd.apply(boxcar, args = [boxcar_window], axis = 0, result_type = 'broadcast')

# inject the reference measurement (refMeasurement) as-it-is, i.e. **without** smoothing
if refMeasurement in tco3_zm_smooth_pd.columns:
  tco3_zm_smooth_pd[refMeasurement] = tco3_zm_year_pd[refMeasurement]

# plot smoothed data
tco3_zm_smooth_pd.plot(legend=False)
[13]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f49e8574990>
_images/user_jupyter_o3api_data+analysis_tco3_27_1.png

All models are quite apart. We can choose a reference value, i.e. TCO3 value for the reference year (see “refYear” in the “Global Variables”) and the reference measurement (“refMeasurement”) and shift all models to that value.

Find TCO3 value for the reference measurement (refMeasurement) and reference year (refYear)
[14]:
refValue = tco3_zm_year_pd[refMeasurement][tco3_zm_year_pd.index == refYear].interpolate(method='linear').values[0]
print(refValue)
310.925
Shift models to the reference value (refValue)
[15]:
# Calculate shift values for every model (refValue - modelValue for refYear)
tco3_zm_shift = refValue - tco3_zm_smooth_pd[tco3_zm_smooth_pd.index == refYear]

# Shift models by the shift values
tco3_zm_refYear = tco3_zm_smooth_pd + tco3_zm_shift.values

tco3_zm_refYear.plot(legend=False)
[15]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f49e7dfc990>
_images/user_jupyter_o3api_data+analysis_tco3_32_1.png
[16]:
# Create an empty DataFrame for statistics (also to have better control how to plot it later)
tco3_zm_refYear_stat = pd.DataFrame(index=tco3_zm_refYear.index, columns=['Mean', 'Std', 'Median'])
# Fill 'Mean', 'Std' values, skip refMeasurement from the 'Mean' and 'Std' calculations
tco3_zm_refYear_stat["Mean"] = tco3_zm_refYear.drop(refMeasurement, axis=1, inplace=False).mean(axis=1, skipna=True)
tco3_zm_refYear_stat["Std"] = tco3_zm_refYear.drop(refMeasurement, axis=1, inplace=False).std(axis=1, skipna=True)
tco3_zm_refYear_stat["Mean-Std"] = tco3_zm_refYear_stat["Mean"] - tco3_zm_refYear_stat["Std"]
tco3_zm_refYear_stat["Mean+Std"] = tco3_zm_refYear_stat["Mean"] + tco3_zm_refYear_stat["Std"]
tco3_zm_refYear_stat["Median"] = tco3_zm_refYear.median(axis=1, skipna=True)
Finally, plot tco3_zm analysed data
[17]:
# one can use pandas.plot() but if we want to use default styles delivered by the API, we better plot line-by-line
# for the tco3_zm plot we do not use "marker" except for the reference measurement

for col in tco3_zm_refYear.columns:
  style = tco3_skim_pd[tco3_skim_pd['model']==col]
  col_marker = '' if col != refMeasurement else style['plotstyle.marker'].values[0]
  tco3_zm_refYear[col].plot(color=style['plotstyle.color'].values[0],
                            linestyle=style['plotstyle.linestyle'].values[0],
                            marker=col_marker,
                            linewidth=style['plotstyle.linewidth'].values[0])

# draw horizonthal line for the reference value (refValue)
xmin, xmax = plt.xlim()
plt.hlines(refValue, xmin, xmax,
           colors='k', # 'dimgray'..?
           linestyles='dashed',
           label='Reference value',
           zorder=256)

# plot Mean, Median, and fill the area between Mean +/- Std
tco3_zm_refYear_stat['Mean'].plot(linewidth=5, color='g')
plt.fill_between(tco3_zm_refYear_stat.index,
                 tco3_zm_refYear_stat['Mean+Std'],
                 tco3_zm_refYear_stat['Mean-Std'],
                 color='g', alpha=0.2);
tco3_zm_refYear_stat['Median'].plot(linewidth=5, linestyle='dotted', color='b') # dashed

# tune the plot
ax = plt.gca() # get axis instance
handles, labels = ax.get_legend_handles_labels()
plt.legend(handles=handles,
           loc='center left',
           bbox_to_anchor=(1.0, 0.5))

plt.xticks(fontsize=14)
plt.yticks(fontsize=14)

ax.set_xlabel('Year', fontsize='x-large')
ax.set_ylabel('tco3_zm (DU)', fontsize='x-large')
[17]:
Text(0, 0.5, 'tco3_zm (DU)')
_images/user_jupyter_o3api_data+analysis_tco3_35_1.png
Further analyse the data and plot tco3_return
Define a help function to find return year for every model
[18]:
def get_tco3_return(data):
  """Function to find return_years for the set of models

  :param data: input climate data after smoothing and shifting to the reference point
  :return tco3_return_year_pd: DataFrame of models with return years
  """

  refMargin = 5 # 'margin' years after refYear to avoid return years immediately after refYear
  # select data later than (refYear+refMargin) year and with values above refValue. Drop duplicates to remove raws with all False or True
  tco3_return = (data[data.index>(refYear+refMargin)]>refValue).drop_duplicates()
  # every model (column) with at least one return_year (True) add to the dictionary { 'model': return_year}
  tco3_return_year = { col: [tco3_return[col][tco3_return[col]==True].index[0]] for col in tco3_return.columns if len(tco3_return[col][tco3_return[col]==True].index)>0 }
  # convert tco3_return_year dictionary to the pandas DataFrame
  tco3_return_year_pd = pd.DataFrame.from_dict(tco3_return_year)
  tco3_return_year_pd.index = ['user_region']

  return tco3_return_year_pd
Find return years for specified models
[19]:
# find return years for the models, exclude the Reference Measurement (refMeasurement)
tco3_return_models = get_tco3_return(tco3_zm_refYear.drop(refMeasurement, axis=1))
if debug: print(tco3_return_models)

# find return years for statistical data points ('Mean', 'Mean-Std', 'Mean+Std')
tco3_return_stat = get_tco3_return(tco3_zm_refYear_stat)
if debug: print(tco3_return_stat)
Finally, plot the return years, tco3_return
[20]:
xlabel = F"User region ({kwargs_tco3_zm['lat_min']}, {kwargs_tco3_zm['lat_max']})"
tco3_return_models.index = [xlabel]

# to use default styles delivered by the API, we plot model-by-model
for col in tco3_return_models.columns:
  style = tco3_skim_pd[tco3_skim_pd['model']==col]
  tco3_return_models[col].plot(color=style['plotstyle.color'].values[0],
                               linestyle='none',
                               marker=style['plotstyle.marker'].values[0],
                               markersize=8)

mean_yerr = [ tco3_return_stat['Mean'] - tco3_return_stat['Mean+Std'],
              tco3_return_stat['Mean-Std'] - tco3_return_stat['Mean']]
tco3_return_stat.index = [xlabel]
tco3_return_stat['Mean'].plot(color='r', marker='^', markersize=16, yerr=mean_yerr, capsize=8, legend='Mean', mfc='None')
tco3_return_stat['Median'].plot(color='b', marker='o', markersize=14, legend='Median', mfc='None')

# tune the plot
# show the legend
ax = plt.gca() # get axis instance
ax.legend(bbox_to_anchor=(1.0, 1.0))

plt.xticks(fontsize=14)
plt.yticks(fontsize=12)

ax.set_ylabel('tco3_zm return year', fontsize='x-large')
[20]:
Text(0, 0.5, 'tco3_zm return year')
_images/user_jupyter_o3api_data+analysis_tco3_41_1.png

The example shows how to use a Jupyter notebook to retrieve skimmed data in the JSON format and analyse for tco3_zm and tco3_return plots. The corresponding Jupyter notebook can be downloaded here .

Tip

In order to run a Jupyter notebook one may use either Jupyter Hub of EOSC-Synergy or Colab free service from Google.

Public presentations, demos

Introduction

O3as REST API provides:

  • Access to O3as (Ozone assessment) skimmed data (produced by the o3skim component).

  • Information about used Climate Models

  • Ability to produce ozone plots (e.g. tco3_zm, tco3_return) in either PDF or JSON format

The API leverages Swagger, Flask, and Connexion.

The source code can be found in our o3api GitLab repository.

O3API Endpoints

Swagger API documentation

Tip

The full and actual Swagger documentation is found at https://api.o3as.fedcloud.eu/api/v1/ui/.

Endpoints description

The documentation below is automatically generated from the swagger.yml:

GET /apiinfo

Returns information about the API

Information about the API (o3api metadata)

Status Codes
GET /data

Returns a list of plot types with the available raw data

List of plot types with the available raw data

Status Codes
  • 200 OK – Successfully returned the list of data types

  • 404 Not Found – Requested resource not found

  • default – Unexpected error

POST /data/tco3_zm

Returns raw data for tco3_zm

Raw data to be processed for building tco3_zm plot

Query Parameters
  • begin (integer) – Year to start data scanning from

  • end (integer) – Year to finish data scanning

  • month (array) – Month(s) to select, if not a whole year

  • lat_min (integer) – Latitude (min) to define the range (-90..90)

  • lat_max (integer) – Latitude (max) to define the range (-90..90)

Status Codes
  • 200 OK – Successfully retrieved the data

  • 404 Not Found – Requested resource not found

  • default – Unexpected error

POST /data/tco3_return

Returns raw data for tco3_return

Raw data to be processed for building tco3_return plot

Query Parameters
  • begin (integer) – Year to start data scanning from

  • end (integer) – Year to finish data scanning

  • month (array) – Month(s) to select, if not a whole year

  • lat_min (integer) – Latitude (min) to define the range (-90..90)

  • lat_max (integer) – Latitude (max) to define the range (-90..90)

Status Codes
  • 200 OK – Successfully retrieved the data

  • 404 Not Found – Requested resource not found

  • default – Unexpected error

GET /models

Returns a list of available models

List of available models

Query Parameters
  • ptype (string) – Plot type (tco3_return, tco3_zm, vmro3_zm)

  • select (string) – Select models according to the {select} pattern

Status Codes
  • 200 OK – Successfully returned list of models

  • 404 Not Found – Requested resource not found

  • default – Unexpected error

GET /models/{model}

Returns detailed information about a model

Detailed information about a model

Parameters
  • model (string) – model name

Status Codes
  • 200 OK – Successfully returned model information

  • 404 Not Found – Requested resource not found

  • default – Unexpected error

POST /models/plotstyle

Returns plot styles for models

Plot styles for selected models and plot type

Query Parameters
  • ptype (string) – Plot type (tco3_return, tco3_zm, vmro3_zm)

Status Codes
  • 200 OK – Successfully returned plot styles for models

  • 404 Not Found – Requested resource not found

  • default – Unexpected error

GET /plots

Returns a list of possible plots

List of possible plots

Status Codes
  • 200 OK – Successfully returned the list of possible plots

  • 404 Not Found – Requested resource not found

  • default – Unexpected error

POST /plots/tco3_zm

Builds and returns tco3_zm plot

tco3_zm plot or corresponding data points

Query Parameters
  • begin (integer) – Year to start data scanning from

  • end (integer) – Year to finish data scanning

  • month (array) – Month(s) to select, if not a whole year

  • lat_min (integer) – Latitude (min) to define the range (-90..90)

  • lat_max (integer) – Latitude (max) to define the range (-90..90)

  • ref_meas (string) – Reference observational measurument (Required)

  • ref_year (integer) – Reference year for the obsevational measurement (Required)

Status Codes
  • 200 OK – Successfully created the plot

  • 404 Not Found – Requested resource not found

  • default – Unexpected error

POST /plots/tco3_return

Builds and returns tco3_return plot

tco3_return plot or corresponding data points

Query Parameters
  • month (array) – Month(s) to select, if not a whole year

  • lat_min (integer) – Latitude (min) to define the range (-90..90)

  • lat_max (integer) – Latitude (max) to define the range (-90..90)

  • ref_meas (string) – Reference observational measurument (Required)

  • ref_year (integer) – Reference year for the obsevational measurement (Required)

Status Codes
  • 200 OK – Successfully created a plot

  • 404 Not Found – Requested resource not found

  • default – Unexpected error

O3API Reference

If you are looking for information on a specific function, class or method, this part of the documentation is for you.

api

O3as REST API methods:

o3api.api.get_api_info()[source]

Return information about the package

Returns

The o3api package info

Return type

dict

o3api.api.get_data_tco3_return(*args, **kwargs)[source]

Retrieve data to produce tco3_return plot

Parameters

kwargs – provided in the API call parameters

Returns

JSON document with data points

o3api.api.get_data_tco3_zm(*args, **kwargs)[source]

Retrieve data to produce tco3_zm plot

Parameters

kwargs – provided in the API call parameters

Returns

JSON document with data points

o3api.api.get_data_types()[source]

Get list of plot types with available data

o3api.api.get_data_vmro3_zm(*args, **kwargs)[source]

Retrieve data to produce vmro3_zm plot

Parameters

kwargs – provided in the API call parameters

Returns

JSON document with data points

o3api.api.get_model_detail(*args, **kwargs)[source]

Return information about the Ozone model

Returns

Info about the Ozone model

Return type

dict

o3api.api.get_models_info()[source]

Return dictionary of available models with the meta info

Returns

The dictionary of available models

Return type

dict

o3api.api.get_models_list(*args, **kwargs)[source]

Return the list of available Ozone models

Returns

The list of available models

Return type

list

o3api.api.get_plot_style(*args, **kwargs)[source]

Returning plot style for selected models and plot type

o3api.api.get_plot_types()[source]

Get list of the provided plot methods

o3api.api.plot(data, ckwargs, **kwargs)[source]

Main plotting routine

Parameters
  • data – data to plot

  • ckwargs – dictionary for curve plotting (e.g. color, style)

  • kwargs – provided in the API call parameters

Returns

PDF plot

o3api.api.plot_json(data, ckwargs, **kwargs)[source]

Plotting routine returning JSON points

Parameters
  • data – data ready for plotting

  • ckwargs – dictionary for curve plotting (e.g. color, style)

  • kwargs – provided in the API call parameters

Returns

JSON document with data points and styles for plotting

o3api.api.plot_tco3_return(*args, **kwargs)[source]

Plot tco3_return

Parameters

kwargs – provided in the API call parameters

Returns

Either PDF plot or JSON document

o3api.api.plot_tco3_zm(*args, **kwargs)[source]

Plot tco3_zm

Parameters

kwargs – provided in the API call parameters

Returns

Either PDF plot or JSON document

o3api.api.plot_vmro3_zm(*args, **kwargs)[source]

Plot vmro3_zm

Parameters

kwargs – provided in the API call parameters

Returns

Either PDF plot or JSON document

plots

O3as helper classes to extact data for plotting:

class o3api.plots.DataSelection(plot_type, **kwargs)[source]

Class to perform data selection, based on Dataset.

Parameters
  • begin – Year to start data scanning from

  • end – Year to finish data scanning

  • month – Month(s) to select, if not a whole year

  • lat_min – Minimum latitude to define the range (-90..90)

  • lat_max – Maximum latitude to define the range (-90..90)

get_dataslice(model)[source]

Function to select the slice of data according to the time and latitude requested

Parameters

model – The model to process

Returns

xarray dataset selected according to the time and latitude

Return type

xarray

to_pd_dataframe(ds, model)[source]

Convert xarray variable to pandas dataframe (faster method?)

Parameters
  • ds – xarray dataset

  • model – The model to process for self.plot_type

:return dataset as pandas dataframe :rtype: pandas dataframe

to_pd_series(ds, model)[source]

Convert xarray variable to pandas series

Parameters
  • ds – xarray dataset

  • model – The model to process for self.plot_type

:return dataset as pandas series :rtype: pandas series

class o3api.plots.Dataset(plot_type, **kwargs)[source]

Base Class to initialize the dataset

Parameters

plot_type – The plot type (e.g. tco3_zm, vmro3_zm, …)

get_dataset(model)[source]

Load data from one datafile

Parameters

model – The model to process

Returns

xarray dataset

Return type

xarray.Dataset

get_mfdataset(model)[source]

Load data from the datafile list

Parameters

model – The model to process

Returns

xarray dataset

Return type

xarray.Dataset

class o3api.plots.ProcessForTCO3(**kwargs)[source]

Subclass of DataSelection to calculate tco3_zm

get_ensemble_for_plot(models)[source]

Build the ensemble of tco3_zm models for plotting, include reference

Parameters

models – Models to process for tco3_zm

Returns

ensemble of models, including the reference, as pd.DataFrame

Return type

pd.DataFrame

get_ensemble_shifted(data)[source]

Shift tco3_zm data to reference year

Parameters

data – data to process as pd.DataFrame

Returns

shifted data points for plotting

Return type

pd.DataFrame

get_ensemble_smoothed(models, smooth_win)[source]

Smooth tco3_zm data using boxcar

Parameters

models – Models to process for tco3_return

Returns

smoothed data points

Return type

pd.DataFrame

get_ensemble_stats(data)[source]

Calculate Mean, Std, Median for tco3_zm data

Parameters

data – data to process as pd.DataFrame

Returns

updated pd.DateFrame with stats columns

Return type

pd.DataFrame

get_ensemble_yearly(models)[source]

Rebin tco3_zm data for yearly entries

Parameters

models – Models to process for tco3_return

Returns

yearly data points

Return type

pd.DataFrame

get_raw_data(model)[source]

Process the model to get tco3_zm raw data

Parameters

model – The model to process for tco3_zm

Returns

raw data points in preparation for plotting

Return type

pandas series (pd.Series)

get_raw_data_pd(model)[source]

Process the model to get tco3_zm raw data

Parameters

model – The model to process for tco3_zm

Returns

raw data points in preparation for plotting

Return type

pd.DataFrame

get_raw_ensemble_pd(models)[source]

Build the ensemble of tco3_zm models

Parameters

models – Models to process for tco3_zm

Returns

ensemble of models as pd.DataFrame

Return type

pd.DataFrame

get_ref_value()[source]

Get reference value for the reference year

Returns

reference value (tco3_zm at reference year)

class o3api.plots.ProcessForTCO3Return(**kwargs)[source]

Subclass of ProcessForTCO3 to calculate tco3_return

get_ensemble_for_plot(models)[source]

Build the ensemble of tco3_return points for plotting

Parameters

models – Models to process for tco3_zm

Returns

ensemble of models, including the mean, as pd.DataFrame

Return type

pd.DataFrame

get_return_years(data)[source]

Calculate return year for every model

Parameters

data – data to process

Returns

return years for models

Return type

pd.DataFrame

class o3api.plots.ProcessForVMRO3(**kwargs)[source]

Subclass of DataSelection to calculate vmro3_zm

get_plot_data(model)[source]

Process the model to get vmro3_zm data for plotting

Parameters

model – The model to process for vmro3_zm

Returns

xarray dataset for plotting

Return type

xarray

plothelpers

O3as help functions to create figures:

o3api.plothelpers.cleanse_models(**kwargs)[source]

Cleansing models from empty entries, spaces, and quotes

Parameters

kwargs – The provided in the API call parameters

Returns

models cleansed from empty entries, spaces, quotes

Return type

list

o3api.plothelpers.get_date_range(ds)[source]

Return the range of dates in the provided dataset

Parameters

ds – xarray dataset to check

Returns

date_min, date_max

o3api.plothelpers.get_periodicity(pd_time)[source]

Calculate periodicity in the provided data

Parameters

pd_time (pandas DatetimeIndex) – The time period

Returns

Calculated periodicity as the number of points per year

Return type

int

o3api.plothelpers.get_plot_info_html(**kwargs)[source]

Generate info text (HTML) for the plot

Parameters

kwargs – The provided in the API call parameters

Returns

information text (HTML) with legal info, parameters etc

Return type

string

o3api.plothelpers.get_plot_info_txt(**kwargs)[source]

Generate info text for the plot

Parameters

kwargs – The provided in the API call parameters

Returns

information text with legal info, parameters etc

Return type

string

o3api.plothelpers.get_plot_params(**kwargs)[source]

Get plot parameters

Parameters

kwargs – The provided in the API call parameters

Returns

plot_params with added input parameters

Return type

string

o3api.plothelpers.set_figure_attr(fig, **kwargs)[source]

Configure the figure attributes

Parameters
  • fig – Figure instance

  • kwargs – The provided in the API call parameters

Returns

none

o3api.plothelpers.set_filename(**kwargs)[source]

Set file name

Parameters

kwargs – The provided in the API call parameters

Returns

file_name with added input parameters (no extension given!)

Return type

string

Data skimming for ozone assessment.

o3skim is an open source project and Python package that provides the tools to pre-process, standardize and reduce ozone data from netCDF models to simplify and speed up ozone data transfer and plot.

Getting started

  • Which First steps you need to start.

  • How to use o3norm to standardize your models.

  • How to use o3skim to reduce your models.

First steps

Prerequisites

This software is shipped as python3 package, therefore you need to have python3 and pip installed. If not, please check pip documentation to find out how to install and run pip in your system with at least the following versions:

software

version

python

>= 3.6.12

pip

>= 21.0.1

Note

Non admin rights? Check how to run conda in your machine.

Installation

Once python3 and pip are running in your system, download the package and install it using pip:

$ git clone https://git.scc.kit.edu/synergy.o3as/o3skim.git
Cloning into 'o3skim'...
...
$ cd o3skim
$ pip install .
...
Successfully installed o3skim-0.4.0

o3norm

You can standardize a dataset from any sources using the provided command o3norm when installing the package.

usage: o3norm [-h] [-v {DEBUG,INFO,WARNING,ERROR,CRITICAL}] [-t TARGET]
              (--tco3_zm | --vmro3_zm)
              {CCMI-1,ECMWF,ESACCI,SBUV} ...

This command loads the model from the specified sources and produces an standardized netCDF output with the following structure:

Dimensions:   (lat: _, lon: _, plev: _, time: _)
Coordinates:
  * time      (time) datetime64[ns] ____-__-__ ... ____-__-__T__:__:__
  * plev      (plev) float64 ___._ ... ___._
  * lon       (lon) float64 ___._ ... ___._
  * lat       (lat) float64 ___._ ... ___._
Data variables:
    tco3_zm   (time, lon, lat) float64 __
    vmro3_zm  (time, plev, lon, lat) float64 __
    ...
Attributes:
    <The original dataset attributes>

This can help you to work easier with multiple sources having a common data structure for your data.

The usage is very simple, call the o3norm command followed by the specific model type you would like to load as a Sub-command. Note that there are general optional arguments common to all source types (for example –target) and specific to each source type (for example –delimiter in the case of SBUV).

positional arguments (Sub-commands):
  {CCMI-1,ECMWF,ESACCI,SBUV}
                        Sub-commands
    CCMI-1              CCMI-1 Source input
    ECMWF               ECMWF Source input
    ESACCI              ESACCI Source input
    SBUV                SBUV Source input

optional arguments:
  -h, --help            show this help message and exit
  -v {DEBUG,INFO,WARNING,ERROR,CRITICAL}, --verbosity {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Sets the logging level (default: INFO)
  -t TARGET, --target TARGET
                        Target netCDF file (default: o3data)
  --tco3_zm             Standardization for total column ozone
  --vmro3_zm            Standardization for volume mixing ratio ozone

You can use the optional argument –help to see the Command and Sub-command instructions. For example, to see the options available for the CCMI-1 you can use:

$ o3norm CCMI-1 --help
usage: o3norm CCMI-1 [-h] [--time TIME] [--plev PLEV] [--lat LAT] [--lon LON]
                    variable paths [paths ...]
...

As last example, the following commands shows how to produce an output of standardized netCDF files at the file mydata.nc using the files provided from a CCMI-1 source:

$ o3norm --tco3_zm -t mydata.nc CCMI-1 toz Ccmi/some_path/*.nc
$ o3norm --vmro3_zm -t mydata.nc CCMI-1 vmro3 Ccmi/some_path/*.nc
...

See the first command loads the toz from the source as tco3_zm and the second the vmro3 as vmro3_zm. Both commands are targeting the file mydata.nc, therefore that file will contain the information about the 2 variables.

o3skim

You can reduce an output dataset produced by o3norm using the provided command o3skim when installing the package.

usage: o3skim [-h] [-v {DEBUG,INFO,WARNING,ERROR,CRITICAL}] [-o OUTPUT]
              [--lon_mean] [--lat_mean] [--year_mean]
              paths [paths ...]

This command loads the model from the specified paths and produces a set of standardized netCDF files. The output data are splitted into one file per variable at the original dataset. For example, skimming a dataset with tco3_zm and vmro3_zm produces the following output at the specified folder:

$ tree output_folder
output_folder/
├── tco3_zm.nc
└── vmro3_zm.nc

The structure of each output file will depend on the variable it contains (for example, tco3_zm does not contain plev coordinates) and the skimming operations performed (for example, lon_mean reduces the lon coordinate). This reduces the transference size by transferring only the files with the intended variables.

The usage is quite simple, call the o3skim command followed by the operations you would like to performed as optional arguments and with the paths to the dataset you would like to reduce.

positional arguments:
  paths                 Paths to netCDF files with the data to skim

optional arguments:
  -h, --help            show this help message and exit
  -v {DEBUG,INFO,WARNING,ERROR,CRITICAL}, --verbosity {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Sets the logging level (default: INFO)
  -o OUTPUT, --output OUTPUT
                        Folder for output files (default: .)

operations:
  --lon_mean            Longitudinal mean across the dataset
  --lat_mean            Latitudinal mean across the dataset
  --year_mean           Time average across the year

As an example, the following command shows how to reduce a dataset running an average mean over the latitude and longitude coordinates at the folder skimmed_model:

$ o3skim -o skimmed_model --lon_mean --lat_mean mydata.nc
...
$ tree skimmed_model
skimmed_model/
└── tco3_zm.nc

From this example, we can foreseen that the original dataset mydata.nc contained only tco3_zm information. The expected structure for the tco3_zm.nc dataset would be as follows:

Dimensions:   (time: _)
Coordinates:
  * time      (time) datetime64[ns] ____-__-__ ... ____-__-__T__:__:__
Data variables:
    tco3_zm   (time) float64 __
Attributes:
    <The original dataset attributes>

Developer guide

Package index

O3as package with utilities to handle ozone data skimming.

o3skim.process(dataset, actions)[source]

Function in charge of processing the list of o3skim operations to the ozone variables dataset. The available list of operations to perform are:

lon_mean

Longitudinal mean accross the dataset.

lat_mean

Latitudinal mean accross the dataset.

Note that multiple operations can be concatenated. For example using the list [‘lon_mean’, ‘lat_mean’] as actions parameter input would perform a longitudinal mean followed afterwards by a latitudinal mean before returning the result.

Parameters
  • dataset (xarray.Dataset) – Original o3 dataset where to perform operations.

  • actions (list) – List of operation names to perform.

Returns

Dataset after processing listed operations.

Return type

xarray.Dataset

o3skim.save(dataset, target, split_by=None)[source]

Function in charge of saving the input dataset into the file system using an specified time range. The available type of output file formats are:

None

Output file format is {target}.nc

year

Output file format is {target}_{y}-{y+01}.nc

decade

Output file format is {target}_{y}-{y+10}.nc

Parameters
  • dataset (xarray.DataSet) – DataSet to save in the target.

  • target (str) – Location where to save followed by the name prefix.

  • split_by (str, optional) – Type of saving format to apply.

o3skim loads

Module in charge of model data loading.

o3skim.loads.ccmi(variable, paths)[source]

Loads and returns a CCMI-1 DataArray model and the dataset attributes.

Parameters
  • variable (str) – Variable to load from the dataset.

  • paths (str or [str]) – Paths expression to the dataset netCDF files.

Returns

Standardized DataArray.

Return type

(xarray.DataArray, dict)

o3skim.loads.ecmwf(variable, paths)[source]

Loads and returns a ECMWF DataArray model and the dataset attributes.

Parameters
  • variable (str) – Variable to load from the dataset.

  • paths (str or [str]) – Paths expression to the dataset netCDF files.

Returns

Standardized DataArray.

Return type

(xarray.DataArray, dict)

o3skim.loads.esacci(variable, time_position, paths)[source]

Loads and returns a ESACCI DataArray model and the dataset attributes. Note the name structure is composed by sections: For example: ESACCI-OZONE-L3S-TC-MERGED-DLR_1M-20010302-fv0100. Therefore is needed to indicate the position in the string for the dataset time (7 or -2 for the case above).

Parameters
  • variable (str) – Variable to load from the dataset.

  • time_position (int) – Name position for the dataset time.

  • paths (str or [str]) – Paths expression to the dataset netCDF files.

Returns

Standardized DataArray.

Return type

(xarray.DataArray, dict)

o3skim.loads.sbuv(textfile, delimiter)[source]

Loads and returns a SBUV DataArray model and the dataset attributes. Note SBUV models do not have longitude coordinate.

Parameters
  • textfile (str) – Location to the textfile with model information.

  • delimiter (str or [str]) – Delimiter character for row values on the table.

Returns

Standardized DataArray.

Return type

(xarray.DataArray, {})

o3skim normalization

Module in charge of dataset normalization when loading models.

o3skim.normalization.run(datarray, variable, **coords)[source]

Standardizes a DataArray.

Returns

Standardized DataArray.

Return type

xarray.DataArray

o3skim operations

Module in charge of implementing the o3skim operations.

o3skim.operations.run(name, dataset)[source]

Main entry point for operation call on o3skimming functions:

lon_mean

Longitudinal mean across the dataset.

lat_mean

Latitudinal mean across the dataset.

year_mean

Time coordinate averaged by year.

Parameters
  • name (str) – Operation name to perform.

  • dataset (xarray.Dataset) – Original o3 dataset where to perform operations.

Returns

Dataset after processing the specified operation.

Return type

xarray.Dataset

Test guidelines

Testing is based on sqa-baseline criteria, tox automation is used to simplify the testing process.

To install it with pip use:

$ pip install tox

To run unit and functional tests together with reports use:

$ tox
...
clean: commands succeeded
stylecheck: commands succeeded
bandit: commands succeeded
docs: commands succeeded
py36: commands succeeded
report: commands succeeded
...

The last coverage report output is produced at htmlcov which can be displayed in html format accessing to index.html.

The last Pep8 report produced by flake8 at the output file flake8.log.

However, you can also run different test configurations using different tox environments:

Code Style [QC.Sty]

Test pep8 maintenance style conventions based on pylint format. To run stylecheck use:

$ tox -e stylecheck
...
stylecheck: commands succeeded
...

Unit Testing [QC.Uni]

All unit tests are placed inside the package (./o3skim/test). This helps to test easily functions at low level and ensure the functions have the expected behavior. To run unit tests use:

$ tox -e unittesting
...
unittesting: commands succeeded
...

This environment also provide a coverage term report for the tests. The design of Unit Tests is based on the python unittest framework, a simple and extended test framework which ships by default together with python.

The usage is very simple and straight forward for simple tests, but the difficulty to parametrize and combine multiple test fixtures makes it not suitable for Black-Box testing without a very complex customization.

Functional Testing [QC.Fun]

Located inside tests package folder (./tests). Functional testing is used to test the system from a general overview of the application. To run functional tests use:

$ tox -e functional
...
functional: commands succeeded
...

This environment also provide a coverage term report for the tests. The framework used is pytest to provide a simple syntax to test all possible combinations from the user point of view.

Pytest detects directly all tests following the test_discovery naming conventions. Therefore all functional tests should be located on the tests folder at the package root and start with test. For example test_sources.py.

More than 500 test combinations are generated using which otherwise might not be feasible using other python test frameworks.

Security [QC.Sec]

Security checks are performed by bandit, a tool designed to find common security issues in Python code. To run security checks use:

$ tox -e functional
...
functional: commands succeeded
...

Documentation [QC.Doc]

Documentation is build using sphinx, a tool designed to create documentation based on code. To run documentation build checks use:

$ tox -e docs
...
docs: commands succeeded
...

The HTML pages are build inside in docs/_build.

Authors

Indices and Tables