Skip to content

Commit

Permalink
TP geopandas (#333)
Browse files Browse the repository at this point in the history
* lambert

* corrections ML

* corrections ML

* crs

* Automated changes

* Automated changes

* box

* box

* Automated changes

* Automated changes

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
linogaliana and github-actions[bot] committed Dec 11, 2022
1 parent 0312041 commit 3b8715e
Show file tree
Hide file tree
Showing 2 changed files with 208 additions and 24 deletions.
100 changes: 100 additions & 0 deletions content/course/annexes/corrections/index.qmd
Expand Up @@ -140,7 +140,107 @@ print_badges("content/course/modelisation/1_modelevaluation.qmd", correction=Tru
```
:::

::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/modelisation/2_SVM.qmd", correction=True)
```
:::

::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/modelisation/3_regression.qmd", correction=True)
```
:::

::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/modelisation/4_featureselection.qmd", correction=True)
```
:::

::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/modelisation/5_clustering.qmd", correction=True)
```
:::

::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/modelisation/6_pipeline.qmd", correction=True)
```
:::

## Partie 4: Natural Language Processing (NLP)

::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/NLP/01_intro.qmd", correction=True)
```
:::

::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/NLP/02_exoclean.qmd", correction=True)
```
:::

::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/NLP/03_lda.qmd", correction=True)
```
:::

::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/NLP/04_word2vec.qmd", correction=True)
```
:::


::: {.cell .markdown}
```{python}
#| echo: false
#| output: 'asis'
#| include: true
#| eval: true
print_badges("content/course/NLP/05_exo_supp.qmd", correction=True)
```
:::

## Partie 5: Introduction aux outils et méthodes à l'état de l'art
132 changes: 108 additions & 24 deletions content/course/manipulation/03_geopandas_TP/index.qmd
Expand Up @@ -84,19 +84,28 @@ import matplotlib.pyplot as plt
import cartiflette.s3
```

{{% box status="exercise" title="Exercice 1: lire et explorer la structure de fichiers géographiques" icon="fas fa-pencil-alt" %}}
```{=html}
<div class="alert alert-success" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice 1: lire et explorer la structure de fichiers géographiques</h3>
```

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 des départements 75, 92, 93 et 94.
Vous pouvez nommer l'objet `communes_borders`
2. Regarder les premières lignes des données. Identifier la différence avec
un DataFrame standard.
3. Afficher l'attribut `crs` de `communes_borders`. Ce dernier contrôle la
transformation de l'espace tridimensionnel terrestre en une surface plane.
transformation de l'espace tridimensionnel terrestre en une surface plane.
Utiliser `to_crs` pour transformer les données en Lambert 93 (code EPSG 2154).
4. Afficher les communes des Hauts de Seine (département 92) et utiliser la méthode
`plot`
5. Réprésenter la carte de Paris : quel est le problème ?
{{% /box %}}

```{=html}
</div>
```
:::


```{python}
Expand All @@ -119,7 +128,7 @@ communes_borders.head()
```{python}
# 3) Afficher le crs
communes_borders.crs
# Les données sont projetées en lambert 93
# Les données sont en WGS84, on les reprojette en lambert 93
```

La carte du 92 est la suivante:
Expand Down Expand Up @@ -149,16 +158,27 @@ On propose ici d'utiliser à nouveau
`cartiflette` pour cela afin de disposer du fonds de carte officiel.


{{% box status="exercise" title="Exercice 2: compléter des données spatiales issues de sources différentes" icon="fas fa-pencil-alt" %}}
::: {.cell .markdown}
```{=html}
<div class="alert alert-success" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice 2: compléter des données spatiales issues de sources différentes</h3>
```



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 ?
Si non, transformer en Lambert 93 (code EPSG 2154).
4. Retirer Paris du jeu de données communales et utiliser les arrondissements
pour enrichir (nommer l'objet obtenu `data_borders`).
5. Représenter à nouveau les communes de la petite couronne parisienne (75, 92, 93, 94)
{{% /box %}}

```{=html}
</div>
```
:::


```{python}
#1) Importer arrondissements
Expand All @@ -184,8 +204,8 @@ ax.set_axis_off()
#3) Vérifier l'attribut `crs`. Est-il cohérent ?
print(communes_borders.crs)
print(arrondissements.crs)
arrondissements = arrondissements.to_crs(2154)
print(communes_borders.crs == arrondissements.crs)
# 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}
Expand All @@ -194,8 +214,8 @@ import pandas as pd
data_paris = pd.concat(
[
communes_borders[communes_borders['INSEE_DEP'] != "75"],
arrondissements
communes_borders[communes_borders['INSEE_DEP'] != "75"].to_crs(2154),
arrondissements.to_crs(2154)
])
```

Expand All @@ -220,15 +240,24 @@ disponibles [sur le site d'open data de la ville de Paris](https://opendata.pari
requêtables directement par l'url
<https://opendata.paris.fr/explore/dataset/velib-emplacement-des-stations/download/?format=geojson&timezone=Europe/Berlin&lang=fr>

{{% box status="exercise" title="Exercice 3: importer et explorer les données velib" icon="fas fa-pencil-alt" %}}
::: {.cell .markdown}
```{=html}
<div class="alert alert-success" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice 3: importer et explorer les données velib</h3>
```

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
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`.
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
<https://data.iledefrance-mobilites.fr/explore/dataset/traces-du-reseau-ferre-idf/download/?format=geojson&timezone=Europe/Berlin&lang=fr>
{{% /box %}}

```{=html}
</div>
```
:::



Expand Down Expand Up @@ -281,13 +310,21 @@ L'exercice suivant propose de mettre en oeuvre la deuxième méthode. La premiè
est proposée en [exercice supplémentaire 👇️](#exo-supp).


{{% box status="exercise" title="Exercice 4: ajouter un fond de carte" icon="fas fa-pencil-alt" %}}
::: {.cell .markdown}
```{=html}
<div class="alert alert-success" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice 4: ajouter un fond de carte</h3>
```

1. Recréer par couche successive la carte précédente, que vous pouvez nommer `base`
2. Utiliser `add_basemap` du package [`contextily`](https://contextily.readthedocs.io/en/latest/)
pour ajouter, en arrière plan, un fonds de carte
3. Jouer avec les fonds disponibles en utilisant l'argument `source`
{{% /box %}}

```{=html}
</div>
```
:::

Par exemple, en utilisant le fond `Stamen.Watercolor`, on obtient la carte
suivante. Celle-ci permet déjà de mieux localiser les stations.
Expand All @@ -310,13 +347,23 @@ 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 5 : Associer les stations aux communes et arrondissements auxquels elles appartiennent" icon="fas fa-pencil-alt" %}}

::: {.cell .markdown}
```{=html}
<div class="alert alert-success" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice 5 : Associer les stations aux communes et arrondissements auxquels elles appartiennent</h3>
```

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
4. Représenter les mêmes informations mais en densité (diviser par la surface de l'arrondissement ou commune en km2)
5. (optionnel) Choisir une des cartes de densité et la nettoyer (retirer les axes, mettre les titres...)
{{% /box %}}

```{=html}
</div>
```
:::


```{python}
Expand Down Expand Up @@ -475,7 +522,13 @@ plus proches de chaque station.
Sans les fonctionalités de `GeoPandas`,
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" %}}
::: {.cell .markdown}
```{=html}
<div class="alert alert-success" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice 5 (optionnel) : Trouver les toilettes publiques les plus proches d'une station de vélib</h3>
```


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` en projection Lambert-93 (CRS 2154). Cette
conversion permettra de mesurer en mètres les distances entre objets géographiques. Sans
Expand All @@ -484,7 +537,11 @@ et l'interprétation.
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 %}}

```{=html}
</div>
```
:::

Le jeu de données _open-data_ des toilettes
publiques présente l'aspect suivant:
Expand Down Expand Up @@ -562,14 +619,23 @@ def download_unzip(url, dirname = tempfile.gettempdir(), destname = "borders"):
zip_ref.extractall(dirname + '/' + destname)
```

{{% box status="exercise" title="Exercice optionnel 1: télécharger et dézipper vous-même le fonds de carte" icon="fas fa-pencil-alt" %}}
::: {.cell .markdown}
```{=html}
<div class="alert alert-success" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice optionnel 1: télécharger et dézipper vous-même le fonds de carte</h3>
```


Importer le fichier avec le package `GeoPandas`
(si vous avez laissé les paramètres par défaut,
le fichier devrait
être à l'emplacement `temporary_location + "/borders/communes-20210101.shp"`).

{{% /box %}}

```{=html}
</div>
```
:::


```{python}
Expand All @@ -587,7 +653,12 @@ download_unzip(url)
#communes_borders = gpd.read_file(temporary_location + "/borders/communes-20220101.shp")
```

{{% box status="exercise" title="Exercice optionnel 2 : Utiliser les arrondissements fournis par l'open data parisien" icon="fas fa-pencil-alt" %}}
::: {.cell .markdown}
```{=html}
<div class="alert alert-success" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice optionnel 2 : Utiliser les arrondissements fournis par l'open data parisien</h3>
```


1. Importer les données de découpage des arrondissements parisiens à l'adresse
<https://opendata.paris.fr/explore/dataset/arrondissements/download/?format=geojson&timezone=Europe/Berlin&lang=fr>
Expand All @@ -599,7 +670,11 @@ soucier de la variable commune de superficie aux niveaux différents car on
va la recréer. En revanche, renommer la variable `c_arinsee` en `insee` avec
la méthode `rename` et faire attention aux types des variables

{{% /box %}}
```{=html}
</div>
```
:::



```{python}
Expand Down Expand Up @@ -629,7 +704,8 @@ print(communes_borders.crs == arrondissements.crs)
arrondissements = arrondissements.rename(columns = {"c_arinsee": "INSEE_DEP"})
arrondissements['INSEE_DEP'] = "75"
# On sélectionne enlève la ligne du contour de Paris initiale, et on ajoute à la place les lignes d'arrondissements
data_paris = communes_borders[communes_borders["INSEE_DEP"] != "75"].append(arrondissements)
data_paris = communes_borders[
communes_borders["INSEE_DEP"] != "75"].to_crs(2154).append(arrondissements.to_crs(2154))
data_paris.tail(2)
```

Expand All @@ -642,14 +718,22 @@ lignes de transports à l'intérieur de Paris intra-muros.
Il s'agit d'appliquer les jointures spatiales de manière
un petit peu différente à précédemment.

{{% box status="exercise" title="Exercice optionnel 3 : Les lignes de transport dans Paris" icon="fas fa-pencil-alt" %}}
```{=html}
<div class="alert alert-success" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice optionnel 3 : Les lignes de transport dans Paris</h3>
```


1. Utiliser l'URL <https://data.iledefrance-mobilites.fr/explore/dataset/traces-du-reseau-ferre-idf/download/?format=geojson&timezone=Europe/Berlin&lang=fr> pour récupérer les lignes de transport
de la RATP. L'appeler `transports`.
2. A partir des arrondissements parisiens, utiliser `unary_union` pour créer un unique polygone parisien. Utiliser `within` pour ne conserver que les points de `transports` qui se trouvent
dans Paris intra-muros
3. Représenter graphiquement
{{% /box %}}

```{=html}
</div>
```
:::


```{python}
Expand Down

0 comments on commit 3b8715e

Please sign in to comment.