{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Sujet 1 : Concentration de CO2 dans l'atmosphère depuis 1958" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import os\n", "from datetime import date\n", "import requests\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from scipy import stats" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Provenance des données\n", "\n", "Les données sont disponibles du site Web de l'[institut Scripps](https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record.html). Nous les récupérons sous forme d'un fichier en format CSV dont chaque ligne correspond à une date et lui faire correspondre sa concentration CO2 en micro-mole de CO2 par mole (ppm) rapporté par la norme CIO de 2012 et les données ont été prises tous les midis." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analyse des données\n", "\n", "On souhaite tout d'abord supprimer toute l'entête du fichier ne contenant pas les données. On pourrait simplement ignorer les premières lignes, mais on a ici décidé d'enlever toutes les lignes commençant par le caractère '\"' car si le nombre de lignes à supprimer augmente le code ne fonctionnerait plus.\n", "\n", "On ajoute aussi en première ligne \"day,concentration\" pour que pandas puissent les mettre en nom de colonne.\n", "\n", "On garde aussi une copie des données utilisées car on ne modifie le fichier que s'il n'est pas présent dans le répertoire courant." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data_path='donnees.csv'\n", "\n", "def addName(data_path):\n", " with open(data_path,\"r\") as fr:\n", " lines = fr.readlines()\n", " with open(data_path,\"w\") as fw:\n", " fw.write(\"day,concentration\\n\")\n", " for line in lines:\n", " if(line[0]!='\"'):\n", " fw.write(line)\n", " \n", "if not(os.path.exists(data_path)):\n", " url='https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/weekly/weekly_in_situ_co2_mlo.csv'\n", " data_path='donnees.csv'\n", " response = requests.get(url, allow_redirects=True)\n", " with open(data_path,'wb') as file:\n", " file.write(response.content)\n", " addName(data_path)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On va ici lire les informations contenues dans le fichier csv et ensuite convertir les dates en dates lisibles par Python.\n", "Pour pouvoir ensuite analyser les informations et faire une prédiction dans le futur, nous allons calculer pour chaque année\n", "le taux de CO2 moyen et mettre ces données dans deux tableaux distincts." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "raw_data = pd.read_csv(data_path,parse_dates=True)\n", "\n", "def convert_date(x):\n", " y = date.fromisoformat(x)\n", " return y\n", "\n", "\n", "raw_data['day'] = [convert_date(yw) for yw in raw_data['day']]\n", "\n", "nb = 0\n", "somme_conc = 0\n", "tab_year = []\n", "tab_year2 = []\n", "avg_concentration = []\n", "\n", "for i in range(0,(len(raw_data['day'])-1)):\n", " if(raw_data['day'][i].year == raw_data['day'][i+1].year):\n", " somme_conc += raw_data['concentration'][i]\n", " nb = nb +1\n", " else:\n", " year2 = raw_data['day'][i]\n", " year = raw_data['day'][i].year\n", " avg_concentration.append(somme_conc/nb)\n", " tab_year.append(year)\n", " tab_year2.append(year2)\n", " \n", "\n", "raw_data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Affichage des données\n", "Affichons désormais le graphe correspondant avec les informations que nous avons récupérés afin de pouvoir comparer l'augmentation avec différents points de vue." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [ { "ename": "NameError", "evalue": "name 'tab_year2' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"Taux de concentration pour chaque semaine\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtab_year2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mavg_concentration\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"Taux moyen de concentration par année\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtitle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Courbe de concentration en CO2 par semaine'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxlabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Année\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'tab_year2' is not defined" ] } ], "source": [ "axes = plt.axes()\n", "x = raw_data['day']\n", "y = raw_data['concentration']\n", "axes.grid() \n", "plt.plot(x,y, label=\"Taux de concentration pour chaque semaine\")\n", "plt.plot(tab_year2,avg_concentration, label=\"Taux moyen de concentration par année\")\n", "plt.title('Courbe de concentration en CO2 par semaine')\n", "plt.xlabel(\"Année\")\n", "plt.ylabel(\"Concentration en CO2 (ppm)\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prédiction\n", "Afin de facilement pouvoir faire une prédiction nous allons utiliser une droite de [régression linéaire](https://fr.wikipedia.org/wiki/R%C3%A9gression_lin%C3%A9aire)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "slope, intercept, r_value, p_value, std_err = stats.linregress(tab_year, avg_concentration)\n", "\n", "def predict(x):\n", " return slope * x + intercept" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nous affichons maintenant la courbe des moyennes par années et la droite de régression linéaire qui nous permet de voir jusqu'à 2025." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "axes = plt.axes()\n", "axes.grid() \n", "x = range(1958,2025)\n", "plt.plot(tab_year,avg_concentration, label=\"Taux moyen de concentration par année\")\n", "plt.plot(x,predict(x), label=\"Droite de régression linéaire\")\n", "plt.title('Moyenne par année et droite de regréssion')\n", "plt.xlabel(\"Année\")\n", "plt.ylabel(\"Concentration en CO2 (ppm)\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nous pouvons donc observer qu'il y a effectivement une augmentation significative du taux de CO2 chaque année." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"Concentration moyenne de CO2 en 2025 (prédiction arrondie à l'unité) :\",round(predict(2025)),\"ppm\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 5 }