XD blog

blog page

~technical


2014-06-06 De l'usage de Python pour réduire le nombre de régions

C'est un article qui a été repris dans Le Monde d'aujourd'hui où on expose ce que pourraient être les régions si on tenait compte des déplacements à l'intérieur de la métropole : Réforme des régions : et si Hollande avait laissé les bigdata décider ? Découvrez le Régionator3000 ! La méthode s'appuie sur des données produites par l'INSEE : Base sur les flux de mobilité : mobilités professionnelles (déplacements domicile - lieu de travail). L'idée est simple : faire en sorte que la majorité des français habitent et travaillent au sein de la même région et donc réduire le nombre de français qui habitent et travaillent dans deux régions différentes. Je n'aime pas trop le titre qui cite les Big Data alors que ce n'en sont pas vraiment : le résultat est produit avec un script Python et le module scikit-learn et les données ne pèsent pas plus de 8 Mo. Mon propos n'est pas de dire que cette répartition est meilleure qu'une autre. Elle ne prend qu'une donnée en compte - les déplacements quotidien des gens -. C'est également une photo du présent qui n'est pas nécessairement celle qu'on pourrait avoir dans dix ans. Il eut été intéressant d'étudier l'évolution des résultats sur quelques décennies. On constate aussi que la Bretagne et la Corse font partie de la même région. Mon propos est plus de dire que c'est un élément de réflexion qui est devenu tout aussi accessible que les autres même s'il repose sur une méthode complexe : un clustering dans un graphe. Qui plus est, cela a été réalisé en Python.

Ce qu'on reproche probablement à la solution du gouvernement est qu'elle n'est pas expliquée. En cela, elle apparaît arbitraire. Puisqu'elle utilise une méthode qu'on ne peut accuser d'un quelconque biais, l'approche scientifique paraît plus objective, plus équitable et donc plus acceptable. Cela dit, il est vrai qu'on peut trafiquer les données en amont.

2014-06-04 Commencez avec Python

Quelques pointeurs pour ceux qui veulent commencer avec Python.

Et pour les plus jeunes :

2014-06-03 pandas and openpyxl are not compatible anymore

I use a lot openpyxl with pandas. But the new version of openpyxl is not compatible anymore with pandas. So be careful to install an older version until this compatibility issue is fixed:

pip install openpyxl==1.8.6

2014-06-02 Débugger en Python

Je n'ai jamais vraiment débugger en Python. J'ai commencé à coder avec ce langage il y a plusieurs années et j'avoue que le débugger C++ de Visual Studio est inégalé. Il n'y avait pas d'équivalent en Python. Après plusieurs essais au cours des années, je reste toujours un peu sceptique. Débugger en Python prend du temps, l'exécution est très ralentie et il m'est arrivé souvent que mon pointeur d'arrêt soit ignoré. Ou encore, j'ai peiné à configurer l'outil (trop de paramètres). Bref, je débugge rarement, j'insère plus souvent des print. Toutefois, débugger sans utiliser de ligne de commande est possible :

Si vous êtes moins dans le visuel (ce qui n'est pas mon cas), il y a d'autres alternatives comme pudb et le débuggeur de base Debugger en Python: les bases de pdb.

En ce qui me concerne, je vais faire le shadock, si on ne peut pas débugger correctement en python, c'est que ça ne sert à rien.

2014-05-24 Graphs and Map / Reduce

Implementing graph algorithm on map/reduce is still a challenge. But maybe because it is a challenge, people keep thinking about it. It is the purpose of GraphX which reduces the processing time for the Page Rank algorithm on a Spark environment. It is not as fast as PowerGraph which is not based on Map/Reduce but it is must faster than Mahout (see paper GraphX: A Resilient Distributed Graph System on Spark). One fact, the language Scala appears more and more. A sign: Mahout recently took the decision to stop implementing machine learning algorithm against Map/Reduce to switch to Spark.

2014-05-22 Données Vélib

En cherchant à récupérer des données Vélib pour d'autres villes que Paris, je suis tombé sur ce site : bikes.oobrien qui recense toutes les stations de vélo de toutes les villes du monde.

J'ai fini par implémenté une classe au module pyensae qui récupère les données pour les villes équipées par la société JC Decaux. Peut-être ajouterais-je d'autres sociétés comme Keolis qui gère Rennes avec vélo STAR. Un exemple de code est disponible ici.

2014-05-14 Deux ou trois choses à vérifier avant de rendre un projet informatique

Avant de remettre un programme informatique à un relecteur, il est deux ou trois petites choses qui facilitent le travail de relecture :

Lorsqu'un programme ne marche pas et qu'on a passé beaucoup de temps à chercher l'erreur, quoi de plus naturel que d'envoyer un mail à son professeur : "Monsieur, je ne comprends pas, ça ne marche pas et ça devrait marcher". Une fois sur deux, je réponds qu'il me serait utile d'en savoir un peu plus :

Bien souvent, le message d'erreur que je peux lire après avoir reproduit l'erreur est une bonne indication pour savoir où chercher. Dans le cas contraire, voici ce par quoi je commence en général : Je conçois qu'un bug récalcitrant titille un peu et suscite l'envoi d'un mail simple et concis traduisant un certain état d'agacement : ça ne marche pas et ça devrait marcher ! En pareil cas, j'ai aussi tendance à réagir de la sorte. Toutefois, étant la source de l'erreur, le programmeur est celui qui dispose des informations les plus détaillées. J'essaye de lui demander tout ce qu'il sait avant de me lancer en conjectures.

Un cas concret : un programme est censé minimiser la longueur du chemin passant par tous les noeuds d'un graphe (problème du voyageur de commerce). L'algorithme implémenté était tout-à-fait correct à ceci près que l'arc liant le dernier noeud au premier était oublié dans le calcul de la longueur du chemin (il ne bouclait pas). Je vous laisse imaginer ce que l'algorithme produisait comme solution et pourquoi ce que j'ai vu au fil des itérations m'a incité à aller inspecter le calcul de cette longueur.

2014-05-04 Données financières

Chaque année, je propose des sujets financiers aux étudiants de l'ENSAE et la question qui revient systématique est celle des données. Jusqu'à présent, j'utilisais Yahoo Finance!. L'inconvénient est qu'on ne peut récupérer que les cours daily des actions. Un ami m'a suggéré le site Quandl. Les historiques ne sont parfois pas aussi conséquent mais ce site aggrège différentes sources de données et les rend disponibles selon la même interface depuis de nombreux langages (Python, R, Julia, Clojure...).

L'interface est vraiment épurée, très réactive et très agréable à utiliser. Outre la multitude de séries financières qui est accessible, le site met à disposition des séries économiques comme le PIB pour de nombreux pays ou encore le cours du Bitcoin.

Le site stipule que l'accès est gratuit. Il faut s'authentifier si on dépasse un quota de 50 requêtes par jour. Le business model n'est pas encore bien défini (coming soon) contrairement à leur concurrent Datamarket. Ma préférence va pour Quandl, simple, accessible, gratuit et des objectifs ambitieux. Si une source de données ne fait pas partie du catalogue, il est même possible de leur demander de l'intégrer.

Quelques articles :

2014-05-02 Map / Reduce

I wish sometimes bugs could let me go. I'm working on an map/reduce algorithm. The problem would be smaller I would not hesitate to avoid map/reduce but it is not. Any fast it can be, I find it very slow and impossible to run. So I polish. I wake up in the morning and a detail strikes me up. Shit, shit, shit, I should have written it that way. It works on a small sample but this sample is resistant to many mistakes. I see this algorithm working in my head from the beginning. But I missed this case, as if a train would hide another one and get me killed when I cross. That kind of stuff always happens with big data. Pruning, scaling...

Most of the time, the issue comes from skewed data. Skewness is a way to say that the data is not uniformly distributed. Precisely, when reducing a table or joining two tables, we group data sharing the same key (as we do a GROUP BY or a JOIN on SQL). People research about it: A Study of Skew in MapReduce Applications. But let's see on a example what it means: notebook on Reduce skew data.

2014-04-20 Les algorithmes sur les graphes ne sont pas aussi simples en Map/Reduce

Je ne suis plus d'où cette histoire est partie ni si elle est vraie mais on dit souvent que si on relie deux personnes quelconques dans le monde par une chaîne d'amis, cette chaîne ne sera pas plus longue que 7. Sans doute Facebook pourrait y trouver à redire. Ce qui m'intéresse ce soir est de savoir la longueur de la chaîne qui me relie au Président de la République.

Je serais bien incapable de vous donner la réponse mais je pourrais vous dire comment la trouver. Si un de vos amis connaît la réponse à cette question, si cette réponse est l, alors dans votre cas, la réponse sera l+1 et vos amis pourront dire que la réponse dans leur cas est l+2. Pour que toute personne dans Paris ait la réponse à cette question, il suffit qu'une vague parte du président et se propage à chacun d'entre nous.

L'algorithme est en lui-même assez simple à implémenter à condition que le graphe soit petit. Lorsqu'il est grand (plusieurs dizaines de millions de noeuds), cela prend du temps, beaucoup de temps même si cela ne peut plus se faire sur le même ordinateur. On pense alors au concept Map/Reduce qui permet d'effectuer des calculs distribués sur plusieurs machines. Mais dans ce cas-ci, ce n'est pas si évident. Et pour comprendre pourquoi, la lecture continue ici : Graphe et Map Reduce.

J'ajoute ici quelques commentaires qui me sont parvenus cette semaine.

Le nombre de connexions qui relient deux individus est un vieux problème : Small-world experiment, Le nombre d'Erdős. Les algorithmes sur des grands graphes ne sont jamais évidents, ne serait-ce que pour calculer (en un temps raisonnable) le plus court chemin entre deux pages Wikipedia comme sur Wikidistrict, décrite ici Wikidistrict, une exploration ludique de Wikipédia. Le premier réflexe lorsqu'on traite un grand nombre de données est de réduire la taille du problème ou de regardeer sur des examples. Cependant, s'il est facile de concevoir ce qu'est un échantillon au sein d'une population, qu'est-ce qu'un échantillon au sein d'un graphe, un échantillon qui respecte les propriétés du graphe. Vous trouverez quelques réponses ici : Statistical Analysis of Network Data (Eric D. Kolaczyk).

2014-04-16 Désactiver les logs de cvxopt

Des élèves m'ont posé cette question aujourd'hui : comment désactiver les logs que génère le module cvxopt. J'ai trouvé la réponse en cherchant cvxopt disable log sur un moteur de recherche cvxopt, algorithm parameters ou encore CVXOPT output suppression with MOSEK.

from cvxopt import solvers
solvers.options['show_progress'] = False

2014-04-15 Systèmes de recommandations

C'est un des thèmes de recherche en vogue en ce moment. Les systèmes de recommandations. Une méthode courante est la factorisation de matrice. Une autre sont les Random Walks with Restart. A noter dans un coin pour de futurs sujets de projets informatiques.

2014-04-14 A reference for Text Processing with Map Reduce

While reading some papers, I found this reference: Data-Intensive Text Processing with MapReduce. It is a good introduction for people who never used Map Reduce.

2014-04-13 Latex formulas with Sphinx

Is it worth writing about something which took me 15 minutes to find out and others 15 to try? And it will be another 10 to write it down... I wonder! Anyway, I was looking for a way to add formulas in my python documentation.


more...

2014-04-12 Quelques astuces pour accélérer un programme

Python n'est pas un langage rapide mais cela n'empêche pas que certaines façons d'écrire du code son plus lentes que d'autres. On peut accélérer un code de différentes manières. En voici quelques-unes. L'article se conclut par l'utilisation d'un profiler.

Optimisation du code

L'exemple suivant trie des éléments. Mais comme ceux-ci sont soit des chiffres sous formes de lettres, soit des entiers, il faut d'abord tous les convertir en entiers.

rangs = ['6', 7, '5', 9, 8, '3']
rangs = sorted([int(r) for r in rangs])

Il est plus simple de définir que ces nombres seront des entiers une bonne fois pour toutes et ne jamais faire de conversions. Il faut toujours avoir des listes d'objets de même type. Dans le cas contraire, c'est l'assurance de faire des erreurs. Dans le même genre d'idées, il faut éviter les fonctions qui retournent des résultats de types différents.


more...
<-- -->

Xavier Dupré