"# Sujet 1 : Concentration de CO2 dans l'atmosphère depuis 1958 \n",
"\n",
"## Récupération des données \n",
"\n",
"Les données ont été téléchargées sur le [site Web de l'institut Scripps](https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record.html), dans le fichier \"`monthly_in_situ_c02_mlo.csv`\".\n",
"Formattons le fichier pour ne garder que les données, et non les commentaires (gardons les dans une variable, au cas où).\n",
"Nous allons ici créer un fichier `raw_data.csv` dans lequel nous stockons les données.\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 17,
"outputs": [],
"source": [
"with open(\"monthly_in_situ_co2_mlo.csv\", 'r') as data_file:\n",
" lines = [line for line in data_file]\n",
"\n",
"commentary = []\n",
"with open(\"raw_data.csv\", 'w') as raw_data_file:\n",
" for line in lines:\n",
" if line.startswith('\"'):\n",
" commentary.append(lines)\n",
" else:\n",
" raw_data_file.write(line)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n",
"is_executing": false
}
}
},
{
"cell_type": "markdown",
"source": [
"Chargeons donc les données avec pandas :"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 18,
"outputs": [
{
"name": "stderr",
"text": [
"/home/baptiste/Documents/venvs/develop/lib/python3.6/site-packages/ipykernel_launcher.py:3: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.\n",
" This is separate from the ipykernel package so we can avoid doing imports until\n"
"On va traiter le dataframe pour mettre en forme le header et vérifier les données.\n",
"Le dataframe ne comporte que 4 colonnes que nous allons utiliser :\n",
"\n",
"* Years \n",
"* Months\n",
"* CO2\n",
"* Seasonally adjusted\n",
"\n",
"Les deux premières seront utilisées pour générer un tableau de dates qui serront des objets datetime, initialisés au premier jour de chacun des mois du dataset.\n",
"\n",
"Les deux autres colonnes sont les données qui ont être utilisées pour le premier graphique. \n",
"\n",
"**CO2** contient les quantité brutes de CO2 relevées, et **seasonally adjusted** est le résultat d'un traitement de **CO2** pour retirer les variations saisonnières."
"dates = [datetime.date(year=int(year), month=int(month), day=1) for year, month in zip(raw_dataframe.iloc[2:, 0], raw_dataframe.iloc[2:, 1])]"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% \n",
"is_executing": false
}
}
},
{
"cell_type": "markdown",
"source": [
"## Première analyse \n",
"\n",
"Pour réaliser le premier graphique montrant une oscillation périodique superposée à une évolution systématique plus lente, nous plottons tout d'abord les données brutes de la colonne **CO2** pour pouvoir distinguer les oscillations péridoques et la croissance lente systématique. \n",
"\n",
"Nous n'avons sélectionné que les 100 premiers points pour plus de lisibilité sur le graphique.\n",
"\n",
"De plus, l'axe des ordonnées a été forcé entre 300 et 340 pour ne pas afficher les données manquantes, remplacées par des valeurs à -99. "
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 20,
"outputs": [
{
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"Nous allons maintenant séparer la périodicité. Pour ce faire, il suffit de tracer la différence entre les données ajustées et le données brutes, car la correciton a pour but de gommer la périodicité.\n",
"\n",
"De la même manière que précédemment, nous avons tracé que les 100 premiers points et nous avons adapté l'échelle des ordonnées pour plus de clarté visuelle."
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 21,
"outputs": [
{
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"Pour permettre de faire un modèle simple de la contribution lente jusqu'en 2025, il nous faut d'abord l'estimer avec une fonction. Pour ce faire, analysons le comportement de la contribution simple sur toute la durée disponible : "
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 22,
"outputs": [
{
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"En prenant une unité mensuelle, et avec le polynome $y = 0.0001 x^2 + 0.055 y + 315$, nous arrivons a générer un modèle qui représente bien la courbe de l'augmentation de CO2 pour la durée du dataset (ces valeurs ont été trouvé par methode trial and error). \n",
"Selon notre modèle naif, la valeur de la quantité de C02 jusqu'en 2045 peut être extrapolée. Pour ce faire, nous allons générer tous les mois jusqu'en 2045 : "
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 24,
"outputs": [],
"source": [
"dates_large = dates+[datetime.date(year=year+2021, month=month+1, day=1) for year in range(25) for month in range(12)]"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n",
"is_executing": false
}
}
},
{
"cell_type": "markdown",
"source": [
"Puis appliquer la fonction d'extrapolation :"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 25,
"outputs": [
{
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",