XD blog

blog page

references


2014-04-02 References for Statistics with R

Python does not offer all the functionalities in one module, you need to look for them sometimes. In my case, I was looking for a statistical test on coefficients obtained with a linear regression. The module I was looking for is statmodels. While looking for that, I found this interesting blog Glowing Python. But I finally decided to switch to R where I know for sure I would find what I need. And because I'm not fluent in R, I need something like that : StatMethods.

2013-08-01 Datamining avec R ou Python

Il est devenu assez facile de travailler avec R. Même si je trouve toujours le langage compliqué, il faut avouer que des outils comme RStudio rendent l'outil indispensable et de moins en moins difficile d'accès. On peut importer ses données depuis une grande variété de format, créer des rapports en utilisant knitr ou encore créer une application web avec shiny. Il existe un package pour presque tout comme pour faire des tests unitaires avec RUnit.

J'ai pour habitude de faire le plus de choses possibles en Python, de passer au C++ quand c'est vraiment nécessaire et d'utiliser R pour tout ce qui statistiques. R a l'avantage d'avoir une modèle suivi par tous les packages alors que les modules Python suivent leur propre logique le plus souvent.

Un exemple sur les méthodes à noyau : sous R, il faudrait utiliser le package kernlab, sous Python, on se dirigerait vers scikit-learn. Les packages sous Python sont souvent plus gros car les auteurs auront voulu intégrer de nombreux algorithmes selon la même logique. Sous R, chaque package a un périmètre plus réduit et suit les mêmes conventions. Comme Python s'interface avec à peu près tout y compris R, je préfère ce langage dont la syntaxe me paraît plus facile même si je n'hésite pas à repasser à R dès qu'il le faut.

C++

Les deux langages permettent d'inclure des morceau de C++ si nécessaire. Python dispose de diverses façons~: Cython, Boost.Python, ou cffi. Avec R, il y a Rcpp (tutoriel sur Rcpp, il faut aussi installer devtools). Est-ce que le langage C va disparaître ? Pour le moment, si les langages de scripts sont beaucoup plus utilisés, les compilateurs sont la plupart du temps écrits en C++. De nombreuses extensions ont été écrites en C++ (voir Eigen par exemple). Ce langage est souvent un choix raisonnable lorsqu'on veut écrire du code très rapide.

Graphiques

L'outil qui prend un peu plus d'importance ces temps-ci est d3.js car il permet de réaliser des graphiques facilement intégrables sur un site web, un journal en ligne, qu'il permet de faire plus facilement des animations et surtout, comme il est écrit en javascript, il permet de créer des graphes qui réagissent à la souris ou au clavier. Je n'arrive pas encore à trouver un module qui le rende facilement utilisable depuis Python. L'article Method: Data visualization with D3.js and python - part 1 décrit comment s'y prendre sans toutefois citer de module dédié à cet usage. Ca ne devrait pas tarder. Sous R, sans être javascript, il existe ggplot2 qui propose des graphes assez jolis.

Big Data

Enfin, dans le domaine des Big Data, les solutions lourdes type Map/Reduce Hadoop sont de plus en plus fréquentes lorsqu'on traite des données qui arrivent en continu (internet, téléphone, consommation d'énergie...). Pour le reste, un ordinateur portable avec quelques giga octets de mémoire et un disque dur conséquent suffit. Des outils existent pour ne pas avoir à charger une base complète en mémoire. C'est le cas de ff et ffbase (ou ça bigvis) sous R. Sous Python, l'environnement de travail le plus approprié est IPython. Pour manipuler les données, on trouve pandas ou PyTables.

2013-06-24 Installer pip pour Python

J'ai encore perdu des minutes pour installer le package pip qui permet d'installer tous les autres. Ca a l'air simple vu d'un premier abord sauf qu'il faut installer ses dépendances : setuptools. Et comme je ne fais pas ça tous les jours... J'ai perdu du temps à force d'être paresseux et je suis retombé sur cette page : Unofficial Windows Binaries for Python Extension Packages qui m'a permis de tout faire en trois clics. Il faut vraiment que je retienne cette page.

2013-06-13 A template to create a Python module including Sphinx documentation and a setup

My students often struggle to debug their programs when two or three students need to synchronize their versions. A good way to avoid wasting too much time is to use a tool to keep track of the modifications such as github. It then becomes easy to synchronize multiple versions.

However, students still need to debug the program after a synchronization. A good practice is to write unit tests. Every time, you write a complex function or an easy one, a unit test should be written to ensure its behaviour will not change after many changes. But it means to add a file, to spend some time to do it right, and to frequently run all the unit tests. This is usually too painful when the project will only last a couple of months. Plus, you usually commit yourself to do it only after you went through the nightmare of debugging once.

Last but not least, my students usually do not add documentation to their code. Most of the time, they do not need it because the project is too short to lose track of the modifications and too small to not know it completely. Maybe another reason is because they cannot see a compiled version of the documentation. The best way is to use Sphinx ut using it means spending a couple of hours at least (a lot of more if you do it for the first time). Documentation can also be used to navigate through the program.

For those reasons, I made a kind of template for a Python module. It includes an easy mechanism to add a unit test and to run it. It generates with the documentation with no change and it also generated a setup (gz, exe) with no change either. You can get it here: Pieces of codes, libraries (section Code). After you downloaded it, a page gives the short list of instructions to tweak the template in order to make it yours: README.

2013-06-08 Apprendre la programmation avec la souris (avec Scratch)

Je cherchais des livres récents sur Python et je suis tombé là dessus : Super Scratch Programming Adventure!: Learn to Program by Making Cool Games!. Le livre est en anglais mais il présente un outil qui se décline dans toutes les langues et qu'on peut trouver ici : Scratch et qu'on peut télécharger sur toutes les plateformes ici : téléchargement.

Je suis toujours un peu sceptique sur les outils comme celui-ci. Ils sont soit très simples mais on ne peut pas faire grand chose, soit aussi complexe que d'autres (Apprendre à coder en Python : illustration) avec le désavantage de ne pas pouvoir utiliser plus tard ce qu'on apprend aujourd'hui (tout du moins pas en l'état car c'est une autre syntaxe). Malgré tout, c'est un outil intéressant, il offre une vue plus visuelle sur ce qu'est un algorithme comme cet exemple sur le calcul du PGCD (plus grand diviseur commun) : PGCD avec Scratch. Avec Scratch, on peut créer une scène et animer relativement facilement plusieurs objets dans cette scène : minotaure. On peut y ajouter des extensions : S4A : un projet pédagogique. On peut même trouver une traduction française du tutoriel : tutoriel en français. Et si vous avez la flemme de l'installer, vous pouvez l'utiliser en ligne : Scratch en ligne.

Tout est fait pour y être intuitif et ça marche plutôt bien. Cela dit, comme tout langage de programmation, il faudra quelques heures pour arriver à faire vraiment ce qu'on avait en tête au moment de commencer. Il manque selon mon avis deux fonctionnalités. La première serait de pouvoir aisément animer un personnage avec une séquence d'images. Dans scratch, chaque image serait un objet ce qui rend les choses un peut compliquées. L'autre option est de créer des costumes différents mais je ne sais pas trop comment Scratch gère la transparence des images. Il manque aussi les fonctions même s'il est encore possible de contourner l'obstacle : Creating a Function in Scratch using a Variable. Ce n'est pas l'idéal. L'autre option est d'utiliser Snap qui permet de créer ses propres blocs. Je n'ai pas réussi à télécharger l'outil, il est seulement disponible en ligne pour le moment (et en anglais). J'attendrais un peu.

Il n'est pas facile d'apprendre à programmation. Je n'ai pas encore trouvé de représentation qui ne soit pas abstraite. On comprend aisément ce que veut dire répéter une suite d'opérations mais un algorithme comprend souvent plusieurs répétitions, chacune d'entre elles pilotée par une condition différente. Les premiers pas sont plutôt simples comparés à l'assemblage de pas d'un programme qui fait quelque chose d'utile. Cette multitude devient nécessairement abstraite au-delà d'un certain point.

Il y a vingt ans, on enseignait la programmation au lycée avec le LSE dont la syntaxe était en français. Il n'a pas survécu probablement parce qu'il était dédié l'enseignement mais ne permettait pas vraiment de faire quoi que ce soit d'utile. Espérons que Scratch suive un destin différent. Et si on n'est pas convaincu, il est toujours possible de créer son propre langage A simple interpreter from scratch in Python, part 2, part 3, part 4.

2013-05-20 Quelques blogs intéressants pour la programmation Python

Le blog Les articles pour apprendre Python, dans le bon ordre regroupe de nombreux articles techniques sur la programmation Python. Les articles sont très détaillés autour d'un sujet précis :

Le même article récapitulatif existe pour ceux qui veulent programmer avec django : Les articles pour apprendre Django, dans le bon ordre :-). Cela m'amène à citer le module suivant IPython que je vois revenir souvent depuis quelques temps. Il change la présentation de la ligne de commande pour la faire ressembler à celle d'un Matlab ou d'un R, il permet de récupérer les commandes précédentes. Il propose également de facilement distribuer un calcul sur plusieurs machines avec la librairie MPI. Cette fonctionnalité n'est pas encore disponible avec Python 3 mais cela devrait vite arriver. Il a sa page Wikipedia. Certaines présentations l'utilisent pour toutes les copies d'écran. On l'utilise beaucoup avec PyTables. Ce dernier module utilise blosc qui optimise les transferts de données entre la mémoire et le CPU en compressant les données. Pour conclure ce patchwork, ces lectures m'ont amené à dénicher cette page : 100 sites de Consommation Collaborative où on trouve des sites comme celui-ci CoLunching.

2013-05-16 Modules for Python

I recently discovered this page Unofficial Windows Binaries for Python Extension Packages which provides a link to many Windows installer for Python extensions. It provides installer even when the official website does give any. It saved me sometimes while trying to build Rpy2 for Python 3.3. It was the only place I was able to find a Windows version for Python 3.3. I put here the official website for each module. The first page links to the latest installer for each of them. Here is a short not no short list of scientific extensions.

Some others to draw maps or 3D graphs: Some GUI (Graphic User Interface): About datamining: Various extensions:

2014/07/01 - an updated version of this page but in French: Modules intéressants (pour un ENSAE.

2013-05-13 Trie in Python

I was looking for extensions to use tries in Python and I found an interesting page: Fast Non-Standard Data Structures for Python. The winner seems to be MARISA-trie. The library is self contained and can be installed using pip (I did not try yet). The code can be compiled either in 32 or 64 bits.

2013-05-10 Installer un package simplement avec Python : pip

Pour installer les packages ou modules sous Python, il est possible d'utiliser un installer (.exe ou .msi sous Windows), de télécharger les sources puis de taper depuis une fenêtre de commande :

python setup.py install
Lorsque le package contient des extensions à compiler, il faut parfois taper. Par défaut, c'est le compilateur MingGW qui utilisé ou gcc sous Linux :
python setup.py build
python setup.py install

Python facilite l'installation en évitant l'étape de téléchargement. Il faut pour cela d'abord intaller deux packages (comme mentionné ci-dessus) :

Ensuite, il suffit de se placer dans le répertoire <python>/Scripts et taper :
pip install <module_name>
L'avantage de cette méthode est la gestion automatique des dépedendances qui sont installées si besoin. (voir plus bas pour la sortie d'écran après l'exécution de la commande pip install jinja2).

Remarque : certains modules (numpy) contiennent des fichiers C++ qui devront être compilés. Cette compilation nécessite l'installation de MingGW et la définition de certaines variables environnement. Il est préférable d'utiliser les setups tout préparés qui incluent les mêmes fichiers déjà compilés.

Tester une installation

Parfois, on veut juste tester un module et ne pas dégrader son environnement. C'est possible avec le module virtualenv. Il faut d'abord l'installer :

pip install virtualenv
Ensuite, on crée un répertoire pour les différents environnements virtuels :
mkdir c:\python33vir
On crée un environnement virtuel :
virtualenv c:\python33vir\virt1 --system-site-packages
L'option --system-site-packages permet d'utiliser les modules déjà installés dans le répertoire de Python. Puis on va dans le répertoire python33vir/vir1/Script, on peut installer le module à tester :
pip install jinja2
Si vous obtenez une erreur (bad sum), il est préférable de recommencer avant de chercher une autre erreur. Il suffit ensuite d'utiliser le programme python33vir/vir1/Script/python.exe (ou pythonw.exe) pour exécuter ses propres scripts.


more...

2013-05-09 Créer un site web en Python : Flask ou Django ou Pelican

Django est le framwork le plus connu quand il s'agit de créer un site web en Python. Le projet a démarré il y a plusieurs années (2005), il est robuste et il est maintenu. En contre partie, le coût d'entrée est assez lourd.

Récemment, j'ai découvert Flask qui est plus léger et suffit largement lorsqu'on veut construire un site internet à usage interne. Il nécessite l'installation des modules JinJa (disponible pour Python 3) et Werkzeug (non disponible pour Python 3). L'installation de ces modules se fait simplement avec pip (pip install <module>, voir article 2013-05-10 : Installer un package simplement avec Python : pip).

Pour démarrer avec Flash, il suffit de lire la page suivante : Introduction à Flask. Le code d'un service web hello world :

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Bonjour !"

if __name__ == "__main__":
    app.run()
Qu'on lance de cette façon :
$ python hello.py
 * Running on http://localhost:5000/
Si j'avais su, j'aurais probablement créé ce blog de cette façon en m'appuyant sur cet exemple. Flask permet l'utilisation d'une base de données de type SQLlite. Différentes configurations sont disponibles ici pour interacer Flask avec Heroku, MongoDB, CouchDB, OpenID...

Pour ceux qui souhaitent créer un blog en Python (et avec Python 2.7 ou 3), il existe aussi le package pelican. Il dépend des packages, feedgenerator, pygments, docutils, pytz, blinker, unidecode, six, automatiquement installé avec pip (pip install pelican).

Vous trouverez d'autres ressources pour créer un site sur ce blog : ScopArt.

2013-05-06 Quelques références

Python XY est une compilation de modules Python utilisés pour le calcul scientifique. Il inclut également un environnement qui ressemble à Matlab où R studio. Je n'ai pas vraiment réussi à l'installer sans casse la dernière fois que j'ai essayé et il n'est pas disponible en version 3. La liste des modules est intéressante. On y trouve un module tel que swapy qui permet d'automatiser des clicks sur des applications Windows, pyMC pour faire de l'inférence bayésienne ou encore WinMerge un outil pour comparer des fichiers ou des arborescences de fichiers.

Le format de documentation (ReStructuredText) développé pour Sphinx est directement intégré à GitHub qui recueille de plus en plus de projets open source. Le livre Probabilistic Programming and Bayesian Methods for Hackers est écrit avec ce format et il s'affiche directement depuis GitHub.

Dans un autre ordre d'idées, lorsqu'on développe et qu'on veut tester l'installation d'un module ou d'avoir des versions différentes de modules, il est possible de créer un environnement virtuel avec VirtuelEnv. Pour déployer un site web avec un push sur GitHub, on peut utiliser Heroku qui prend en charge des tests basiques et le déploiement.

Enfin, JCDecaux a rendu certaines données temps réel publiques données vélib. On peut télécharger au moyen d'une interface des données sur la présence ou l'absence de vélos à toutes les stations à n'importe quelle heure.

2013-04-28 Migration of old code

I wanted to use some old code I wrote a while ago about training neural networks but I needed to migrate it under a new version of Python and a new version of the compiler. I assumed that migrating my old code would not be too painful but it cost me day. I don't know if there is a good way to maintain some personal toolbox only used only from time to time. A single framework with a single way to add new features. But it is not very convenient with the multiplication of languages and the maintenane of unused old code. A framework which allows any kind of language but gluing projects with a script language (Python?): the issue with this one is you end up write multiple times the same basic functionalities (parsing text...) So far, my memory and the unit test I wrote were the best help to migrate my old code. It turned out I was able to produce a running version of old stuff here.

When I started that, my main issue was, as a teacher, to check if every piece of code I wrote for my students was still running. I also wanted to check which one would work on Python 3 (it was made on Python 2.6). I decided to come up with a solution allowing me to unit test them. I started to plug the biggest scripts and the new one. But what about the code embbeded in a latex file... I would surely do different now.

However, while doing that, I discover that non-ascii characters (latin) are now difficult to handle while writing a C++ extension for Python. They need to be translated into unicode string. I preferred to remove any French accent from my old code (in the documentation specified in boost::python::def) instead of finding a way to keep them. It will be for the next project.

2013-04-24 Python et GPU

Le processeur GPU permet de paralléliser certains calculs comme la génération de nombres aléatoires pour des apprentissages bayésiens ou des simulation de Monte-Carlo. Sous Python, le module pyCUDA (pypy) permet de paralléliser les calculs. Le code GPU - CUDA est transmis sous forme de chaîne de caractères, il est écrit en C++ et nécessite l'utilisation de numpy. Je n'ai pas encore testé l'installation mais l'ensemble a l'air assez simple avec un coût d'entrée raisonnable.

2013-04-06 Installation of module PyMC

Installing a Python module can lead you quite far especially if this one includes some fortran files. That's what happened when I tried to install PyMC. That's what I did for Python 3.3 but it does not mean it is the simplest way.

Then, use Python and try import pymc to see if it worked. After that oue hour I spent gathering all the necessary steps, I forgot why I wanted to do it... Just kidding, Scipy does not exist yet on Python 3.3 and I needed the function normcdf (or cdf).

2013-04-05 Apprendre à coder en Python : illustration

Je suis tombé sur un site très intéressant d'un point de vue pédagogique : PythonTutor. Il permet de représenter visuellement l'exécution pas à pas d'un programme comme celui-ci par exemple qui effectue un tri bulle :

l = [4, 6, 3, -2, 6, 9, 3]
for i in range(0, len(l)) :
    for j in range(0,len(l)-1) :
        if l[j] > l[j+1] :
            a      = l[j+1]
            l[j+1] = l[j]
            l[j]   = a
Le suivant permet de bien visualiser ce que fait Python lorsqu'il interprète une affectation, une copie, un tri :
l = [ [ 0, 1, 2 ], [ 4, 5, 6], [ -1, -2, -3 ] ]
m = l
n = list(l)
n.sort()
L'image qui suit est une copie d'écran du programme dans son état final.


more...
-->

Xavier Dupré