diff --git a/CHANGELOGS.rst b/CHANGELOGS.rst
index 14f78e86..d61f3f6e 100644
--- a/CHANGELOGS.rst
+++ b/CHANGELOGS.rst
@@ -1,9 +1,11 @@
Change Logs
===========
-0.3.0
+0.3.1
+++++
-* :pr:`24`: ajout d'exercices venant de sdpython/ensae_teaching_cs
+* :pr:`24`, :pr:`25`, :pr:`26`, :pr:`27`, :pr:`28`, :pr:`29`,
+ :pr:`30`, :pr:`31`, :pr:`32`, :pr:`33`, :pr:`34`, :pr:`35`,
+ :pr:`36`: ajout d'exercices venant de sdpython/ensae_teaching_cs
* :pr:`22`: ajout d'un exemple sur le Mathador
* :pr:`21`: refactoring
diff --git a/_doc/api/tools.rst b/_doc/api/tools.rst
index 47e3227e..8d813706 100644
--- a/_doc/api/tools.rst
+++ b/_doc/api/tools.rst
@@ -26,3 +26,9 @@ profiling
.. automodule:: teachpyx.tools.profiling
:members:
+
+RenderJsDot
++++++++++++
+
+.. autoclass:: teachpyx.tools.nb_helpers.RenderJsDot
+ :members:
diff --git a/_doc/articles/2023-09-06-ensae.rst b/_doc/articles/2023-09-06-ensae.rst
new file mode 100644
index 00000000..d2d3e699
--- /dev/null
+++ b/_doc/articles/2023-09-06-ensae.rst
@@ -0,0 +1,38 @@
+2023-09-06 : ENSAE
+==================
+
+**Notions à maîtriser**
+
+* éléments de bases du langages (boucles, listes, tests, fonctions)
+* classes (attributes, méthodes, opérateurs, héritages)
+* graphes, arbre
+* numpy (opérations standard, broadcasting)
+* format de données (JSON, XML, HTML, csv)
+* tests unitaires (package unittest, git, pull request)
+* algorithmes
+ * tri fusion
+ * recherche dichotomique
+ * graphes (composantes connexes, Kruskal)
+ * programmation dynamique (chemin plus court dans un graphe, distance d'édition)
+ * problème NP-complet tels que le voyageur de commerce
+
+**Notions non abordées**
+
+Elles le seront en seconde année et non en première année : manipulation de données, pandas, machine learning.
+
+**Evaluation**
+
+1 TD noté. Les classes seront abordées et un problème algorithmique.
+Voir aussi les précédents énoncés : :ref:`l-exams`.
+
+**Ressources**
+
+* Ce site : `sdpython.github.io/doc/teachpyx/dev/ `_
+* :ref:`l-book-python`
+* exercices sur le langage :ref:`l-python`
+* exercices sur des algortihmes :ref:`l-algo`
+* examens passés :ref:`l-exams`
+* Site plus tout-à-fait maintenu `www.xavierdupre.fr `_
+* `Plan suivi en 2022
+ `_
+* `Des aspects plus mathématiques d'algorithmes `_
diff --git a/_doc/articles/index.rst b/_doc/articles/index.rst
index 487e9fd8..d88570bf 100644
--- a/_doc/articles/index.rst
+++ b/_doc/articles/index.rst
@@ -5,6 +5,7 @@ Collections d'articles inclassables
.. toctree::
+ 2023-09-06-ensae
2023-08-09-hermionne
2023-08-03-code-jam
2022-12-07-cartopy
diff --git a/_doc/c_data/nb_array.ipynb b/_doc/c_data/nb_array.ipynb
index 889a26cc..073b9b15 100644
--- a/_doc/c_data/nb_array.ipynb
+++ b/_doc/c_data/nb_array.ipynb
@@ -846,14 +846,14 @@
{
"cell_type": "markdown",
"metadata": {},
- "source": [
- "## Exercice 1 : Echiquier et Crible d'Erathosthène"
- ]
+ "source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
+ "## Exercice 1 : Echiquier et Crible d'Erathosthène\n",
+ "\n",
"* Exercice 1-A Echiquier: Créer une matrice échiquier (des 1 et des 0 alternés) de taille 8x8, de deux façons différentes\n",
" * en vous servant de slices \n",
" * en vous servant de la fonction [tile](http://docs.scipy.org/doc/numpy/reference/generated/numpy.tile.html#numpy.tile)\n",
@@ -2298,29 +2298,17 @@
"* [Un tutoriel bien fait et très complet sur numpy](http://gael-varoquaux.info/scipy-lecture-notes/intro/numpy/index.html). L'un des auteurs n'est autre que Gaël Varoquaux qui sera présent pour la séance 3. Voir aussi la [partie optimisation](http://gael-varoquaux.info/scipy-lecture-notes/advanced/mathematical_optimization/index.html) "
]
},
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "## Eléments de réponses pour les exercices"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Exercice 1 (Echiquier et Crible d'Erathosthene)"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
"source": [
+ "## Eléments de réponses pour les exercices\n",
+ "\n",
+ "### Exercice 1 (Echiquier et Crible d'Erathosthene)\n",
+ "\n",
"* Exercice 1-A Echiquier: Créer une matrice échiquier (des 1 et des 0 alternés) de taille 8x8, de deux façons différentes\n",
" * en vous servant de slices \n",
- " * en vous servant de la fonction [tile](http://docs.scipy.org/doc/numpy/reference/generated/numpy.tile.html#numpy.tile)\n"
+ " * en vous servant de la fonction [tile](http://docs.scipy.org/doc/numpy/reference/generated/numpy.tile.html#numpy.tile)"
]
},
{
@@ -2509,13 +2497,8 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### Exercice 2 (marches aléatoires)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
+ "### Exercice 2 (marches aléatoires)\n",
+ "\n",
"Simulez (**en une seule fois!**) 10000 marches aléatoires de taille 1000, partant de 0 et de pas +1 ou -1 équiprobables \n",
"\n",
"* Faites un graphe représentant la racine de la moyenne des carrés des positions (=cumul des pas à un instant donné) en fonction du temps\n",
@@ -2621,7 +2604,7 @@
"# we use argmax on the boolean array to get the first True value\n",
"first_hits = (np.abs(walks[hits_the_bound, :]) > bound).argmax(axis=1)\n",
"titles.append(f\"Mean crossing time:{first_hits.mean():1.2f}\")\n",
- "ax[1].set_title(\"\\n\".join(titles))"
+ "ax[1].set_title(\"\\n\".join(titles));"
]
},
{
@@ -2667,13 +2650,8 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### Exercice 4 (simulation, régression, estimation par maximisation de la vraisemblance)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
+ "### Exercice 4 (simulation, régression, estimation par maximisation de la vraisemblance)\n",
+ "\n",
"* On commence par simuler la variable $Y = 3 X_1 -2 X_2 +2 + \\epsilon$ où $X_1,X_2,\\epsilon \\sim \\mathcal{N}(0,1)$ \n",
"* On souhaite ensuite retrouver les coefficients dans la [régression linéaire](http://fr.wikipedia.org/wiki/R%C3%A9gression_lin%C3%A9aire) de $Y$ sur $X_1$ et $X_2$ dans un modèle avec constante, par la méthode des Moindres Carrés Ordinaires. On rappelle que la forme matricielle de l'estimateur des MCO est $\\hat{\\beta} = (X'X)^{-1}X'Y$\n",
"* Enfin, $Y$ étant normale, on souhaite estimer ses paramètres par maximisation de vraisemblance:\n",
diff --git a/_doc/c_resume/conseil_programmes.rst b/_doc/c_resume/conseil_programmes.rst
index a2fb7447..949ac209 100644
--- a/_doc/c_resume/conseil_programmes.rst
+++ b/_doc/c_resume/conseil_programmes.rst
@@ -66,12 +66,13 @@ On écrit la fonction qui vérifie cela.
::
- def somme_double (liste) :
+ def somme_double(liste) :
return 1.0 * sum(liste)
- def test_somme_double () :
+ def test_somme_double() :
y = somme_double([ 1 ]) / 2
- if y == 0 : raise Exception ("valeur > 0 attendue")
+ if y == 0:
+ raise Exception("valeur > 0 attendue")
if __name__ == "__main__" :
test_somme_double()
@@ -89,7 +90,8 @@ s'attend à ce qu'elle retourne ce type de résultat.
File "conseil.py", line 10, in
test_somme_double()
File "conseil.py", line 7, in test_somme_double
- if y == 0 : raise Exception ("valeur > 0 attendue")
+ if y == 0:
+ raise Exception("valeur > 0 attendue")
Exception: valeur > 0 attendue
Trucs et astuces
diff --git a/_doc/c_resume/python_sheet.rst b/_doc/c_resume/python_sheet.rst
index 73804846..8b7e5996 100644
--- a/_doc/c_resume/python_sheet.rst
+++ b/_doc/c_resume/python_sheet.rst
@@ -12,7 +12,7 @@ Quelques lignes suffisent pour découvrir la version installée :
:showcode:
import sys
- print (sys.version)
+ print(sys.version)
Avec la version *3.x*, le langage a introduit quelques changements importants qui seront précisés.
Il est préférable de choisir la version 3 plutôt que 2.7. Outre le fait qu'elle
@@ -46,11 +46,11 @@ Quelques rappels sur le langage :
.. runpython::
:showcode:
- def fonction () :
+ def fonction() :
"""fonction de
démonstration"""
return 0
- help (fonction)
+ help(fonction)
**2 astuces en cas de problème**
@@ -101,8 +101,6 @@ Les variables de type immuable ne peuvent pas être modifiées.
* ``str`` : une chaîne de caractères ou string, elle apparaît entre guillemets,
entre apostrophes, entre trois guillements (``"""``) si elle s'étend sur
plusieurs lignes. ``s = "exemple"``.
- **Version 2.7 :** il existe un autre type ``unicode`` utilisé pour représenter des
- chaînes de caractères non latines (en chinois par exemple).
* ``tuple`` : un vecteur d'éléments de types identiques ou différents,
il apparaît entre parenthèses, on accède à un de ses éléments à l'aide de
crochets. Les éléments d'un t-uple ``t`` sont indicés de 0 à ``len(t)-1`` inclus.
@@ -134,9 +132,7 @@ les types numériques ainsi que sur les chaînes de caractères.
**Fréquente source de bug :**
-* **Version 2.7 :** une division entière a pour résultat le quotient
- et non un nombre décimal. Autrement dit : ``1/2 = 0`` et non ``0.5``.
-* **Version 3.x :** une division entière a pour résultat un réel.
+* une division entière a pour résultat un réel.
Autrement dit : ``1/2 = 0.5``. Pour une division entière, il faut utiliser
``//`` : ``1//2 = 0``.
@@ -162,8 +158,8 @@ ou d'une chaîne de caractères ``t`` sont indicés de 0 à ``len (t)-1`` inclus
::
t[i:j] # correspond à un sous-ensemble allant des indices i à j exclu
- t[:j] # = t[0:j]
- t[i:] # = t [i: len (t)]
+ t[:j] # = t[0: j]
+ t[i:] # = t[i: len(t)]
Pour les chaînes de caractères, on utilise fréquemment les
méthodes suivantes :
@@ -171,16 +167,15 @@ méthodes suivantes :
::
st = "langage python"
- st = 'langage python' # idem
- st = 'un guillement "' # chaîne contenant un guillement
- st = "un guillement \"" # chaîne contenant un guillement, il faut ajouter \
- # pour ne pas confondre avec l'autre guillement
- st = st.upper () # mise en lettres majuscules
- i = st.find ("PYTHON") # on cherche "PYTHON" dans st
- print (i) # affiche 8 Version 3.x, écrire print (i),
- # pour la version 2.x, écrire print i
- print (st.count ("PYTHON")) # affiche 1 Version 3.x : idem print (...)
- print (st.count ("PYTHON", 9)) # affiche 0 Version 3.x : idem print (...)
+ st = 'langage python' # idem
+ st = 'un guillement "' # chaîne contenant un guillement
+ st = "un guillement \"" # chaîne contenant un guillement, il faut ajouter \
+ # pour ne pas confondre avec l'autre guillement
+ st = st.upper() # mise en lettres majuscules
+ i = st.find("PYTHON") # on cherche "PYTHON" dans st
+ print(i) # affiche 8
+ print(st.count("PYTHON")) # affiche 1
+ print(st.count("PYTHON", 9)) # affiche 0
.. list-table::
:widths: 10 20
@@ -213,10 +208,10 @@ méthodes suivantes :
- Remplace les minuscules par des majuscules.
* - ``lower()``
- Remplace les majuscules par des minuscules.
- * - ``join ( li )``
+ * - ``join( li )``
- ``li`` est une liste,
cette fonction agglutine tous les éléments d'une liste séparés par ``sep``
- dans l'expression ``sep.join ( ["un", "deux"])``.
+ dans l'expression ``sep.join(["un", "deux"])``.
Quelques fonctions s'appliquant aux chaînes de caractères, l'aide associée au langage python
fournira la liste complète. Certains des paramètres sont encadrés par des crochets,
@@ -228,9 +223,9 @@ décimale ce qui est fait grâce à la syntaxe suivante :
:showcode:
x = 0.123456789
- print ("%1.2f" % x) # donne 0.12
+ print("%1.2f" % x) # donne 0.12
s = "%2.2e %s" % (3.14159, "est une approximation de pi")
- print (s) # Version 2.x : print s
+ print(s)
Les types modifiables
=====================
@@ -251,7 +246,7 @@ Pour copier une liste ou un dictionnaire, il faut utiliser :
a = [1,2]
import copy
- b = copy.copy (a)
+ b = copy.copy(a)
ou, si la liste inclut également d'autres listes ou dictionnaires :
@@ -259,7 +254,7 @@ ou, si la liste inclut également d'autres listes ou dictionnaires :
a = [1,2]
import copy
- b = copy.deepcopy (a)
+ b = copy.deepcopy(a)
Cette remarque s'applique à tout type modifiable, liste, dictionnaire ou
tout autre classe. La suppression d'une variable n'implique pas la
@@ -280,7 +275,7 @@ un ensemble d'éléments de types variés. C'est une sorte de t-uple modifiable.
x = [3,] # création d'une liste d'un élément, sans la virgule,
# le résultat reste une liste
x = [ ] # crée une liste vide
- x = list () # crée une liste vide
+ x = list() # crée une liste vide
Opérations qu'une liste supporte.
@@ -336,32 +331,32 @@ on suppose que ``l`` et ``t`` sont des listes, ``i`` et ``j`` sont des entiers.
:widths: 10 20
:header-rows: 0
- * - ``l.count (x)``
+ * - ``l.count(x)``
- Retourne le nombre d'occurrences de l'élément ``x``.
``count`` est une méthode de la classe ``list``.
- * - ``l.index (x)``
+ * - ``l.index(x)``
- Retourne l'indice de la première occurrence de l'élément ``x``
dans la liste ``l``. Si celle-ci n'existe, une exception est
déclenchée.
- * - ``l.append (x)``
+ * - ``l.append(x)``
- Ajoute l'élément ``x`` à la fin de la liste ``l``. Si ``x``
est une liste, cette fonction ajoute la liste ``x`` en tant qu'élément,
au final, la liste ``l`` ne contiendra qu'un élément de plus.
- * - ``l.extend (k)``
+ * - ``l.extend(k)``
- Ajoute tous les éléments de la liste ``k`` à la liste ``l``.
La liste ``l`` aura autant d'éléments supplémentaires qu'il y en a
dans la liste ``k``.
* - ``l.insert(i,x)``
- Insère l'élément ``x`` à la position ``i`` dans la liste ``l``.
- * - ``l.remove (x)``
+ * - ``l.remove(x)``
- Supprime la première occurence de l'élément ``x`` dans la liste ``l``.
S'il n'y a aucune occurrence de ``x``, cette méthode déclenche
une exception.
- * - ``l.pop ([i])``
+ * - ``l.pop([i])``
- Retourne l'élément ``l[i]`` et le supprime de la liste. Le
paramètre ``i`` est facultatif, s'il n'est pas précisé, c'est le dernier
élément dont la valeur est d'abord retournée puis il est supprimé de la liste.
- * - ``l.reverse (x)``
+ * - ``l.reverse(x)``
- Retourne la liste, le premier et dernier élément échangent leurs places,
le second et l'avant dernier, et ainsi de suite.
* - ``l.sort([key=None, reverse=False])``
@@ -395,11 +390,11 @@ ne sont pas uniquement des entiers mais tout type non modifiable
x = { "cle1": "valeur1", "cle2": "valeur2" }
print(x ["cle1"])
- x [(0,1)] = "clé tuple" # ajoute une nouvelle valeur dont la clé est (0,1)
+ x[(0, 1)] = "clé tuple" # ajoute une nouvelle valeur dont la clé est (0,1)
# les parenthèses sont superflues
print(x)
y = { } # crée un dictionnaire vide
- z = dict () # crée aussi un dictionnaire vide
+ z = dict() # crée aussi un dictionnaire vide
Opérations qu'un dictionnaire supporte.
@@ -421,9 +416,9 @@ Opérations qu'un dictionnaire supporte.
- plus grande clé
* - ``del l [i]``
- supprime l'élément associé à la clé ``i``
- * - ``list (d)``
+ * - ``list(d)``
- retourne une liste contenant toutes les clés du dictionnaire ``d``.
- * - ``dict (x)``
+ * - ``dict(x)``
- convertit ``x`` en un dictionnaire si cela est possible,
en particulier, ``d`` est égal à ``dict(d.items())``
@@ -442,13 +437,10 @@ Opérations disponibles sur les dictionnaires, ``d`` est un dictionnaire,
- Retourne un itérateur parcourant contenant tous les couples (clé, valeur)
inclus dans le dictionnaire. Pour obtenir une liste, il faut écrire
``list(d.items())``.
- **Version 2.x :** retourne une liste.
* - ``d.keys()``
- Retourne un itérateur parcourant toutes les clés du dictionnaire ``d``.
- **Version 2.x :** retourne une liste.
* - ``d.values()``
- Retourne un itérateur parcourant toutes les valeurs du dictionnaire ``d``.
- **Version 2.x :** retourne une liste.
* - ``d.get(k[,x])``
- Retourne ``d[k]``, si la clé ``k`` est manquante, alors
la valeur ``None`` est retournée à moins que le paramètre optionnel ``x``
@@ -473,7 +465,7 @@ Ce type ne fait pas partie du langage python standard mais il est couramment uti
::
import numpy
- a = numpy.array ( [0,1] )
+ a = numpy.array([0, 1])
Il permet de convertir des listes en une structure plus appropriée au calcul
qui sont nettement plus rapides. En contrepartie, il n'est pas aussi
@@ -624,11 +616,11 @@ Elle applique une fonction à chaque élément d'un ensemble.
.. runpython::
:showcode:
- def fonction (x):
+ def fonction(x):
return x % 2
li = [ 3,4,5]
- li2 = map (fonction, li)
+ li2 = map(fonction, li)
print(list(li2))
A priori, l'ensemble qui en résulte contient autant d'éléments
@@ -676,11 +668,11 @@ plusieurs résultats ou aucun. Leur déclaration suit le schéma suivant :
::
- def exemple_fonction (p1, p2, p3) :
+ def exemple_fonction(p1, p2, p3) :
# code de la fonction
return r1, r2
- a,b = exemple_fonction (1,2,3) # exemple d'appel de la fonction
+ a,b = exemple_fonction(1, 2, 3) # exemple d'appel de la fonction
L'instruction ``return`` n'est pas obligatoire mais si elle
est présente à un ou plusieurs endroits, aucune autre instruction de la
@@ -691,21 +683,21 @@ ces paramètres reçoivent une valeur même si celle-ci n'est pas précisée lor
::
- def exemple_fonction (p1, p2 = 4, p3 = 7) :
+ def exemple_fonction(p1, p2=4, p3=7):
# code de la fonction
return r1, r2
- a,b = exemple_fonction (1) # = exemple_fonction (1,4,7)
- a,b = exemple_fonction (1,2,3) # = exemple_fonction (1,2,3)
- a,b = exemple_fonction (1,2) # = exemple_fonction (1,2,7)
- a,b = exemple_fonction (1,p3 = 2) # = exemple_fonction (1,4,2)
+ a,b = exemple_fonction(1) # = exemple_fonction(1,4,7)
+ a,b = exemple_fonction(1, 2, 3) # = exemple_fonction(1,2,3)
+ a,b = exemple_fonction(1, 2) # = exemple_fonction(1,2,7)
+ a,b = exemple_fonction(1, p3=2) # = exemple_fonction(1,4,2)
Les paramètres par défaut doivent tous être mis en fin de
déclaration, l'exemple suivant n'est pas correct :
::
- def exemple_fonction (p1, p2 = 4, p3) :
+ def exemple_fonction(p1, p2=4, p3):
# code de la fonction
return r1, r2
# affiche le message d'erreur : SyntaxError: non-default argument follows default argument
@@ -717,11 +709,11 @@ n'a pas de répercution à l'extérieur).
.. runpython::
:showcode:
- def exemple_fonction (p1) :
+ def exemple_fonction(p1) :
p1 = 3
a = 1
- exemple_fonction (a)
- print (a)
+ exemple_fonction(a)
+ print(a)
Les paramètres de type modifiable sont passés par référence (une modification
à l'intérieur de la fonction a des répercutions à l'extérieur).
@@ -729,11 +721,11 @@ Les paramètres de type modifiable sont passés par référence (une modificatio
.. runpython::
:showcode:
- def exemple_fonction (p1) :
+ def exemple_fonction(p1) :
p1[0] = 3
a = [1]
- exemple_fonction (a)
- print (a)
+ exemple_fonction(a)
+ print(a)
mot-clé ``lambda``
++++++++++++++++++
@@ -743,11 +735,11 @@ Le mot-clé ``lambda`` permet de définir des fonctions au sein d'une expression
.. runpython::
:showcode:
- def fonction (x) :
+ def fonction(x) :
return x % 2
- li = [ 3,4,5]
- li2 = map (fonction, li)
- print (list(li2))
+ li = [3, 4, 5]
+ li2 = map(fonction, li)
+ print(list(li2))
Peut-être écrit comme :
@@ -755,8 +747,8 @@ Peut-être écrit comme :
:showcode:
li = [ 3,4,5]
- li2 = map (lambda x : x%2, li)
- print (list(li2))
+ li2 = map(lambda x : x%2, li)
+ print(list(li2))
Et si on veut ajouter un paramètre à la fonction ``lambda`` :
@@ -765,7 +757,7 @@ Et si on veut ajouter un paramètre à la fonction ``lambda`` :
li = [ 3,4,5]
k = 2
- li2 = map (lambda x, y=k: x % y, li)
+ li2 = map(lambda x, y=k: x % y, li)
print(list(li2))
mot-clé ``yield``
@@ -780,19 +772,19 @@ En python, elle se décline sous la forme d'itérateur.
def iterate_double_on_list(l) :
for x in l :
yield x*2
- print (iterate_double_on_list( [4,5,6]))
+ print(iterate_double_on_list([4, 5, 6]))
La fonction itère sur un ensemble mais ne fait rien tant qu'on ne parcourt pas l'ensemble qu'elle génère :
.. runpython::
:showcode:
- def iterate_double_on_list(l) :
+ def iterate_double_on_list(l):
for x in l :
yield x*2
- for x in iterate_double_on_list( [4,5,6]) :
- print (x)
+ for x in iterate_double_on_list([4, 5, 6]):
+ print(x)
La version 3 du langage python a changé des fonctions pour qu'elle retourne
un itérateur sur un ensemble et non l'ensemble lui-même.
@@ -986,7 +978,7 @@ Il faut donc copier explicitement l'instance pour obtenir le résultat souhaité
a = ma_classe (1,2,3)
import copy
- b = copy.copy (a)
+ b = copy.copy(a)
b.att1 = -16
print (a.att1) # affiche 1
print (b.att1) # affiche -16
diff --git a/_doc/conf.py b/_doc/conf.py
index 78cb6c1b..21652819 100644
--- a/_doc/conf.py
+++ b/_doc/conf.py
@@ -81,12 +81,14 @@
mathjax3_config = {"chtml": {"displayAlign": "left"}}
intersphinx_mapping = {
- "onnx": ("https://onnx.ai/onnx/", None),
+ "IPython": ("https://ipython.readthedocs.io/en/stable/", None),
"matplotlib": ("https://matplotlib.org/", None),
"numpy": ("https://numpy.org/doc/stable", None),
+ "onnx": ("https://onnx.ai/onnx/", None),
"pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None),
"python": (f"https://docs.python.org/{sys.version_info.major}", None),
"scipy": ("https://docs.scipy.org/doc/scipy/reference", None),
+ "skl2onnx": ("https://onnx.ai/sklearn-onnx/", None),
"sklearn": ("https://scikit-learn.org/stable/", None),
"sklearn-onnx": ("https://onnx.ai/sklearn-onnx/", None),
"torch": ("https://pytorch.org/docs/stable/", None),
@@ -170,6 +172,8 @@
"""
epkg_dictionary = {
+ "_ipython_display_": "https://ipython.readthedocs.io/en/stable/config/integrating.html?highlight=Integrating%20",
+ "_repr_html_": "https://ipython.readthedocs.io/en/stable/config/integrating.html#custom-methods",
"Algorithme de Strassen": "https://fr.wikipedia.org/wiki/Algorithme_de_Strassen",
"algorithme de Strassen": "https://fr.wikipedia.org/wiki/Algorithme_de_Strassen",
"ACP": "https://fr.wikipedia.org/wiki/Analyse_en_composantes_principales",
@@ -199,6 +203,7 @@
"dill": "https://dill.readthedocs.io/en/latest/",
"dir": "https://docs.python.org/3/library/functions.html?highlight=dir#dir",
"dot": "https://fr.wikipedia.org/wiki/DOT_(langage)",
+ "DOT": "https://fr.wikipedia.org/wiki/DOT_(langage)",
"encoding": "https://fr.wikipedia.org/wiki/Codage_des_caract%C3%A8res",
"eval": "https://docs.python.org/3/library/functions.html?highlight=id#eval",
"Excel": "https://fr.wikipedia.org/wiki/Microsoft_Excel",
@@ -223,6 +228,8 @@
"mlinsights": "http://www.xavierdupre.fr/app/mlinsights/helpsphinx/index.html",
"mlstatpy": "https://sdpython.github.io/doc/mlstatpy/dev/",
"NP-complet": "https://fr.wikipedia.org/wiki/Probl%C3%A8me_NP-complet",
+ "neato": "https://www.graphviz.org/pdf/neatoguide.pdf",
+ "notebook": "https://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/what_is_jupyter.html#notebook-document",
"numpy": (
"https://www.numpy.org/",
("https://docs.scipy.org/doc/numpy/reference/generated/numpy.{0}.html", 1),
@@ -276,6 +283,7 @@
"ujson": "https://github.com/ultrajson/ultrajson",
"Visual Studio Code": "https://code.visualstudio.com/",
"Visualize a scikit-learn pipeline": "http://www.xavierdupre.fr/app/mlinsights/helpsphinx/notebooks/visualize_pipeline.html",
+ "viz.js": "https://github.com/mdaines/viz-js",
"X-tree": "https://en.wikipedia.org/wiki/X-tree",
"XML": "https://fr.wikipedia.org/wiki/Extensible_Markup_Language",
"wikipedia dumps": "https://dumps.wikimedia.org/frwiki/latest/",
diff --git a/_doc/i_index.rst b/_doc/i_index.rst
new file mode 100644
index 00000000..28a7176c
--- /dev/null
+++ b/_doc/i_index.rst
@@ -0,0 +1,13 @@
+
+===========
+En diagonal
+===========
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Compléments
+
+ auto_examples/index
+ api/index
+ i_ex
+ i_faq
diff --git a/_doc/index.rst b/_doc/index.rst
index 4f0efdf8..7a64c007 100644
--- a/_doc/index.rst
+++ b/_doc/index.rst
@@ -23,26 +23,20 @@ pas ou eu programmer. Le contenu est disponible sur
c_resume/index
articles/index
-.. toctree::
- :maxdepth: 1
- :caption: savoir
-
- algorithm_culture
-
.. toctree::
:maxdepth: 1
:caption: Exercices
- practice/index
- auto_examples/index
- api/index
+ practice/index_python
+ practice/index_algo
+ practice/index_exam
.. toctree::
:maxdepth: 1
:caption: Compléments
- i_ex
- i_faq
+ algorithm_culture
+ i_index
license
CHANGELOGS
diff --git a/_doc/practice/_nbs/exercice_ordonnancement.ipynb b/_doc/practice/algo-base/exercice_ordonnancement.ipynb
similarity index 76%
rename from _doc/practice/_nbs/exercice_ordonnancement.ipynb
rename to _doc/practice/algo-base/exercice_ordonnancement.ipynb
index 841fbcce..bd84829e 100644
--- a/_doc/practice/_nbs/exercice_ordonnancement.ipynb
+++ b/_doc/practice/algo-base/exercice_ordonnancement.ipynb
@@ -11,7 +11,7 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
@@ -29,25 +29,32 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 15,
"metadata": {},
"outputs": [
{
- "ename": "ModuleNotFoundError",
- "evalue": "No module named 'jyquickhelper'",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[0;32mIn[2], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mnumpy\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mmatplotlib\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mpyplot\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mplt\u001b[39;00m\n\u001b[0;32m----> 3\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mjyquickhelper\u001b[39;00m \u001b[39mimport\u001b[39;00m RenderJsDot\n\u001b[1;32m 6\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mplot_network\u001b[39m(mat):\n\u001b[1;32m 7\u001b[0m \u001b[39m# Dessine un graph à l'aide du language DOT\u001b[39;00m\n\u001b[1;32m 8\u001b[0m \u001b[39m# https://graphviz.org/doc/info/lang.html\u001b[39;00m\n\u001b[1;32m 9\u001b[0m rows \u001b[39m=\u001b[39m [\u001b[39m\"\u001b[39m\u001b[39mdigraph\u001b[39m\u001b[39m{\u001b[39m\u001b[39m \u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m'\u001b[39m\u001b[39m rankdir=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mLR\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m;\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39m size=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m4,4\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m;\u001b[39m\u001b[39m'\u001b[39m]\n",
- "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'jyquickhelper'"
- ]
+ "data": {
+ "text/html": [
+ "