{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from scipy.optimize import curve_fit\n", "import numpy as np\n", "import isoweek " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "data_url = \"https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/monthly/monthly_in_situ_co2_mlo.csv\"\n", "data = \"monthly_in_situ_co2_mlo.csv\"\n", "# Vérifier si le fichier local existe, et s'il n'existe pas, le télécharger depuis l'URL\n", "import os\n", "import urllib.request\n", "\n", "# Vérifier si le fichier local n'existe pas\n", "if not os.path.exists(data):\n", " # Télécharger les données depuis l'URL et les enregistrer dans le fichier local\n", " urllib.request.urlretrieve(data_url, data)\n", " " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index([' Yr', ' Mn', ' Date', ' Date', ' CO2', 'seasonally',\n", " ' fit', ' seasonally', ' CO2', ' seasonally', ' Sta'],\n", " dtype='object')\n" ] } ], "source": [ " # Lire les données depuis le fichier local CSV en sautant la première ligne (commentaire)\n", "raw_data = pd.read_csv(data, skiprows=57)\n", "\n", "# Afficher les données brutes\n", "raw_data\n", " # Sélectionner les lignes contenant au moins une valeur manquante (NaN)\n", "raw_data[raw_data.isnull().any(axis=1)]\n", " # Supprimer les lignes contenant des valeurs manquantes (NaN) à partir des données brutes\n", "data = raw_data.dropna().copy()\n", "\n", "# Afficher les données nettoyées (sans valeurs manquantes) et en créer une copie\n", "data\n", "data = data.dropna(subset=[' CO2'])\n", "print(data.columns)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.6/site-packages/ipykernel_launcher.py:13: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", " del sys.path[0]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAADvCAYAAAAU0Gi6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAF7BJREFUeJzt3X+MXOV97/H3Z71m17lZ35CyS+xd/6CtIbFBWcTK9q11lbi0xSQIG1VBvnEA6aI6AqJStVeAU/5Ib02VWzVp67ahOLcVUIdSV42FleI24Jv0UsnYWSekxDiu3eIYY4ddLs3Fzr0esrvf/jHPmvHu7MyZ/TUzez4vabRnnjln5hmE53vO9/k+51FEYGZm+dRS7w6YmVn9OAiYmeWYg4CZWY45CJiZ5ZiDgJlZjjkImJnlmIOAmVmOOQiYmeWYg4CZWY611rsD1VxxxRWxfPnyenfDzKypHD58+M2I6Ky2X8MHgeXLl9Pf31/vbpiZNRVJP8iyn9NBZmY55iBgZpZjDgJmZjnmIGBmlmMOAmZmOeYgYGZWZwNvX+D2xw4wcO7CrH92piAg6aSklyW9JKk/tb1f0nOSjqe/l5fsv03SCUnHJN1U0n5Dep8TknZI0vR/JTOzxlXuB3/H/uN86+Rb7Hj++Kz3p5Z5Ausj4s2S5w8B+yPi85IeSs8flLQS2AysAhYDz0u6OiKGgUeBrcCLwLPABmDfNHwPM7OmUPqD/9eHT1MYGrn42q6Dp9h18BRtrS0c237zrPRnKpPFNgIfTdtPAN8EHkztT0dEAXhV0glgtaSTwMKIOAAg6UlgEw4CZjZHDbx9gc/85Xf4409ez3/+H98Y94MP0CK4rLWFCz8ZoX1+Czet+gC/+fEPzVofs44JBPB1SYclbU1tV0bEWYD0tyu1dwOvlRx7OrV1p+2x7eNI2iqpX1L/4OBgxi6amTWW0rP+Fx5Yz629i2mfX/zZbZ/fwsbexWy6vpvC0AhtrS0UhkboaGulq6N91vqY9UpgXUSckdQFPCfp+xX2LZfnjwrt4xsjdgI7Afr6+sruY2bWaEbP/F967Ue8UybN06Lij17pD/7g+QJb1izjk6uX8tShUwzO8uBwpiAQEWfS3wFJe4DVwBuSFkXEWUmLgIG0+2lgScnhPcCZ1N5Tpt3MbE4YPfO/rbeboQi+fuSHl6R5/u///wk9l7/nkh/8x+7ou3j89k3XznqfqwYBSf8BaImIc2n7l4D/DuwF7gI+n/4+kw7ZCzwl6YsUB4ZXAIciYljSOUlrgYPAncAfTfcXMjObbdc8vO+SfP9Xv/P6xe3Ss/4/3Hz9xfZ6/OCXk2VM4ErgHyV9FzgE/G1E/B3FH/9flHQc+MX0nIg4AuwGXgH+DrgvVQYB3AP8T+AE8C94UNjMmlRpqWe5fP+i/9jOL9/QzZ5717FlzTIGzxfq3OPyql4JRMS/Ah8u0/5/gBsnOOYR4JEy7f1AY4Q/M7OMSqt8RgdtSwd9t992HR1trZcM8N74wS6233Yd0Dhn/eU0/HoCZmb1lqW2v0XUdYB3shTR2MU3fX194UVlzGw2TVTlM2qi2v7ZLO2sRtLhiOirtp+vBMzMxqhW5TOvRez5zut1q+2fTg4CZmZJ1iqfetf2Tyeng8ws10oHfQnY/uzRS878L3/PZfzcz/4Ud6/76bK1/Y3K6SAzswzmSpXPZDkImFluVLuhWzNX+UyWg4CZzUnVavtfeGD9uNTP2CqfuXjmP5aDgJnNSVlr+8fe0K1Zq3wmy0HAzOaUsRU+le7bX+6GbnnjIGBmc8Jo+mfPvT/Hn/7vf81U29+IN3SbbV5o3syaTqV1ep86eGpchU9HWys/LgyxZc2yhr+h22zzlYCZNZ1q+X4opn/23LuuYe7b36g8WczMGlqlss5RzXAvn9mWdbKY00Fm1tCaYZ3eZuZ0kJk1lGZcp7eZOQiYWUNpxnV6m5mDgJnVTaV8fzOt09vMPCZgZrOiUlnnRPn+Zlmnt5m5OsjMZsXDe17mK4dOsWX10nFlnaNG8/2XzWvhneERtqxeevEOnlYb30razOqq0gAv+DYOjcJBwMymrNIdO2tZotH5/tnnIGBmU1ZpBm8elmhsZh4TMLOaTGYGb7Mu0djMPCZgZjMiy8IsY1M9c32JxmaWOQhImgf0A69HxC2SPgf8CjCYdvlsRDyb9t0G3A0MA78aEX+f2m8AHgcWAM8C90ejX4qY5Zxn8M5ttVwJ3A8cBRaWtP1+RPxe6U6SVgKbgVXAYuB5SVdHxDDwKLAVeJFiENgA7Jt8981spnkG79yWKQhI6gE+DjwC/HqV3TcCT0dEAXhV0glgtaSTwMKIOJDe80lgEw4CZg3DM3jzJ+uM4T8AHgDGjgB9RtI/SfpzSZentm7gtZJ9Tqe27rQ9tn0cSVsl9UvqHxwcLLeLmU2RZ/AaZLgSkHQLMBARhyV9tOSlR4HfppgO/G3gC8B/BVTmbaJC+/jGiJ3ATihWB1Xro5nVbjILsXuAd+7Jkg5aB9wq6WNAO7BQ0q6I+NToDpK+DHwtPT0NLCk5vgc4k9p7yrSb2SzwDF4rp2oQiIhtwDaAdCXw3yLiU5IWRcTZtNttwPfS9l7gKUlfpDgwvAI4FBHDks5JWgscBO4E/mhav42ZAZ7Ba9lNZZ7A70rqpXi1eBL4NEBEHJG0G3gFGALuS5VBAPfwbonoPjwobDZllX7wPYPXqvGMYbMml/XunJ7Bmy+eMWw2R00mt+8ZvDYRLypj1sAqlXHect2izIuu/7gwxJY1y1zaaeP4SsCsgU1Xbt8zeG0iHhMwaxC+O6dNp6xjAk4HmdXBZGbrlkv13PjBLr7wiV5WLl7I9k3XOgBYzZwOMquDyczWdRmnzQSng8xmwUQVPaOyztb1mb5l5RJRs1lQbqKWZ+taM3EQMKvB2B/40rTOaN29Z+taM3E6yGwC5c7oR2fntgDDGf/puKLH6sHpILMpqnRGPzxm3/b5LXzk6k4A/uGfBz1b15qGg4AZlWv0J7odwwcWtvODt/4fl80r/rh3vreNgHGzdZ3qsUbmIGDG+Br97c8erTp4OzwSZX/cPVvXmonHBCyXspRsBnDZvBbeGR5hy+qlDJ4v0NnR7pJNawoeEzBLJlOyWa1G32f0Nlc4CNicMl0LrLhG3/LCQcCaWqW6/XK3Y4BsJZtmeeExAWtq1er2Ky2wUprvHy3ZNJsrPCZgc06lMs5ydfsT3Y7BJZtm73IQsIZULbdfroxzbN2+F1gxq87pIGsIY3/0sy6eXlrG2fO+BXzkmi6XcJqRPR3kIGCzbjL35PGtls1q4zEBawi1lmzWktt3GafZ1DkI2LSajpLNrLl9M5s6p4NsWk1HyaZz+2ZTN+3pIEnzgH7g9Yi4RdL7gb8ClgMngdsj4t/SvtuAuyle3f9qRPx9ar8BeBxYADwL3B+NHoVsQjNZsjma3nGax2xmtdSw7/3A0ZLnDwH7I2IFsD89R9JKYDOwCtgAfCkFEIBHga3AivTYMKXe26wZePsCtz92gIGSNMzYks1bexfTPr/4v1T7/BaW/9R7kC69HcOPC0NsWbOMPfeuY8uaZQyeL/DYHX1s33QtKxcvZPuma33WbzaLMl0JSOoBPg48Avx6at4IfDRtPwF8E3gwtT8dEQXgVUkngNWSTgILI+JAes8ngU3Avun4Ija9as3t7zp46mLJZqVbLbtG36yxZE0H/QHwANBR0nZlRJwFiIizkrpSezfwYsl+p1PbT9L22PZxJG2leMXA0qVLM3bRsqh1YfT/9Dv7L8ntTzSYO1HJptM6Zo2tahCQdAswEBGHJX00w3uqTFtUaB/fGLET2AnFgeEMn2kZ1bowuks2zea2LFcC64BbJX0MaAcWStoFvCFpUboKWAQMpP1PA0tKju8BzqT2njLtNkOqLZk4elZf2gYu2TTLk6oDwxGxLSJ6ImI5xQHf/xURnwL2Anel3e4Cnknbe4HNktokXUVxAPhQSh2dk7RWkoA7S46xaTB28LbawO1Nq67kplVXXtK2sXcxm67vvmSd3NHcvgdzzeaeqUwW+zywW9LdwCngEwARcUTSbuAVYAi4LyJGswr38G6J6D48KJzJdOTxyw3c1rIwunP7ZnOTJ4s1gdKbqY3m8bPcYG1UpYFbwOvmms1BvoFck6h0lj/RIujlVMrje+EUs/zJGgRqmSxmU1RtwtXYtluuWzSteXwzs7F8A7kZNJkJV6XKLYLuPL6ZTSengzIY+2NeLoVTTq03U/vI1Z0A/MM/D1ZdBN15fDOrxOsJTFK1+99vv+26shOuSl3z8L5JTbgqd5Z/4we7Ln5GuTN6n+Wb2VTk6kogyxl9LVU3o9paWzi2/eZLPqfS+rejA7WD5wvjzujBZ/lmNnW+Eiij0hl9lgVP2lrFFe9t583zBQpD794z5zc//qFLPqdrYTsdba1lB2pruZmaz/LNbKblIgiMTc+MHYStdFO00pTNO8MjvOeyebwzfOmgbLlxgTc9UGtmTSAX6aCx6ZmJzujHrnBVLmXz9SM/5JdWfcDpGjNraE4HlRibnpnojL5cmeXYlE3pWbzP6M2s2eUiCMD49MzXj/zQC56YWe7lIh1kZpY3vm2EmZlV5SBgZpZjDgJmZjnmIGBmlmMOAmZmOeYgYGaWYw4CZmY55iBgZpZjDgJmZjnmIGBmlmMOAmZmOeYgYGaWYw4CZmY5VjUISGqXdEjSdyUdkfRbqf1zkl6X9FJ6fKzkmG2STkg6JummkvYbJL2cXtshSTPztczMLIssVwIF4Ocj4sNAL7BB0tr02u9HRG96PAsgaSWwGVgFbAC+JGle2v9RYCuwIj02TN9XMTObGwbevsDtjx1g4NyFGf+sqkEgis6np/PTo9IiBBuBpyOiEBGvAieA1ZIWAQsj4kAUFzF4Etg0te6bmc09O/Yf51sn32LH88dn/LMyrSyWzuQPAz8L/ElEHJR0M/AZSXcC/cBvRMS/Ad3AiyWHn05tP0nbY9vLfd5WilcMLF26tKYvZGbWrK55eB+FoZGLz3cdPMWug6doa23h2PabZ+QzMw0MR8RwRPQCPRTP6q+lmNr5GYoporPAF9Lu5fL8UaG93OftjIi+iOjr7OzM0kUzs6b3wgPrubV3Me3ziz/N7fNb2Ni7mBceXD9jn1lTdVBE/Aj4JrAhIt5IwWEE+DKwOu12GlhSclgPcCa195RpNzMzoGthOx1trRSGRmhrbaEwNEJHWytdHe0z9plZqoM6Jb0vbS8AfgH4fsrxj7oN+F7a3gtsltQm6SqKA8CHIuIscE7S2lQVdCfwzDR+FzOzpvfm+QJb1ixjz73r2LJmGYPnCzP6eVnGBBYBT6RxgRZgd0R8TdJfSOqlmNI5CXwaICKOSNoNvAIMAfdFxHB6r3uAx4EFwL70MDOz5LE73l0bfvuma2f881Qs1GlcfX190d/fX+9umJk1FUmHI6Kv2n6eMWxmlmMOAmZmOeYgYGaWYw4CZmY55iBgZpZjDgJmZjnmIGBmlmMOAmZmOeYgYGaWYw4CZmY55iBgZpZjDgJmZjnmIGBmlmMOAmZmOeYgYGaWYw4CZmY55iBgZpZjDgJmZjnmIGBmlmMOAmZmOeYgYGaWYw4CZmY55iBgZpZjDgJmZjnmIGBmlmNVg4CkdkmHJH1X0hFJv5Xa3y/pOUnH09/LS47ZJumEpGOSbippv0HSy+m1HZI0M1/LzMyyyHIlUAB+PiI+DPQCGyStBR4C9kfECmB/eo6klcBmYBWwAfiSpHnpvR4FtgIr0mPDNH4XMzOrUdUgEEXn09P56RHARuCJ1P4EsCltbwSejohCRLwKnABWS1oELIyIAxERwJMlx5iZWR1kGhOQNE/SS8AA8FxEHASujIizAOlvV9q9G3it5PDTqa07bY9tNzOzOskUBCJiOCJ6gR6KZ/XXVti9XJ4/KrSPfwNpq6R+Sf2Dg4NZumhmZpNQU3VQRPwI+CbFXP4bKcVD+juQdjsNLCk5rAc4k9p7yrSX+5ydEdEXEX2dnZ21dNHMzGqQpTqoU9L70vYC4BeA7wN7gbvSbncBz6TtvcBmSW2SrqI4AHwopYzOSVqbqoLuLDnGzMzqoDXDPouAJ1KFTwuwOyK+JukAsFvS3cAp4BMAEXFE0m7gFWAIuC8ihtN73QM8DiwA9qWHmZnViYqFOo2rr68v+vv7690NM7OmIulwRPRV288zhs3McsxBwMwsxxwEzMxyzEHAzCzHHATMzHLMQcDMLMccBMzMcsxBwMwsxxwEzMxyzEHAzCzHHATMzHLMQcDMLMccBMzMcsxBwMwsxxwEzMxyzEHAzCzHHATMzHLMQcDMLMccBMzMcsxBwMwsxxwEzMxyzEFgmgy8fYHbHzvAwLkL9e6KmVlmDgLTZMf+43zr5FvseP54vbtiZpZZa7070OyueXgfhaGRi893HTzFroOnaGtt4dj2m+vYMzOz6nwlMEUvPLCeW3sX0z6/+J+yfX4LG3sX88KD6+vcMzOz6hwEpqhrYTsdba0UhkZoa22hMDRCR1srXR3t9e6amVlVVYOApCWSviHpqKQjku5P7Z+T9Lqkl9LjYyXHbJN0QtIxSTeVtN8g6eX02g5JmpmvNbvePF9gy5pl7Ll3HVvWLGPwfKHeXTIzy0QRUXkHaRGwKCK+LakDOAxsAm4HzkfE743ZfyXwl8BqYDHwPHB1RAxLOgTcD7wIPAvsiIh9lT6/r68v+vv7J/XlzMzyStLhiOirtl/VK4GIOBsR307b54CjQHeFQzYCT0dEISJeBU4Aq1MwWRgRB6IYeZ6kGEzMzKxOahoTkLQcuB44mJo+I+mfJP25pMtTWzfwWslhp1Nbd9oe217uc7ZK6pfUPzg4WEsXzcysBpmDgKT3An8D/FpEvA08CvwM0AucBb4wumuZw6NC+/jGiJ0R0RcRfZ2dnVm7aGZmNcoUBCTNpxgAvhIRXwWIiDciYjgiRoAvUxwDgOIZ/pKSw3uAM6m9p0y7mZnVSZbqIAF/BhyNiC+WtC8q2e024Htpey+wWVKbpKuAFcChiDgLnJO0Nr3nncAz0/Q9zMxsErLMGF4H3AG8LOml1PZZ4L9I6qWY0jkJfBogIo5I2g28AgwB90XEcDruHuBxYAGwLz3MzKxOqpaI1ptLRM3MajdtJaJmZjZ3OQiYmeWYg4CZWY45CJiZ5ZiDgJlZjjkImJnlmIOAmVmOOQiYmeWYg4CZWY45CJiZ5ZiDgJlZjjkImJnlmIOAmVmOOQiYmeWYg4CZWY45CJiZ5dicDQIDb1/g9scOMHDuQr27YmbWsOZsENix/zjfOvkWO54/Xu+umJk1rCxrDDeVax7eR2Fo5OLzXQdPsevgKdpaWzi2/eY69szMrPHMuSuBFx5Yz629i2mfX/xq7fNb2Ni7mBceXF/nnpmZNZ45FwS6FrbT0dZKYWiEttYWCkMjdLS10tXRXu+umZk1nDmXDgJ483yBLWuW8cnVS3nq0CkGPThsZlaWIqLefaior68v+vv7690NM7OmIulwRPRV22/OpYPMzCw7BwEzsxyrGgQkLZH0DUlHJR2RdH9qf7+k5yQdT38vLzlmm6QTko5Juqmk/QZJL6fXdkjSzHwtMzPLIsuVwBDwGxHxIWAtcJ+klcBDwP6IWAHsT89Jr20GVgEbgC9Jmpfe61FgK7AiPTZM43cxM7MaVQ0CEXE2Ir6dts8BR4FuYCPwRNrtCWBT2t4IPB0RhYh4FTgBrJa0CFgYEQeiOBr9ZMkxZmZWBzWNCUhaDlwPHASujIizUAwUQFfarRt4reSw06mtO22PbS/3OVsl9UvqHxwcrKWLZmZWg8zzBCS9F/gb4Nci4u0K6fxyL0SF9vGNETuBnelzByX9IGs/x7gCeHOSx9ab+z77mrXf4L7XSyP3fVmWnTIFAUnzKQaAr0TEV1PzG5IWRcTZlOoZSO2ngSUlh/cAZ1J7T5n2iiKiM0sfJ+h3f5Y62Ubkvs++Zu03uO/10sx9H5WlOkjAnwFHI+KLJS/tBe5K23cBz5S0b5bUJukqigPAh1LK6Jyktek97yw5xszM6iDLlcA64A7gZUkvpbbPAp8Hdku6GzgFfAIgIo5I2g28QrGy6L6IGE7H3QM8DiwA9qWHmZnVSdUgEBH/SPl8PsCNExzzCPBImfZ+4NpaOjhFO2fxs6ab+z77mrXf4L7XSzP3HWiCeweZmdnM8W0jzMxyzEHAzCzHHATMzHLMQcDMLMccBMzMcsxBwMwsx/4d/0I/VjKNyHwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Grouper par année (Yr) et sommer les valeurs de CO2\n", "annees = data[' Yr'].unique() # Obtenir la liste des années uniques\n", "\n", "# Initialiser les listes pour stocker les années et les émissions de CO2 annuelles\n", "year = [] # Liste des années\n", "yearly_CO2 = [] # Liste des émissions annuelles de CO2\n", "\n", "for annee in annees:\n", " # Filtrer les données pour l'année spécifique\n", " donnees_annee = data[data[' Yr'] == annee]\n", " \n", " # Somme des émissions de CO2 pour l'année spécifique\n", " donnees_annee[' CO2'] = donnees_annee[' CO2'].astype(float)\n", " somme_co2_annee = donnees_annee[' CO2'].sum()\n", " \n", " # Ajouter l'année et la somme des émissions à leurs listes respectives\n", " year.append(annee)\n", " yearly_CO2.append(somme_co2_annee)\n", "\n", "# Créer une série pandas avec les données annuelles et les années comme index\n", "yearly_CO2 = pd.Series(data=yearly_CO2, index=year)\n", "# Tracer un graphique de dispersion des données d'incidence annuelle avec un style en étoile\n", "yearly_CO2.plot(style='*')" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (, line 16)", "output_type": "error", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m16\u001b[0m\n\u001b[0;31m if response.status_code == 200:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ "#Séparez ces deux phénomènes. Caractérisez l'oscillation périodique. Proposez un modèle simple de la contribution lente, estimez ses paramètres et tentez une extrapolation jusqu'à 2025 (dans le but de pouvoir valider le modèle par des observations futures).\n", "import requests\n", "import certifi\n", "from bs4 import BeautifulSoup\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.optimize import curve_fit\n", "\n", "# URL de la page avec les données de CO2\n", "url = \"https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record.html\"\n", "\n", "# Envoyer une requête GET pour récupérer la page web avec vérification SSL\n", "response = requests.get(url, verify=False\n", "# Vérifier que la requête s'est bien déroulée\n", "if response.status_code == 200:\n", " # Parser le contenu HTML de la page en utilisant html5lib\n", " soup = BeautifulSoup(response.content, \"html5lib\")\n", "\n", " # Trouver la table qui contient les données de CO2 (l'élément correspondant)\n", " table = soup.find(\"table\")\n", "\n", " # Utiliser Pandas pour extraire les données tabulaires\n", " data = pd.read_html(str(table))[0]\n", "\n", " # Les données contiennent probablement des colonnes de date et de CO2. Vous pouvez les renommer.\n", " data.columns = [\"Date\", \"CO2\"]\n", "\n", " # Convertir la colonne de date en objets datetime\n", " data[\"Date\"] = pd.to_datetime(data[\"Date\"])\n", "\n", " # Tracer les données\n", " plt.figure(figsize=(12, 6))\n", " plt.plot(data[\"Date\"], data[\"CO2\"])\n", " plt.title(\"Concentration de CO2 dans l'atmosphère au Mauna Loa Observatory\")\n", " plt.xlabel(\"Date\")\n", " plt.ylabel(\"Concentration de CO2 (ppm)\")\n", "\n", " # Définition d'une fonction pour le modèle de la contribution lente (par exemple, une fonction linéaire)\n", " def slow_contrib(x, a, b):\n", " return a * x + b\n", "\n", " # Ajustement du modèle aux données\n", " popt, _ = curve_fit(slow_contrib, data.index, data[\"CO2\"])\n", " a, b = popt\n", "\n", " # Extrapolation jusqu'en 2025\n", " future_dates = pd.date_range(start=data[\"Date\"].min(), end=pd.to_datetime(\"2025-01-01\"))\n", " future_indices = np.arange(len(data), len(data) + len(future_dates))\n", " future_co2 = slow_contrib(future_indices, a, b)\n", "\n", " # Tracer l'extrapolation\n", " plt.plot(future_dates, future_co2, label=\"Extrapolation jusqu'en 2025\")\n", " plt.legend()\n", "\n", " # Afficher le graphique\n", " plt.grid(True)\n", " plt.show()\n", "else:\n", " print(\"La requête a échoué. Code de statut :\", response.status_code)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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": 2 }