Docker-in-Docker (DinD) capabilities of public runners deactivated. More info

Commit 971e779d authored by TROUSSELLIER Laurent's avatar TROUSSELLIER Laurent
Browse files

Merge branch 'SplitAtelier1' into 'master'

Typo Atelier1_3

See merge request !7
parents bb78aed0 54d94171
Pipeline #152375 passed with stage
in 19 seconds
......@@ -5,7 +5,7 @@
"id": "e7728cc9-572f-49cb-9581-a911b34a24f6",
"metadata": {},
"source": [
"Date de dernière mise à jour : <b>3 décembre 2021</b>\n",
"Date de dernière mise à jour : <b>8 décembre 2021</b>\n",
"\n",
"Contact :<b> Laurent Troussellier</b> ; laurent.troussellier@lsce.ipsl.fr\n"
]
......@@ -23,7 +23,7 @@
"id": "f19b6839-cff0-497f-b85b-587203e774e9",
"metadata": {},
"source": [
"<span style=\"color:green;font-size:larger\" > Prérequis : </span> Avoir un compte sur le mesocentre, et avoir configurer un password pour accéder au jupyter lab de l'IPSL. + VPN si connexion de l'extérieur.\n",
"<span style=\"color:green;font-size:larger\" > Prérequis : </span> Avoir un compte sur le mesocentre, et avoir configuré un password pour accéder au jupyter lab de l'IPSL. + VPN si connexion de l'extérieur.\n",
"\n",
"<span style=\"color:green;font-size:larger\" > But : </span> Comprendre les bases et savoir chercher et tracer des sorties de modèles PMIP\n",
"\n",
......@@ -44,7 +44,7 @@
"<span style=\"color:green;font-size:larger\" > Comment : </span>\n",
"plus ou moins à chaque étape:\n",
"\n",
"- une petite explication de ce que nous voulons faire, et quelles sont les fonctions utiles pour le faire ( soit définie, soit d'une libarire \"classique\" ). Si il y a une fonction définie toute faite, elle a été developpé afin de faciliter le traitement, mais ne nécessite pas de comprehension profonde : simplement la \"lancer\" pour que le jupyter lab la connaisse. \n",
"- une petite explication de ce que nous voulons faire, et quelles sont les fonctions utiles pour le faire ( soit définies, soit issues d'une libarire \"classique\" ). S'il y a une fonction définie toute faite, elle a été developpée afin de faciliter le traitement, mais ne nécessite pas de comprehension profonde : simplement la \"lancer\" pour que le jupyter lab la connaisse. \n",
"- \"A vous de jouer\" laisse 3 cases de \"code\" pour essayer/tester/expérimenter. \n",
"- une case \"réduite\" avec 3 points de supension **...** avec une proposition de solution \n",
"\n"
......@@ -68,8 +68,7 @@
"\n",
"Afin de trouver les simulations qui nous interressent, il y a une page de recherche ici : https://esgf-node.ipsl.upmc.fr/search/cmip6-ipsl/\n",
"\n",
"Comme nous allons le voir a travers ce notebook, nous pouvons faire un peu plus facilement ; tout d'abord nous avons acces à une partie des simulations grâce à un système élaboré de mirroir sur ciclad. Regardons où sont accéssibles les sorties de modèles : \n",
"\n"
"Comme nous allons voir à travers ce notebook, nous pouvons faire un peu plus facilement ; tout d'abord nous avons accès à une partie des simulations grâce à un système élaboré de mirroirs sur ciclad. Regardons où sont accéssibles les sorties de modèles : \n"
]
},
{
......@@ -347,12 +346,12 @@
"source": [
"\n",
"\n",
"Comme on le voit via ces commandes, la structure de repertoire pour les PMIP, et plus généralement pour les CMIP sont bien organisée et surtout standardisée grâce à un \"vocabulaire controlé\" => Controlled Vocabulary (CV): plus d'info ici : https://wcrp-cmip.github.io/CMIP6_CVs/\n",
"Comme on le voit via ces commandes, la structure de repertoire pour les PMIP, et plus généralement pour les CMIP, est bien organisée et surtout standardisée grâce à un \"vocabulaire controlé\" => Controlled Vocabulary (CV): plus d'info ici : https://wcrp-cmip.github.io/CMIP6_CVs/\n",
"\n",
"\"The CVs build on logic that is described in the CMIP6 Global Attributes, DRS, Filenames, Directory Structure, and CV’s document.\"\n",
"\n",
"\n",
"Grâce à tout ceci, un **catalogue PMIP** des sorties disponibles sur ciclad à était mis en place. Ce catalogue est, pour l'instant, situé ici : **\"/modfs/catalog/experimental/CMIP6/PMIP/bdd_CMIP6_PMIP.yaml\"**. Celui ci va nous permettre de chercher dans tous ces dossiers les fichiers qui nous interressent grâce aux différents mots clés utilisés dans par la structure de repertoire.\n",
"Grâce à tout ceci, un **catalogue PMIP** des sorties disponibles sur ciclad a éété mis en place. Ce catalogue est, pour l'instant, situé ici : **\"/modfs/catalog/experimental/CMIP6/PMIP/bdd_CMIP6_PMIP.yaml\"**. Celui-ci va nous permettre de chercher dans tous ces dossiers les fichiers qui nous interressent grâce aux différents mots clés utilisés par la structure de repertoire.\n",
"\n",
"Pour comprendre les catégories et les différentes valeurs possibles, voici un peu de code qui va permettre d'avoir une **visualisation** de ces aspects, Pas besoin de comprendre comment elle fonctionne, nous allons simplement la lancer pour que le Kernel la connaisse et nous allons nous en servir ( comme ces fonctions vont chercher des informations dans le catalogue sur presque 200 000 fichiers puis prepare ces données, cette cellule prend environ 2 min :/ ) \n"
]
......@@ -572,7 +571,7 @@
"source": [
"OK, Maintenant nous pouvons chercher \"visuellement\" ce que l'on souhaite : \n",
"\n",
"par exemple : parmis les PMIP4, quelles sont les différentes **\"institution_id\"**, et sur quelles **\"experiment_id\"** elles ont des sorties : "
"par exemple : parmis les PMIP4, quelles sont les différentes **\"institution_id\"**, et leurs **\"experiment_id\"** associées: "
]
},
{
......@@ -617,7 +616,7 @@
"id": "107e6922-a2bf-4ca8-9f11-c3b3b66033c8",
"metadata": {},
"source": [
"Ou bien, nous pouvons aussi **inverser la logique** : quelles sont les \"experiment_id\", quelles sont les \"institution_id\" qui ont travaillées dessus:"
"Ou bien, nous pouvons aussi **inverser la logique** : parmi les \"experiment_id\", quelles sont les \"institution_id\" qui ont travaillé dessus:"
]
},
{
......@@ -738,11 +737,11 @@
"metadata": {},
"source": [
"Nous avons donc maintenant une idée de ce que l'on peut trouver, les mots clés et leur valeurs\n",
"Dans la \"grosse\" cellule nous avons défini la variable **PMIPCat** qui contient le catalogue et la fonction **Search** qui va nous permettre de chercher à l'intérieur. \n",
"dans la \"grosse\" cellule nous avons défini la variable **PMIPCat** qui contient le catalogue et la fonction **Search** qui va nous permettre de chercher à l'intérieur. \n",
"\n",
"Sans rentrer dans les détails, la fonction **Search** s'utilise comme suit : \n",
"\n",
"Adméttons que je cherche les sorties de modèles qui parle de la variable **tas** (temperature atmosphere surface), qui ont été faite par le **NCAR** et concernant la période **midHolocene** avec une fréquence **day**"
"Adméttons que je cherche les sorties de modèles qui parlent de la variable **tas** (temperature atmosphere surface), qui ont été faites par le **NCAR**, concernant la période **midHolocene** avec une fréquence **day**"
]
},
{
......@@ -750,7 +749,6 @@
"execution_count": 49,
"id": "c8f0f038-f24e-4e40-b7f9-7d7a6319b445",
"metadata": {
"collapsed": true,
"execution": {
"iopub.execute_input": "2021-12-03T12:01:37.846403Z",
"iopub.status.busy": "2021-12-03T12:01:37.845862Z",
......@@ -758,10 +756,6 @@
"shell.execute_reply": "2021-12-03T12:02:07.189575Z",
"shell.execute_reply.started": "2021-12-03T12:01:37.846343Z"
},
"jupyter": {
"outputs_hidden": true,
"source_hidden": true
},
"tags": []
},
"outputs": [
......@@ -925,7 +919,7 @@
"id": "2e867a58-4b7a-40bc-b909-89233e95db1f",
"metadata": {},
"source": [
"Nous voyons que dans la variable **NCARCat** il y a un tableau (pandas) qui énumére les sorties de modèle correspondant à La recherche. De plus, nous avons chercher par l'*institution_id*, il se trouve que pour le NCAR, il y a un seul modèle (**source_id**) qui s'appel CESM2. "
"Nous voyons que dans la variable **NCARCat** il y a un tableau (pandas) qui énumére les sorties de modèle correspondant à La recherche. De plus, comme nous avons recherché par l'*institution_id*, pour le NCAR, il y a un seul modèle (**source_id**) qui s'appelle CESM2. "
]
},
{
......@@ -935,7 +929,7 @@
"source": [
"<span style=\"color:orange;font-size:x-large\" > A vous de jouer : </span>\n",
"\n",
"Essayons de trouver les sorties PMIP4 qui corrépondent au modèle de l'**IPSL** pour la période **lig127k** à la fréquence **Omon** (monthly pour l'océan) pour la variable **tos** (température océan surface). Ces sorties corrépondent aux données avec les lesquels nous allons pouvoir comparer "
"Essayons de trouver les sorties PMIP4 qui correspondent au modèle de l'**IPSL** pour la période **lig127k** à la fréquence **Omon** (monthly pour l'océan) pour la variable **tos** (température océan surface)."
]
},
{
......@@ -1141,9 +1135,9 @@
"id": "d22a5820-e48c-46d2-9248-9ab402112fed",
"metadata": {},
"source": [
"Lorsque la taille des fichiers est petite, nous pouvons les charger directement en mémoire. Ici, les fichiers étant trop volumineux, nous allons utiliser une astuce : la librairie **dask** qui est intégré à **xarray** permet de *montrer* à python comment se chargent les fichiers, si bien qu'il ne les chargent pas completement, mais charge que le début et la fin pour nous permettre de voir que tout va bien : \n",
"Lorsque la taille des fichiers est petite, nous pouvons les charger directement en mémoire. Ici, les fichiers étant trop volumineux, nous allons utiliser une astuce : la librairie **dask** qui est intégrée à **xarray** permet de *montrer* à python comment se chargent les fichiers, si bien qu'il ne les chargent pas completement, mais charge seulement le début et la fin pour nous permettre de voir que tout va bien : \n",
"\n",
"<code>list( ceQuOnVeutSousFormeDeListe )</code> # pour transformer un dataframe panda en list \n",
"<code>list( ceQuOnVeutSousFormeDeListe )</code> # pour transformer un dataframe pandas en list \n",
"<code>IPSL_ds = xr.open_mfdataset( lesCheminsDesFichiersSousFormeDeListe , option1, option2, ...) </code>\n",
"\n",
"Nous allons utiliser certaines options, \n",
......@@ -2027,9 +2021,9 @@
"id": "76e0e255-657c-49ed-86a5-2f0526577b44",
"metadata": {},
"source": [
"Sans rentrer dans les détails (un atelier sera surement sur le format de fichier netcdf), ici nous voyons un \"résumé\" des fichiers aggrégés. \n",
"Nous avons donc dans la variable **IPSL_ds**, toutes les **tos** ou SST pour chaque longitude, latitude sur **6600 mois**. \n",
"Les données que nous allons importer ensuite, sont des données \"Summer\". Pour comparer simplement les mois d'été nous allons selectionner la saison **JJA** sur les 500 ans de notre mega tableaux. Et nous allons donc utiliser la même astuce qu'au dessus, simplement dire à **dask** \"comment\" il faudra selectionner les données : \n",
"Sans rentrer dans les détails (un atelier sur le format de fichier netcdf sera surement proposé), ici nous voyons un \"résumé\" des fichiers aggrégés. \n",
"Nous avons donc dans la variable **IPSL_ds**, toutes les **tos** pour chaque longitude, latitude sur **6600 mois**. \n",
"Il est possible de selectionner seulement une saison. Par exemple, pour les mois d'été nous allons selectionner la saison **JJA** sur les 500 ans de notre mega tableaux. Et nous allons donc utiliser la même astuce qu'au dessus, simplement dire à **dask** \"comment\" il faut selectionner les données : \n",
"\n",
"<code> dataframe.where( condition , options ...) </code> \n",
"<code> condition : dataframe.coords[nomDeLaCoordonnée] == valeur </code> \n",
......@@ -3504,6 +3498,7 @@
"execution_count": 31,
"id": "91018def-82ed-477c-acbb-a70e3648c9b0",
"metadata": {
"collapsed": true,
"execution": {
"iopub.execute_input": "2021-12-03T10:43:02.078382Z",
"iopub.status.busy": "2021-12-03T10:43:02.078086Z",
......@@ -3511,6 +3506,10 @@
"shell.execute_reply": "2021-12-03T10:43:53.051634Z",
"shell.execute_reply.started": "2021-12-03T10:43:02.078349Z"
},
"jupyter": {
"outputs_hidden": true,
"source_hidden": true
},
"tags": []
},
"outputs": [
......@@ -3953,7 +3952,7 @@
"id": "92ae4516-864c-4c4b-8557-0867383613cd",
"metadata": {},
"source": [
"Olé! nous avons maintenant la moyenne de la SST summer sur toute la durée de la simulation pour la période 127ka"
"Olé! nous avons maintenant la moyenne de la tos summer sur toute la durée de la simulation pour la période 127ka"
]
},
{
......@@ -3963,7 +3962,7 @@
"source": [
"# Tracer\n",
"\n",
"Afin de tracer sur une map monde, nous allons utiliser la librairie **geoview** (nous aurions pu utiliser matplotlib + cartopy). "
"Afin de tracer sur une map monde, nous allons utiliser la librairie **geoview** (egalement réalisable avec matplotlib + cartopy). "
]
},
{
......@@ -7051,7 +7050,7 @@
}
},
"source": [
"Pour cela il faut trasformer notre tableau **netcdf** en tableau compréhensible par géoview (**Dataset**), puis indiquer ce que l'on fait de ce dataset : **.to**. On l'envoie dans un **Quadmesh** (map), en lui indiquant les noms des coordonées longitute et latitude. \n",
"Pour cela il faut transformer notre tableau **netcdf** en tableau compréhensible par géoview (**Dataset**), puis indiquer ce que l'on fait de ce dataset : **.to**. On l'envoie dans un **Quadmesh** (map), en lui indiquant les noms des colonnes correspondant aux longitude et latitude. \n",
"\n",
"<code> \n",
" \n",
......@@ -7117,8 +7116,8 @@
"id": "da01e1e2-d349-4f9a-8776-22b4a9b9ca03",
"metadata": {},
"source": [
"Normalement, vous devez avoir eu un **message d'alerte** disant que la sauvegarde du notebook est impossible car l'entity est trop volumineuse. Effectivement, ce quadmesh contient 332 * 362 = 120184 points, représenté dans le fichier du notebook par un tableau contenant toutes les valeurs. La sauvegarde d'un si gros tableau ne peut pas se faire via le reseau. Pour eviter d'avoir ce message toutes les 5 minutes, 2 solutions. la première consite à commenter l'affichage (**#**) ...\n",
"la seconde la fonction **rasterize** d' **holoview** : en effet, Nous ne pouvons pas \"voir\" en même temps 100k points, pourquoi tous les afficher ? rasterize ne trace pas les points mais les pixels, si bien qu'il utilise la valeur de tous les points qui tombe dans un pixel pour l'afficher"
"Normalement, vous devez avoir eu un **message d'alerte** disant que la sauvegarde du notebook est impossible car l'entity est trop volumineuse. Effectivement, ce quadmesh contient 332 * 362 = 120184 points, représenté dans le fichier du notebook par un tableau contenant toutes les valeurs. La sauvegarde d'un si gros tableau ne peut pas se faire via le reseau. Pour eviter d'avoir ce message toutes les 5 minutes, 2 solutions: la première consite à commenter l'affichage (**#**) ...\n",
"la seconde est d'utiliser la fonction **rasterize** d' **holoview** . En effet, nous ne pouvons pas \"voir\" en même temps 100k points, pourquoi donc tous les afficher ? rasterize ne trace pas les points mais les pixels, si bien qu'il utilise la valeur de tous les points qui tombe dans un pixel pour l'afficher"
]
},
{
......@@ -7252,8 +7251,7 @@
"id": "f3ec193e-4224-4522-8199-34edefd0337e",
"metadata": {},
"source": [
"Maintenant que nous avons un graphique avec le modèle. Nous pouvons le personnaliser, mais nous le ferons \n",
"grâce à \n",
"Maintenant que nous avons un graphique avec le modèle. Nous pouvons le personnaliser en utilisant:\n",
"\n",
"<code>\n",
" nomDuGraph.opts(option1,option2...)\n",
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment