Skip to content

Commit 2c9cfab

Browse files
committed
Initial commit
0 parents  commit 2c9cfab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+47912
-0
lines changed

.gitignore

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
build
2+
.vscode
3+
dev.txt
4+
environment.yml
5+
*\.ipynb_checkpoints
6+
__pycache__/
7+
TODOs.txt

Makefile

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Minimal makefile for Sphinx documentation
2+
#
3+
4+
# You can set these variables from the command line, and also
5+
# from the environment for the first two.
6+
SPHINXOPTS ?=
7+
SPHINXBUILD ?= sphinx-build
8+
SOURCEDIR = source
9+
BUILDDIR = build
10+
11+
# Put it first so that "make" without argument is like "make help".
12+
help:
13+
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14+
15+
.PHONY: help Makefile
16+
17+
# Catch-all target: route all unknown targets to Sphinx using the new
18+
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19+
%: Makefile
20+
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

exercices/culvert_dataanalysis.py

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# -*- coding: utf-8 -*-
2+
"""Script pour analyser des données de culverts enregistrées dans un
3+
fichier csv.
4+
5+
Description détaillée:
6+
Le script ouvre le fichier csv, supprime les données "manning", convertit
7+
les diamètres de m en mm, affiche le diamètre moyen, affiche le diamètre
8+
moyen des culverts en béton, enregistre un camember de la répartition
9+
des culverts par type, calcule le PK de l'aval de chaque culvert, puis
10+
enregistre le tableau des données transformées dans un fichier csv.
11+
12+
Utilisation:
13+
1. Modifier la variable CULVERT_DATAFILE_PATH pour qu'elle indique le
14+
chemin vers le fichier data culvert. (r"path\to\file" si le chemin
15+
contient des backslashs)
16+
2. Exécuter le script avec `python culvert_dataanalysis.py`
17+
18+
Historique:
19+
- ML (10/09/2019): Création du script
20+
"""
21+
import pandas as pd
22+
23+
24+
###############################################################################
25+
############################ Données d'entrée #################################
26+
###############################################################################
27+
CULVERT_DATAFILE_PATH ="culvert_data.csv"
28+
###############################################################################
29+
30+
# On crée un DataFrame en lisant le fichier d'entrée.
31+
df = pd.read_csv(CULVERT_DATAFILE_PATH)
32+
# On retire la colonne "manning"
33+
df = df.drop(columns=["manning"])
34+
# On multiplie par 1000 chaque valeur de la colonne "diamètre" pour
35+
# les convertir de m en mm.
36+
df["diameter"] = df["diameter"] * 1000
37+
# On calcule le diamètre moyen des culverts
38+
diameter_mean = df["diameter"].mean()
39+
# Et on affiche le résultat, arrondi à deux décimales après la virgule
40+
print(f"Diamètre moyen: {round(diameter_mean, 2)} mm")
41+
# On calcule le diamètre moyen des culverts de type concrete
42+
diameter_conc_mean = df[df["type"] == "concrete"]["diameter"].mean()
43+
# Et on affiche le résultat, arrondi à deux décimales après la virgule
44+
print(f"Diamètre moyen béton: {round(diameter_conc_mean, 2)} mm.")
45+
46+
# On calcule le nombre de culverts par type
47+
count_per_type = df["type"].value_counts()
48+
# On crée un camembert pour montrer la répartition des culverts par type
49+
ax = count_per_type.plot.pie()
50+
fig = ax.get_figure()
51+
# Et on l'enregistre
52+
fig.savefig("culvert_per_type.png")
53+
54+
# On ajoute une colonne downstream_chainage
55+
df["downstream_chainage"] = df["upstream_chainage"] + df["length"]
56+
57+
# On enregistre les données dans un fichier csv
58+
df.to_csv("culvert_analysis.csv")
59+

exercices/culvert_logfile.txt

+16,485
Large diffs are not rendered by default.

exercices/culvert_logparser.py

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
# -*- coding: utf-8 -*-
2+
"""Script pour récupérer les données d'un fichier log culvert
3+
4+
Description détaillée:
5+
Le script analyse chaque ligne du fichier à la recherche des données sur
6+
les culverts décrits pas le fichier. Le script affiche le nombre de culverts
7+
trouvés dans le fichier, puis exporte les données au format csv.
8+
9+
Utilisation:
10+
1. Modifier la variable CULVERT_FILE_PATH pour qu'elle indique le chemin vers
11+
le fichier log culvert. (r"path\to\file" si le chemin contient des
12+
backslashs)
13+
2. Exécuter le script avec `python culvert_logparser.py`
14+
15+
Historique:
16+
- ML (10/09/2019): Création du script
17+
"""
18+
# Les imports se placent par convention tout au début du fichier.
19+
# On importe pandas de la manière conventionnelle
20+
import pandas as pd
21+
22+
###############################################################################
23+
############################ Données d'entrée #################################
24+
###############################################################################
25+
CULVERT_FILE_PATH ="culvert_logfile.txt"
26+
###############################################################################
27+
28+
# On déclare un dictionnaire des paramètres qu'on
29+
# va stocker. Chaque "key" du dictionnaire contient
30+
# une liste vide. On a pour objectif d'ajouter les
31+
# informations qu'on trouve dans le fichier à
32+
# chacune de ces listes.
33+
culvert_data = {
34+
"branch": [],
35+
"name": [],
36+
"type": [],
37+
"diameter": [],
38+
"length": [],
39+
"manning": [],
40+
"upstream_chainage": [],
41+
"upstream_invert": []
42+
}
43+
44+
# On ouvre le fichier en utilisant le keyword 'with'
45+
# et la fonction 'open' à laquelle on passe le chemin
46+
# du fichier et l'argument "r" (read) pour signifier qu'on
47+
# souhaite uniquement lire le fichier.
48+
# Utiliser 'with' et 'open' garantie que le fichier ouvert
49+
# sera correctement fermé même si une erreur survient
50+
# lorsqu'on travaille avec le fichier ouvert.
51+
with open(CULVERT_FILE_PATH, "r") as f:
52+
# On crée un compteur qu'on va incrémenter
53+
# à chaque fois qu'on va trouver un *culvert*
54+
# dans le fichier texte.
55+
culvert_count = 0
56+
# On itère au travers de toutes les lignes du fichier.
57+
for line in f:
58+
# line réfère maintenant à la ligne en cours de lecture.
59+
# Il s'agit d'un objet `string`. Attention, il se
60+
# termine à chaque fois par "\n" qui est un caractère
61+
# spécial représentant un saut de ligne.
62+
63+
# On incrémente le compteur si le texte "START CULVERT"
64+
# se trouve dans la ligne en cours de lecture
65+
if "START CULVERT" in line:
66+
culvert_count += 1
67+
68+
# On vérifie si la ligne en cours de lecture démarre
69+
# part le texte "Culvert_branch".
70+
if line.startswith("Culvert_branch"):
71+
# Si oui, on enlève les éventuels espaces blancs
72+
# et caractères spéciaux ("\n", "\t") qui pourrait
73+
# se trouver au début et/ou à la fin --> strip()
74+
# Cette méthode retourne un nouvel objet *string*
75+
# On sépare ensuite la ligne suivant le délimiteur
76+
# " = ". --> split(" = "). Cette méthode retourne
77+
# une *list* de *strings*. Le deuxième et dernier
78+
# élément de cette *list* correspond au nom de
79+
# la branche. On y accède avec [1].
80+
# Finalement, on enlève les apostrophes à la fin
81+
# et au début du nom de la branche --> strip("'")
82+
# Cette méthode retourne un nouvel objet *string*
83+
# auquel est associé le nom branch.
84+
branch = line.strip().split(" = ")[1].strip("'")
85+
# On ajoute le nom de la branche à la liste de la
86+
# key "branch" du dictionnaire des sorties.
87+
culvert_data["branch"].append(branch)
88+
89+
# On vérifie si la ligne en cours de lecture démarre
90+
# part le texte "Culvert_name".
91+
if line.startswith("Culvert_name"):
92+
# On stocke dans le dictionnaire le nom du culvert
93+
# en cours de lecture.
94+
name = line.strip().split(" = ")[1].strip("'")
95+
culvert_data["name"].append(name)
96+
# On vérifie si la ligne en cours de lecture démarre
97+
# part le texte "Culvert_params".
98+
if line.startswith("Culvert_params"):
99+
# On récupère l'ensemble des paramètres dans un objet
100+
# *list* nommé params
101+
params = line.strip().split(" = ")[1].split(",")
102+
# On unpack chacun des éléments de la liste (6)
103+
# On a maintenant 6 nouveaux noms à disposition
104+
# pour référencer les paramètres du culvert
105+
t, d, l, m, uc, ui = params
106+
# On ajoute les paramètres à leur liste dans le
107+
# dictionnaire.
108+
culvert_data["type"].append(t)
109+
culvert_data["diameter"].append(d)
110+
culvert_data["length"].append(l)
111+
culvert_data["manning"].append(m)
112+
culvert_data["upstream_chainage"].append(uc)
113+
culvert_data["upstream_invert"].append(ui)
114+
115+
# On affiche le nombre de culverts trouvés dans le fichier.
116+
print(f"{culvert_count} culverts ont été trouvés!")
117+
118+
# Un DataFrame est créé à partir de toutes les données du dictionnaires.
119+
df = pd.DataFrame(culvert_data)
120+
# Les données extraites sont enregistrées dans un fichier csv.
121+
# index=False évite d'écrire l'index du DataFrame dans le fichier,
122+
# celui-ci n'étant pas utile ici.
123+
df.to_csv("culvert_data.csv", index=False)

exercices/generate_dummy_file.py

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# -*- coding: utf-8 -*-
2+
"""Script pour créer les données sources des exercices.
3+
4+
Les données que le script crée contiennent les caractéristiques de culverts.
5+
6+
Comme des données aléatoires sont créés, on utilise
7+
random.seed() pour s'assurer qu'on obtient toujours
8+
les mêmes sorties.
9+
10+
Historique:
11+
- ML (10/09/2019): Création du script
12+
"""
13+
import random
14+
15+
# Nombre de branches créés dans le fichier de sortie
16+
BR_COUNT = 50
17+
# Nombre minimum de culverts par branche
18+
NMIN_CULV_PER_BRANCH = 30
19+
# Nombre maximum de culverts par branche
20+
NMAX_CULV_PER_BRANCH = 100
21+
22+
random.seed(1)
23+
24+
nculv_per_branch = []
25+
with open("culvert_logfile.txt", "w") as f:
26+
for br_idx in range(BR_COUNT):
27+
upstream_chainage = random.randint(5, 15)
28+
slope = random.random()
29+
upstream_invert = random.choice([200, 300, 400, 500])
30+
nculv_per_branch = random.randint(
31+
NMIN_CULV_PER_BRANCH,
32+
NMAX_CULV_PER_BRANCH
33+
)
34+
for culv_idx in range(nculv_per_branch):
35+
f.write(30 * "*" + "START CULVERT" + 30 * "*" + "\n")
36+
f.write(f"Culvert_branch = 'Branch_{br_idx + 1}'\n")
37+
f.write(f"Culvert_name = 'OH_{culv_idx + 1}'\n")
38+
culv_type = random.choices(
39+
["concrete", "steel", "plastic"],
40+
weights=[10, 2, 5]
41+
)[0]
42+
diameter = random.choices(
43+
[0.3, 0.5, 0.8, 1, 1.5, 2],
44+
weights=[20, 15, 10, 5, 3, 1]
45+
)[0]
46+
length = random.triangular(2, 50, 10)
47+
manning = random.choice([0.033, 0.025, 0.02, 0.015])
48+
upstream_chainage += random.random() * 100
49+
upstream_invert -= random.random() * slope
50+
f.write(
51+
f"Culvert_params = {culv_type},{diameter},{length},{manning},{upstream_chainage},{upstream_invert}\n"
52+
)
53+
f.write(30 * "*" + "END CULVERT" + 30 * "*" + "\n")

make.bat

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
@ECHO OFF
2+
3+
pushd %~dp0
4+
5+
REM Command file for Sphinx documentation
6+
7+
if "%SPHINXBUILD%" == "" (
8+
set SPHINXBUILD=sphinx-build
9+
)
10+
set SOURCEDIR=source
11+
set BUILDDIR=build
12+
13+
if "%1" == "" goto help
14+
15+
%SPHINXBUILD% >NUL 2>NUL
16+
if errorlevel 9009 (
17+
echo.
18+
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
19+
echo.installed, then set the SPHINXBUILD environment variable to point
20+
echo.to the full path of the 'sphinx-build' executable. Alternatively you
21+
echo.may add the Sphinx directory to PATH.
22+
echo.
23+
echo.If you don't have Sphinx installed, grab it from
24+
echo.http://sphinx-doc.org/
25+
exit /b 1
26+
)
27+
28+
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
29+
goto end
30+
31+
:help
32+
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
33+
34+
:end
35+
popd

0 commit comments

Comments
 (0)