XD blog

blog page


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-12 Les stations Vélib à Paris un jeudi soir

Les données Vélib sont ouvertes (depuis peu) et on peut disposer de l'état des stations (vélos et places disponibles) au moment où accède au service. J'ai collecté les données pendant plusieurs consécutives. Elles ressemblent à celles qui suivent.

addressavailable bike standsavailable bikesbankingbike standsbonuslast updatelatlngnamenumberstatus
3 AVENUE BOSQUET - 75007 PARIS571206902013-05-09 22:58:4748.86164049957622.3022503441759507022 - PONT DE L'ALMA7022OPEN
18 RUE MARIE ANDREE LAGROUA - 75013 PARIS52706102013-05-09 22:53:3448.82859528385742.3802206062661113055 - LAGROUA13055OPEN
25 RUE LOUIS LE GRAND - 75002 PARIS121903102013-05-09 22:55:3848.87050893720392.3340544619393302015 - OPERA - CAPUCINES2015OPEN
2 RUE DE LA REPUBLIQUE - 92170 VANVES02502502013-05-09 23:01:0348.82170269989312.2853956248283921704 - REPUBLIQUE (VANVES)21704OPEN
96 RUE DE LAGNY - 93100 MONTREUIL20402702013-05-09 22:55:2148.84923030086482.4214299400070331001 - LAGNY (MONTREUIL)31001OPEN

Je me suis aperçu que l'état des stations est mis à jour de façon désynchronisée. A priori à chaque fois qu'un vélo arrive ou part et régulièrement toutes les dix minutes. Projeté sur un graphe, cela donne l'image suivante et pour voir l'animation, il suffit de cliquer sur le lien.


more...

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-08 PCA, eigen values and numerical approximation

High dimensional data do not behave very well with linear computation, especially when coefficients are very different in order of magnitude.

Yesterday, I was playing with some observations trying to do a PCA. Usually, we do not look at very small eigen values because they do not explain the variance of the observations set. However, I was surprised to find negative values. My observations were described with 29 variables, let's denote them as a centered matrix X. Computing a PCA means extracting the eigen values of the covariance matrix: X'X / N (N is the number of centered observations). This matrix is symmetric so it is diagonalisable and its eigen values are positive or null. However, when I looked at them, the last ones were negative (as the determinant).

Getting negative eigen values for this kind of matrices is necessarily wrong and it is due to numerical approximations. To observe that, I computed the eigen values for the series of submatrices X'X [1:n,1:n]. I also compared the eigen values to the one I could get from the Jacobi algorithm. This algorithm cannot converge to a matrix having negative values on the diagonal (when the matrix is a covariance matrix). You can see the results below.


more...

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-30 Règles de priorité en Python

A force de coder avec un langage de script qui autorise presque tout, on devient paresseux. On perd du temps pour finalement redécouvrir quelques règles de priorité. J'ai écrit la fonction f1 en pensant qu'elle se comporterait comme la fonction f2.

def f1 (b) : return 1,1 if b else 0,0
def f2 (b) : return (1,1) if b else (0,0)

print ("f1", f1(False), "f2", f2(False))  # f1 (1, 0, 0) f2 (0, 0)
print ("f1", f1(True),  "f2", f2(True))   # f1 (1, 1, 0) f2 (1, 1)
On omet les parenthèses la plupart du temps en ce qui concerne les tuples en Python. Ces conversions implicites ont quelques effets secondaires. Je tâcherai de m'en souvenir.

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-14 La dimension créative du métier de développeur

Je suis tombé sur cette vidéo What most schools don't teach (depuis Le Figaro Etudiant) qui incite les jeunes à choisir le métier de développeur. D'après cet autre article Ces métiers dont personnes ne veut, cette voie n'a pas les faveurs des étudiants. La vidéo présente un métier incontournable, présent partout depuis la table de mixage jusqu'à la voiture. On y voit des hommes et des femmes parler de ce métier et de tout ce que les sociétés font pour attirer les talents (cantine bio, cadre de travail design, salle de repos...), de l'intérêt qu'ils portent à leur travail, du fait que ce travail est bien rémunéré. Bill Gates est interviewé par CNN à ce sujet. Le patron de Facebook milite aussi pour que les Etats-Unis assouplissent les règles d'immigration pour pouvoir recruter des ingénieurs que l'éducation américaine n'arrive pas à fournir (Courrier International). Il a monté un lobby pour influencer les politiques.

Cette réalité est sans doute quelque peu édulcorée, la proportion de femmes travaillant dans l'informatique est toujours très faible, passer un temps conséquent devant un écran ne favorise pas les échanges. Le fait est que ce métier est en grande partie abstrait. Les applications informatiques ont la plupart du temps une interface concrète mais à l'intérieur, les milliers de lignes de code le sont beaucoup moins. Je me dis que parfois se promener dans ces montagnes de symboles revient à joueur une partie d'échec en aveugle.

Beaucoup d'ordinateurs utilisent Linux aujourd'hui. Son créateur s'est inspiré d'Unix inventé en 1969. Il s'est écoulé 40 ans depuis et c'est un assemblage gigantesque de morceaux de codes de tous âges. Il y a probablement plus de personnes qui ont contribué à Linux que de travailleurs ayant posé une pierres sur la Cathédrale Notre-Dame. Une drôle d'aventure.

De mon point de vue, on oublie souvent la partie créative de ce métier. Il ne consiste pas simplement à envoyer des instructions à une machine pour qu'elle exécute plus rapidement ce qu'on faisait manuellement auparavant, c'est aussi imaginer de nouvelles façons d'utiliser des outils existants (comme ici) de créer des algorithmes qui vont chercher de l'information dans un océan de données. Vous ne trouverez pas de manuel pour vous dire comment faire.

2013-04-13 Des légumes en moins de 15 minutes

Et une heure de cuisson. Armé de ma seule recette de ratatouille, cuisiner des légumes prenait du temps. Mon imagination ne déborde pas d'idées avec ces foutus aliments et comme mon quotidien à la cantine se résume à du riz, des haricots verts et un gros chouïa de viande, j'ai du mal à me renouveler. Il doit me rester une pâte feuilletée pour faire une tourte mais je n'ai jamais les trois ingrédients qu'il faut ou jamais avec les bonnes dates de préremption. Bref, la ratatouille, il faut touiller sinon ça colle !

Un soir, j'en ai eu marre des allers retours depuis le salon jusqu'à la cuisine pour vérifier que ça ne collait pas. J'ai fini par mettre les mêmes ingrédients dans un bocal avec de l'huile d'olive, du sel et du poivre, le tout recouvert de papier d'aluminium pour éviter que l'eau s'évapore trop. Au bout d'une heure, ça causait encore, un bout d'une heure et quart, ça fumait bon. J'ai mangé à 23h mais j'ai gardé la recette. Ca laisse tout le temps de prendre l'apéro ou d'essayer de construire un gif animé en Python à partir d'une trentaine d'images. Allez savoir pourquoi, ça avait décidé de ne pas marcher ce soir.


more...

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...

2013-04-04 Coding spirit - which developer are you?

When you work for a big company, you have the opportunity to observe many coding styles and spirits. I will not talk about coding style, it appears mine is not perfect since I never learnt programming in a school but only by myself. I put spaces before semicolon or brackets because it fits the way I write in French. But coding spirit is something else. Some developers goes fast, develop an idea as fast as they can, show it works and...

That's the big question: what happens next? You can continue based on the existing code which is very tempting to avoid losing the momentum of your ideas. Usually, it happens that your development speed decreases as you face issues, bugs, design limitations. The code is most of the time not enough unit tested, it has very small documentation and memory fades away. Code review was not that used and the design did not benefit from too many insights.

Some people might say that you should stop, think again about the whole thing and make it right this time. A good design never fails... I would say design always faces a time when it reaches its limitations just because research moved forward, needs changed. My suggestion is to revisit the code from time to time and not to hesitate holding development just to redesign some parts. A kind of regular code cleaning. It also adresses the goal of not completely losing sight of an old code as you revisit it.

However, the first approach is not bad when you do research. You are only interest in proving an idea is wworking not in maintaining the code which helped to prove it. And it perfectly makes sense... until somebody asks you to continue and develop the new features you promised. You then continue to develop as crazy, show the beginning of the new features. You are successful. My recommendation at this stage of the development: leave the project as it is and be as successful somewhere else. The new team in charge will take some time to fully understand what you did, and will probably decide to make some deep changes which will significantly slow down the software development (at least compare to the previous team).

There are so many ways to develop. But sometimes, I think it is like playing chess, some developers think further. You do not understand why they are playing this move... but it works ten moves later. The only issue is a chess games does not last more than a day when developing game can last many years.

2013-03-30 Python, R, MOOC, Big Data, quelques références

A chaque fois qu'on change de distribution Python, il faut réinstaller les modules dont on se sert et aussi ceux dont on se sert parfois et dont on découvre qu'ils ne sont pas toujours maintenus à jour. Le module Rpy2 permet de lancer des scripts R depuis l'interpréteur Python. Il permet également d'accéder à certains objets puisque l'espace de travail reste ouvert et garde la mémoire de ce qui a été fait. J'essaye de l'installer, ce que je n'ai pas encore réussi à faire avec la version 3 de Python, et ce faisant, je suis tombé sur le module RPython qui permet de faire exactement l'inverse, c'est-à-dire d'exécuter du code Python depuis R.

Je suis beaucoup plus à l'aise avec Python dès qu'il s'agit de faire les choses les plus ennuyeuses (charger des données, réarranger des colonnes, filtrer, appliquer des modifications textuelles...), je vais probablement l'essayer. Mais cela montre que le langage Python est plutôt populaire. La même chose existe avec Excel : le module pyxll permet d'écrire des macros en Python de façon plutôt simple. L'idée est plutôt séduisante, il est plus facile de maintenir un code Python plutôt que de VBA.

L'apprentissage de l'informatique se démocratique en ce sens qu'il devient de plus en plus facile de trouver des cours gratuits et de très bonne qualité. Le site du zéro propose également de nombreux tutoriels sur la plupart des langages informatiques courants. En langue anglaise, il y a code school ou Khan Academy qui dispose de nombreuses vidéos à propos de sujets allant de la programmation à computer science même si dans ce domaine le must est Coursera. L'école Polytechnique a décidé d'y participer : EP. edX est une autre plateforme choisie par Harvard, le MIT. Ces plateformes sont appelées MOOC, le blog suivant un MOOC c'est quoi au juste sera plus disert que moi sur le sujet. Le dernier cité est Udacity. Le premier (Coursera) est probablement le plus riche, on y trouve également des cours d'improvisation musicale.

Chose amusante, peu de cours apparaissent lorsqu'on en cherche un à propos de Big Data. Sans doute cette présentation Big Data, Sorry What Does a Data Scientist Do en donnera quelques raisons (j'ai trouvé cela depuis le blog Freakonometrics).


<-- -->

Xavier Dupré