{ "cells": [ { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "# Préambule" ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "Dès 1958, Charles David Keeling a débuté la mesure précise du taux de CO2 dans l'atmosphère à l'observatoire de Mauna Loa, Hawaii, États-Unis. \n", "Ces mesures, qui continuent aujourd'hui, ont permis de montrer une évolution périodique de CO2 dans l'hémisphère Nord. Celle-ci provenant du cycle de vie des plantes. \n", "De même, ces données ont montré une évolution continue du taux de CO2 dans l'atmosphère depuis 1958." ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "# Travail à faire" ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "Le but de l'exercice est de réaliser un document computationnel pour :\n", "* Réaliser un graphique qui montrera une oscillation périodique superposée à une évolution systématique plus lente.\n", "* Séparer ces deux phénomènes. Caractériser l'oscillation périodique et proposer un modèle simple de la contribution lente\n", "* Estimer ses paramètres et tenter une extrapolation jusqu'à 2025 (dans le but de pouvoir valider le modèle par des observations futures).\n", "* Déposer dans FUN le résultat." ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "## Etat du système réalisant les calculs" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "hideCode": true, "hideOutput": true, "hidePrompt": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting lmfit\n", "Collecting scipy>=1.2 (from lmfit)\n", " Using cached https://files.pythonhosted.org/packages/24/40/11b12af7f322c1e20446c037c47344d89bab4922b8859419d82cf56d796d/scipy-1.2.3-cp27-cp27mu-manylinux1_x86_64.whl\n", "Collecting asteval>=0.9.16 (from lmfit)\n", "Collecting uncertainties>=3.0.1 (from lmfit)\n", "Collecting numpy>=1.16 (from lmfit)\n", " Using cached https://files.pythonhosted.org/packages/3a/5f/47e578b3ae79e2624e205445ab77a1848acdaa2929a00eeef6b16eaaeb20/numpy-1.16.6-cp27-cp27mu-manylinux1_x86_64.whl\n", "Collecting six>=1.11 (from lmfit)\n", " Using cached https://files.pythonhosted.org/packages/65/eb/1f97cb97bfc2390a276969c6fae16075da282f5058082d4cb10c6c5c1dba/six-1.14.0-py2.py3-none-any.whl\n", "Installing collected packages: numpy, scipy, asteval, uncertainties, six, lmfit\n", "Successfully installed asteval-0.9.17 lmfit-0.9.15 numpy-1.16.6 scipy-1.2.3 six-1.14.0 uncertainties-3.1.2\n" ] } ], "source": [ "# Installation de la librairie lmfit\n", "!pip install lmfit" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "hideOutput": true, "hidePrompt": true }, "outputs": [], "source": [ "# Import des librairies\n", "import time\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "\n", "from lmfit.models import QuadraticModel, Model\n", "import lmfit\n", "from sklearn.metrics import r2_score" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "hideCode": true, "hidePrompt": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Version de linux : #44~18.04.2-Ubuntu SMP Thu Apr 23 14:27:18 UTC 2020\n", "Version du noyau linux : 5.3.0-51-generic\n", "Architecture : x86_64\n", "\n", "Version de python : 3.6.9 (default, Apr 18 2020, 01:56:04) \n", "[GCC 8.4.0]\n", "Version de pandas : 1.0.3\n", "Version de numpy : 1.18.2\n", "Version de lmfit : 1.0.0\n", "Version de matplotlib : 3.2.1\n" ] } ], "source": [ "# Affichage de la version des logiciels\n", "import sys\n", "import platform\n", "\n", "print(f\"Version de linux : {platform.uname()[3]:>57}\")\n", "print(f\"Version du noyau linux : {platform.uname()[2]:>16}\")\n", "print(f\"Architecture : {platform.uname()[5]:>16}\\n\")\n", "\n", "print(f\"Version de python : {sys.version:>56}\")\n", "print(f\"Version de pandas : {pd.__version__:>10}\")\n", "print(f\"Version de numpy : {np.__version__:>12}\")\n", "print(f\"Version de lmfit : {lmfit.__version__:>11}\")\n", "print(f\"Version de matplotlib : {matplotlib.__version__:>6}\")" ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "# Base de données" ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "Les données sont disponibles sur le site Web de l'institut Scripps à l'adresse suivante: \n", "https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record.html\n", "\n", "Pour notre étude, nous prendrons les relevés hebdomadaires : *weekly_in_situ_co2_mlo.csv* que l'on peut télécharger à l'adresse suiavnte : https://scrippsco2.ucsd.edu/data/atmospheric_co2/mlo.html\n", "\n", "Nous travaillerons sur une base locale (copiée sur le serveur *jupyter* de l'INRIA) téléchargée le 13 avril 2020.\n", "La totalité des documents nécessaires à cette étude seront committés sur le serveur *GitLab* de l'INRIA.\n", "\n", "Les parties du code nécessaires à l'affichage des courbes ne sera pas affichées dans le rapport final. Elles seront tout de même accessibles dans le fichier *jupyter*." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "hideOutput": true, "hidePrompt": true }, "outputs": [], "source": [ "# URL du fichier de données\n", "data_url = \"https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/weekly/weekly_in_situ_co2_mlo.csv\"" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "hidePrompt": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fichier trouvé en local.\n", "Dernière modification sur ce fichier : Tue Apr 28 11:47:15 2020\n" ] } ], "source": [ "# Vérification de la présence du fichier en local\n", "# Si non, téléchargement à partir de l'URL\n", "import os.path\n", "import time\n", "# Vérifier si le fichier existe ou non\n", "if os.path.isfile('weekly_in_situ_co2_mlo.csv'):\n", " print(\"Fichier trouvé en local.\")\n", " print(f\"Dernière modification sur ce fichier : {time.ctime(os.path.getctime('weekly_in_situ_co2_mlo.csv'))}\")\n", "else:\n", " print(\"Fichier non trouvé en local.\")\n", " print(\"Téléchargement du fichier sur le site Web.\")\n", " # Copy du fichier à la racine\n", " os.system(\"wget \" + data_url)\n", " print(f\"Dernière modification sur ce fichier : {time.ctime(os.path.getctime('weekly_in_situ_co2_mlo.csv'))}\")" ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "# Vérification de la base de données" ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "## Exploration des données" ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hidePrompt": true }, "source": [ "Nous commençons par analyser le contenu du fichier de données (fichier structuré *CSV*) pour ensuite faire un premier tracé de l'ensemble de la base de données. \n", "Nous utiliserons les libraries *pandas* et *matplotlib* pour *python 3.6*." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "hideCode": false, "hideOutput": true, "hidePrompt": true }, "outputs": [ { "data": { "text/plain": [ "(3156, 1)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Chargement de la base de données (CSV)\n", "# Les lignes de commentaires sont ignorées\n", "# Le séparateur de champs utilisé dans la base de données est la virgule (,)\n", "# La colonne des dates est parsé et mise en index\n", "date_parser = lambda dates: [pd.datetime.strptime(d, '%Y-%m-%d') for d in dates]\n", "\n", "data = pd.read_csv('weekly_in_situ_co2_mlo.csv', sep=',', comment='\"', header=None,\n", " names=[\"date\", \"CO2\"])\n", "data['date'] = pd.to_datetime(data['date'], format='%Y-%m-%d')\n", "\n", "# Les dates sont passées à l'index du dataframe\n", "data.set_index('date', inplace=True)\n", "data.shape" ] }, { "cell_type": "markdown", "metadata": { "hideCode": true, "hideOutput": false, "hidePrompt": true }, "source": [ "Les 44 premières lignes de commentaires du fichier brut n'ont pas été prises en compte (commande `comment='\"'`). \n", "La base de données est composée de 3156 mesures et de 2 colonnes :\n", "* date : date de relevé. Avec un relevé par semaine.\n", "* CO2 : concentration de CO2 en *ppm*." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "hideCode": true, "hideOutput": true, "hidePrompt": true }, "outputs": [ { "data": { "text/html": [ "
\n", " | CO2 | \n", "
---|---|
date | \n", "\n", " |
1958-03-29 | \n", "316.19 | \n", "
1958-04-05 | \n", "317.31 | \n", "
1958-04-12 | \n", "317.69 | \n", "
1958-04-19 | \n", "317.58 | \n", "
1958-04-26 | \n", "316.48 | \n", "