From f394b233cc38af0971421738d62352a06c11bf49 Mon Sep 17 00:00:00 2001 From: Lino Galiana <33896139+linogaliana@users.noreply.github.com> Date: Thu, 13 Oct 2022 14:32:05 +0200 Subject: [PATCH] Dernieres modifs geopandas (#298) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * intro * Relec ka 1210 (geopandas V2) (#297) * relec geopandas TUTO * relec geopandas TP * coquilles de numérotations ! * Revoir la partie Git (#296) * Automated changes * Automated changes Co-authored-by: github-actions[bot] * Automated changes * Automated changes * update * Automated changes * Automated changes * featured image * requests * Automated changes * Automated changes Co-authored-by: Kim A Co-authored-by: github-actions[bot] --- content/course/git/_index.md | 46 ++++++++--- content/course/git/introgit/index.qmd | 76 +++++++++++++------ .../manipulation/03_geopandas_TP/index.qmd | 51 ++++++++----- .../03_geopandas_tutorial/index.qmd | 9 ++- 4 files changed, 124 insertions(+), 58 deletions(-) diff --git a/content/course/git/_index.md b/content/course/git/_index.md index 59a9cf21e..675d8ffec 100644 --- a/content/course/git/_index.md +++ b/content/course/git/_index.md @@ -1,5 +1,5 @@ --- -title: "Git: un élément essentiel au quotidien" +title: "Git: un outil nécessaire pour les data-scientists" date: 2020-07-16T13:00:00Z draft: false weight: 70 @@ -8,22 +8,47 @@ icon: git-alt icon_pack: fab #linktitle: "Partie 4: Natural Language Processing (NLP)" summary: | - Une partie annexe au cours pour découvrir Git, un langage - devenu indispensable pour les data-scientists et économistes - pour stocker et partager des projets Python. + Une partie annexe au cours pour découvrir `Git`, + un outil + devenu indispensable pour les data-scientists + afin de mener des projets impliquant + du code `Python`. type: book --- Cette partie du site présente un élément qui n'est pas propre à `Python` mais qui est néanmoins indispensable: la pratique de `Git`. -Une grande partie du contenu de ce chapitre provient du cours -[Travail collaboratif avec `R`](https://linogaliana.gitlab.io/collaboratif/git.html). +Une grande partie du contenu de la partie provient du cours +[Travail collaboratif avec `R`](https://linogaliana.gitlab.io/collaboratif/git.html) +ou d'un [cours dédié fait avec Romain Avouac](https://formation.pages.lab.sspcloud.fr/git/20220929-formation-git-dese/#/title-slide). +Le chapitre [de présentation de `Git`](/introgit) propose +une introduction visant à présenter l'intérêt d'utiliser +cet outil. Une mise en pratique est proposée +avec [un cadavre exquis](/exogit). -# Utilisation de git avec Python -### Configurer pycharm pour utiliser le plugin git + +# Utilisation de `Git` avec `Python` + +`Git` est à la fois un outil et un langage. Il +est donc nécessaire d'installer, dans un premier +temps `Git Bash`, puis de connecter +son outil préféré pour faire du `Python` (qu'il +s'agisse de `Jupyter`, `VSCode` ou `PyCharm`). + +L'un des intérêts d'utiliser une approche _cloud_ +est que l'utilisateur final n'a pas à se préoccuper +de l'installation de ces différentes briques. +Les interfaces `Git` sont parfois déjà +configurées pour faciliter l'usage. C'est le +cas sur le `SSPCloud`. + + +# Configuration + +## Configurer `PyCharm` pour utiliser le plugin `Git` Aller dans `File > Settings > Version Control > Git` pour définir le chemin vers lequel `Pycharm` doit trouver @@ -39,13 +64,12 @@ le sous-dossier `cmd/git.exe`)[^1] de mot de passe tapé trop vite, les tentatives de connexion au dépôt distant seront systématiquement refusées - -### Configurer Jupyter pour utiliser le plugin git +## Configurer `Jupyter` pour utiliser le plugin `Git` La marche à suivre est présentée [sur cette page](https://github.com/jupyterlab/jupyterlab-git) -### Configuration Visual Studio pour utiliser `Git` +## Configurer `Visual Studio` pour utiliser le plugin `Git` Vous pouvez par exemple vous référer à [cette documentation](https://docs.microsoft.com/fr-fr/visualstudio/version-control/git-with-visual-studio?view=vs-2019) diff --git a/content/course/git/introgit/index.qmd b/content/course/git/introgit/index.qmd index 2b8c95974..56e2f31fe 100644 --- a/content/course/git/introgit/index.qmd +++ b/content/course/git/introgit/index.qmd @@ -10,10 +10,10 @@ categories: - Tutoriel type: book summary: | - Git est un système de contrôle de version qui facilite la + `Git` est un système de contrôle de version qui facilite la sauvegarde, la gestion des évolutions et le partage d'un projet informatique. Il s'agit d'un élément devenu - indispensable dans le domaine de la data-science. + indispensable dans le domaine de la _data-science_. Ce chapitre présente quelques concepts qui seront mis en pratique dans le suivant. --- @@ -34,6 +34,9 @@ print_badges("content/course/git/introgit.qmd") ``` ::: +Cette page reprend des éléments présents dans +un [cours dédié fait avec Romain Avouac](https://formation.pages.lab.sspcloud.fr/git/20220929-formation-git-dese/#/title-slide) + # Pourquoi faire du `Git` ? Dans un projet, il est commun de se demander (ou de demander à quelqu'un) : @@ -45,19 +48,32 @@ Dans un projet, il est commun de se demander (ou de demander à quelqu'un) : * comment fusionner des programmes écrits par plusieurs personnes * etc. -![](https://pbs.twimg.com/media/EiG-dwJVkAA-J0L?format=jpg&name=medium) +```{python} +import requests +url = "https://thinkr.fr/wp-content/uploads/git_notfinal.gif" +response = requests.get(url) +if response.status_code == 200: + + with open("featured.png", 'wb') as f: + f.write(response.content) +``` + +![](https://thinkr.fr/wp-content/uploads/git_notfinal.gif) -Il existe un outil informatique puissant qui répond à tous ces besoins : la gestion de version (*version control system* (VCS) en anglais). Ses avantages sont incontestables et permettent de facilement : +Il existe un outil informatique puissant qui répond à tous ces besoins : +la __gestion de version__ (*version control system* (VCS) en anglais). Ses avantages sont incontestables et permettent de facilement : -* enregistrer l'historique des modifications d'un ensemble de fichiers -* revenir à des versions précédentes d'un ou plusieurs fichiers -* rechercher les modifications qui ont pu créer des erreurs -* partager ses modifications et récupérer celles des autres -* proposer des modifications, les discuter, sans pour autant modifier d'emblée la dernière version existante -* identifier les auteurs et la date des modifications +* enregistrer l'historique des modifications d'un ensemble de fichiers ; +* revenir à des versions précédentes d'un ou plusieurs fichiers ; +* rechercher les modifications qui ont pu créer des erreurs ; +* partager ses modifications et récupérer celles des autres ; +* proposer des modifications, les discuter, sans pour autant modifier d'emblée la dernière version existante ; +* identifier les auteurs et la date des modifications. -En outre, ces outils fonctionnent avec tous les langages informatiques (texte, R, Python, SAS, $\LaTeX$, Java, etc.) car reposent sur la comparaison des lignes et des caractères des programmes. +En outre, ces outils fonctionnent avec tous les langages +informatiques (texte, `R`, `Python`, `SAS`, $\LaTeX$, `Java`, etc.) +car reposent sur la comparaison des lignes et des caractères des programmes. On peut ainsi résumer les principaux avantages du contrôle de version @@ -71,9 +87,14 @@ de la manière suivante : ## Conserver et archiver du code -Une des principales fonctionnalités de la gestion de version est de conserver l'ensemble des fichiers de façon sécurisée et de proposer un archivage structuré des codes. Les fichiers sont stockés dans un **dépôt**, qui constitue le projet. +Une des principales fonctionnalités de la gestion de version est de conserver +l'ensemble des fichiers de façon sécurisée et de proposer un archivage +structuré des codes. Les fichiers sont stockés dans un **dépôt**, qui constitue le projet. -Tout repose dans la gestion et la présentation de l'historique des modifications. Chaque modification (ajout, suppression ou changement) sur un ou plusieurs fichiers est identifiée par son auteur, sa date et un bref descriptif[^1]. Chaque changement est donc unique et aisément identifiable quand les modifications sont classées par ordre chronologique. Les groupes de modifications transmis au dépôt sont appelées **commit**. +Tout repose dans la gestion et la présentation de l'historique des modifications. +Chaque modification (ajout, suppression ou changement) sur un ou plusieurs fichiers est identifiée par son auteur, +sa date et un bref descriptif[^1]. +Chaque changement est donc unique et aisément identifiable quand les modifications sont classées par ordre chronologique. Les groupes de modifications transmis au dépôt sont appelées **commit**. [^1]: Plus précisément, chaque modification est identifiée de manière unique par un code `SHA` auquel est associé l'auteur, l'horodatage et des métadonnées (par exemple le message descriptif associé). @@ -101,12 +122,19 @@ La gestion de version permet de collaborer simplement et avec méthode. De faço * trouver rapidement des erreurs et en diffuser rapidement la correction -A ces avantages s'ajoutent les fonctionalités collaboratives des sites de dépôt -(les principaux étant `Github` et `Gitlab`), qui permettent d'intéragir via -des [*issues*](https://github.com/linogaliana/python-datascientist/issues), faire des suggestions de modifications, etc. - +A ces avantages s'ajoutent les fonctionalités collaboratives des __forges__ +qui sont des plateformes où peuvent être stockés des dépôts. +Néanmoins, ces forges proposent aujourd'hui beaucoup de fonctionalités +qui vont au-delà de l'archivage de code: +intéragir via +des [*issues*](https://github.com/linogaliana/python-datascientist/issues), +faire des suggestions de modifications, exécuter du code dans des +environnements normalisés, etc. +Il faut vraiment les voir comme des réseaux sociaux du code. +Les principales plateformes dans ce domaine étant `Github` et `Gitlab`. -L'usage individuel, c'est-à-dire seul sur son projet, permet aussi de "travailler en équipe avec soi-même" car il permet de retrouver des mois plus tard le contenu et le contexte des modifications. Cela est notamment précieux lors des changements de poste ou des travaux réguliers mais espacés dans le temps (par exemple, un mois par an chaque année). Même lorsqu'on travaille tout seul, on collabore avec un *moi* futur qui peut ne plus se souvenir de la modification des fichiers. +L'usage individuel, c'est-à-dire seul sur son projet, +permet aussi de "travailler en équipe avec soi-même" car il permet de retrouver des mois plus tard le contenu et le contexte des modifications. Cela est notamment précieux lors des changements de poste ou des travaux réguliers mais espacés dans le temps (par exemple, un mois par an chaque année). Même lorsqu'on travaille tout seul, on collabore avec un *moi* futur qui peut ne plus se souvenir de la modification des fichiers. @@ -140,11 +168,11 @@ qu'on rend généralement visible au moyen de badges Il existe plusieurs manières d'utiliser le contrôle de version : -* en ligne de commande, via [git bash](https://gitforwindows.org/), par exemple ; -* avec une interface graphique spécialisée, par exemple [tortoise git](https://tortoisegit.org/) ou [GitHub Desktop](https://desktop.github.com/) ; +* en ligne de commande, via [Git Bash](https://gitforwindows.org/), par exemple ; +* avec une interface graphique spécialisée, par exemple [Tortoise Git](https://tortoisegit.org/) ou [GitHub Desktop](https://desktop.github.com/) ; * avec un logiciel de développement : la plupart des logiciels de développement ([RStudio](https://www.book.utilitr.org/git.html) pour `R`, [PyCharm](https://www.jetbrains.com/help/pycharm/using-git-integration.html), [jupyter](https://annefou.github.io/jupyter_publish/02-git/index.html) ou encore -[visual studio (extension GitLens)](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) -pour `python`, proposent tous des modules graphiques facilitant l'usage de `Git`. +[Visual Studio (extension GitLens)](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) +pour `Python`, proposent tous des modules graphiques facilitant l'usage de `Git`. `Git` a été conçu, initialement pour la ligne de commande. Il existe @@ -183,8 +211,8 @@ infructueuse) ; collectif qu'on doit s'assurer de la cohérence avec la version disponible en ligne (système *asynchrone*). -Le dépôt distant est généralement stocké sur une **forge -logicielle** (`Github` ou `Gitlab`) et sert à centraliser la version +Le dépôt distant est généralement stocké sur +une **forge logicielle** (`Github` ou `Gitlab`) et sert à centraliser la version collective d'un projet. Les copies locales sont des copies de travail qu'on utilise pour faire évoluer un projet: diff --git a/content/course/manipulation/03_geopandas_TP/index.qmd b/content/course/manipulation/03_geopandas_TP/index.qmd index 8857bc682..01ded4685 100644 --- a/content/course/manipulation/03_geopandas_TP/index.qmd +++ b/content/course/manipulation/03_geopandas_TP/index.qmd @@ -87,19 +87,20 @@ import cartiflette.s3 {{% box status="exercise" title="Exercice 1: lire et explorer la structure de fichiers géographiques" icon="fas fa-pencil-alt" %}} 1. S'inspirer des exemples de code présents dans le chapitre précédent, mobilisant le package `cartiflette` -pour télécharger les données communales. +pour télécharger les données communales des départements 75, 92, 93 et 94. Vous pouvez nommer l'objet `communes_borders` -3. Regarder les premières lignes des données. Identifier la différence avec +2. Regarder les premières lignes des données. Identifier la différence avec un DataFrame standard. -4. Afficher l'attribut `crs` de `communes_borders`. Ce dernier contrôle la +3. Afficher l'attribut `crs` de `communes_borders`. Ce dernier contrôle la transformation de l'espace tridimensionnel terrestre en une surface plane. -5. Afficher les communes des Hauts de Seine (département 92) et utiliser la méthode +4. Afficher les communes des Hauts de Seine (département 92) et utiliser la méthode `plot` -6. Réprésenter la carte de Paris : quel est le problème ? +5. Réprésenter la carte de Paris : quel est le problème ? {{% /box %}} ```{python} +#1) Chargement des données de Cartiflette communes_borders = cartiflette.s3.download_vectorfile_url_all( values = ["75", "92", "93", "94"], level="COMMUNE", @@ -118,13 +119,13 @@ communes_borders.head() ```{python} # 3) Afficher le crs communes_borders.crs -# Les données ne sont pas projetées, elles sont en "longitude - latitude" (WGS 84) +# Les données sont projetées en lambert 93 ``` La carte du 92 est la suivante: ```{python} -# 4) afficher les communes du département 12 +# 4) afficher les communes du département 92 ax = communes_borders[communes_borders['INSEE_DEP'] == "92"].plot() ax.set_axis_off() ``` @@ -151,13 +152,12 @@ On propose ici d'utiliser à nouveau {{% box status="exercise" title="Exercice 2: compléter des données spatiales issues de sources différentes" icon="fas fa-pencil-alt" %}} -1. Importer les données de découpage des arrondissements parisiens à l'adresse - +1. Importer les données de découpage des arrondissements parisiens à l'adresse à l'aide de `cartiflette`. 2. Vérifier sur une carte que les découpages des arrondissements sont bien présents. 3. Vérifier l'attribut `crs`. Est-il cohérent avec celui des données communales ? 4. Retirer Paris du jeu de données communales et utiliser les arrondissements pour enrichir (nommer l'objet obtenu `data_borders`). -6. Représenter à nouveau les communes de la petite couronne parisienne (75, 92, 93, 94) +5. Représenter à nouveau les communes de la petite couronne parisienne (75, 92, 93, 94) {{% /box %}} ```{python} @@ -183,8 +183,9 @@ ax.set_axis_off() ```{python} #3) Vérifier l'attribut `crs`. Est-il cohérent ? print(communes_borders.crs) +print(arrondissements.crs) print(communes_borders.crs == arrondissements.crs) -# Oui, les deux fonds de carte ont le même attribut CRS, pas besoin de convertir les projections de l'une d'entre elles +# Non, les deux fonds de carte n'ont pas le même attribut CRS, il faudrait convertir l'une d'elle pour les manipuler ensemble ``` ```{python} @@ -202,7 +203,7 @@ La carte obtenue à l'issue de la question 6, c'est-à-dire après avoir consolidé les données, devrait avoir l'aspect suivant: ```{python} -#6) Représenter les communes du 75, 92, 93, 94 +#5) Représenter les communes du 75, 92, 93, 94 ax = data_paris.plot(alpha = 0.3, edgecolor = "k") ax.set_axis_off() ``` @@ -223,9 +224,9 @@ requêtables directement par l'url 1. Importer les données velib sous le nom `station` 2. Vérifier la projection géographique de `station` (attribut `crs`). Si celle-ci est différente des données communales, reprojeter ces dernières dans le même système de projection que les stations de vélib -2. Représenter sur une carte les 50 stations les plus importantes (variable `capacity`). Vous pouvez également afficher le fonds de carte des arrondissements de Paris. +3. Représenter sur une carte les 50 stations les plus importantes (variable `capacity`). Vous pouvez également afficher le fonds de carte des arrondissements de Paris. Cette [page](https://geopandas.org/mapping.html#maps-with-layers) peut vous aider pour comprendre comment afficher plusieurs couches à la fois. Vous pouvez customiser la carte en retirant les axes grâce à la méthode `set_axis_off` et mettre un titre tel que _"Les 50 principales stations de Vélib"_ avec la méthode `set_title`. -3. Afficher également (trait bleu et épais) les réseaux de transport en communs, disponibles [ici](https://data.iledefrance-mobilites.fr/explore/dataset/traces-du-reseau-ferre-idf/map/?location=7,48.69717,2.33167&basemap=jawg.streets). L'url à requêter est +4. Afficher également (trait bleu et épais) les réseaux de transport en communs, disponibles [ici](https://data.iledefrance-mobilites.fr/explore/dataset/traces-du-reseau-ferre-idf/map/?location=7,48.69717,2.33167&basemap=jawg.streets). L'url à requêter est {{% /box %}} @@ -266,6 +267,7 @@ print(transports['mode'].unique()) L'ajout du réseau de métro permet d'obtenir une carte ressemblant à celle-ci: ```{python} +# 4) Réseaux de transport en communs (suite) base = data_paris[data_paris['INSEE_DEP'] == '75'].plot(alpha = 0.2, edgecolor = 'black') stations.sort_values('capacity', ascending = False).head(50).plot(ax = base, color = 'red', alpha = 0.6) transports[transports['mode'] == "METRO"].plot(ax=base, color = 'blue', alpha = 0.3,linewidth=3) @@ -308,7 +310,7 @@ En revanche, l'un des intérêts des objets geopandas est qu'on peut également La documentation à laquelle se référer est [ici](https://geopandas.org/mergingdata.html#spatial-joins). -{{% box status="exercise" title="Exercice 4: Associer les stations aux communes et arrondissements auxquels elles appartiennent" icon="fas fa-pencil-alt" %}} +{{% box status="exercise" title="Exercice 5 : Associer les stations aux communes et arrondissements auxquels elles appartiennent" icon="fas fa-pencil-alt" %}} 1. Faire une jointure spatiale pour enrichir les données de stations en y ajoutant des informations de `data_paris`. Appeler cet objet `stations_info` 2. Représenter la carte des stations du 19e arrondissement (s'aider de la variable `c_ar`). Vous pouvez mettre en fond de carte les arrondissements parisiens. 3. Compter le nombre de stations velib et le nombre de places velib par arrondissement ou commune (pour vous aider, vous pouvez compléter vos connaissances avec [ce tutoriel](https://pandas.pydata.org/docs/getting_started/intro_tutorials/06_calculate_statistics.html)). Représenter sur une carte chacune des informations @@ -361,6 +363,7 @@ df.head() La carte des places disponibles est celle-ci: ```{python} +#3. Nombre de stations et de places vélib par arrondissement ax = df.plot(column = 'capacity', legend=True) ax.set_axis_off() ax.set_title("Nombre de places disponibles") @@ -370,6 +373,7 @@ Alors que la carte des capacités de stations est plutôt celle-là: ```{python} +#3. Nombre de stations et de places vélib par arrondissement ax = df.plot(column = 'stationcode', legend=True) ax.set_axis_off() ax.set_title("Nombre de stations") @@ -394,6 +398,7 @@ df.plot(column = 'capacity_density', cmap = 'RdYlBu_r', legend=True) Avec une palette `plasma_r`, cela donne plutôt cette carte: ```{python} +#4. En densité df.plot(column = 'capacity_density', cmap = 'plasma_r', legend=True) ``` @@ -403,6 +408,7 @@ ressemble à celle-ci: ```{python} #| output: false +# 5 Cartes nettoyées ax = df.plot(column = 'capacity_density', cmap = 'RdYlBu_r', legend=True, legend_kwds={"orientation": "horizontal", "pad": 0.01}) ax.set_axis_off() ax.set_title("Densité des stations vélib dans l'agglomération parisienne") @@ -471,13 +477,13 @@ cette recherche serait assez pénible. {{% box status="exercise" title="Exercice 5 (optionnel) : Trouver les toilettes publiques les plus proches d'une station de vélib" icon="fas fa-pencil-alt" %}} 1. Charger la localisation des toilettes publiques présente ici : https://data.ratp.fr/explore/dataset/sanitaires-reseau-ratp/download/?format=geojson&timezone=Europe/Berlin&lang=fr. Appelez-la `toilettes_publiques`. -2. Convertir les objets `toilettes_publiques` et `stations` au CRS 2154 (Lambert-93). Cette +2. Convertir les objets `toilettes_publiques` et `stations` en projection Lambert-93 (CRS 2154). Cette conversion permettra de mesurer en mètres les distances entre objets géographiques. Sans celle-ci, nous ferions des distances entre coordonnées GPS, ce qui n'aide pas l'analyse et l'interprétation. -2. Utiliser la jointure spatiale par plus proche distance `sjoin_nearest` pour associer à chaque station les toilettes publiques les plus proches -3. Trouver les toilettes publiques les plus proches des stations de vélib autour d'Edgard Quinet. -4. Représenter un histogramme des distances aux toilettes les plus proches +3. Utiliser la jointure spatiale par plus proche distance `sjoin_nearest` pour associer à chaque station les toilettes publiques les plus proches +4. Trouver les toilettes publiques les plus proches des stations de vélib autour d'Edgard Quinet. +5. Représenter un histogramme des distances aux toilettes les plus proches {{% /box %}} Le jeu de données _open-data_ des toilettes @@ -491,6 +497,7 @@ toilettes_publiques.head(2) ```{python} +#2. Conversion des CRS toilettes_publiques = toilettes_publiques.to_crs(2154) stations = stations.to_crs(2154) ``` @@ -505,7 +512,8 @@ stations_toilettes = stations.sjoin_nearest( how='inner', distance_col="distance") -# 4. Trouver la station de toilettes la plus proche de la station de vélib "Edgard Quinet - Gaité" + +# 4. Trouver les toilettes les plus proches d'Edgard Quinet stations_toilettes.loc[ stations_toilettes['name'].str.contains("Edgar Quinet"), ["localisation", "station","name","distance"]] @@ -519,10 +527,11 @@ Enfin, de manière plus globale, voici la distribution des distances aux toilettes les plus proches: ```{python} +#5. Histogramme stations_toilettes['distance'].plot(kind = "hist") ``` -Le mode de la distribution est entre 1 et 2km, ce +Le mode de la distribution est entre 1 et 2 km, ce qui est une petite distance tout de même ! C'est normal, il ne s'agit pas de l'ensemble des toilettes publiques de la ville de Paris mais diff --git a/content/course/manipulation/03_geopandas_tutorial/index.qmd b/content/course/manipulation/03_geopandas_tutorial/index.qmd index f200f60b9..5c99a30c4 100644 --- a/content/course/manipulation/03_geopandas_tutorial/index.qmd +++ b/content/course/manipulation/03_geopandas_tutorial/index.qmd @@ -193,6 +193,10 @@ vous pouvez retirer les `!` et `%` en début de ligne): ```{python} #| eval: false +!pip install --upgrade botocore==1.23.26 #Sur colab, sinon bug +!pip install --upgrade urllib3==1.22.0 #Sur colab, sinon bug +!pip install py7zr #Sur colab, sinon bug +!pip install s3fs #Sur colab, sinon bug !git clone https://github.com/InseeFrLab/cartogether.git %cd ./cartogether !pip install -r requirements.txt @@ -347,6 +351,8 @@ ax.set_axis_off() ``` ```{python} +#| echo: false + fig = ax.get_figure() fig.savefig("featured.png") ``` @@ -412,7 +418,6 @@ esthétique. #| output: false #| echo: true -fig,ax = plt.subplots(figsize=(10, 10)) fig,ax = plt.subplots(figsize=(10, 10)) stations.sample(200).to_crs(3857).plot(ax = ax, color = 'red', alpha = 0.4, zorder=2) shp_communes.to_crs(3857).plot(ax = ax, zorder=1, edgecolor = "black", facecolor="none", @@ -558,7 +563,7 @@ communes_31 = cartiflette.s3.download_vectorfile_url_all( # on reprojete en 3857 pour le fond de carte communes_31 = communes_31.to_crs(3857) -# on calcule le centroid +# on calcule le centroide dep_31 = communes_31.copy() communes_31['geometry'] = communes_31['geometry'].centroid