Journal détourner yahi (grapheur de journaux web) pour faire des graphs de CSV

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
4
26
sept.
2025

Yahi

Yahi est un analogue de awstats qui a pour particularité de générer un fichier HTML tout en un (qui nécessite javascript) pour fournir les différentes pages de statistiques (essentiellement une carte geoip, des histogrammes et séries temporelles).

Mais, comme je suis un pervers pépère, je me suis amusé à voir si il n'était pas possible de l'utiliser aussi pour analyser des fichiers CSV.

Exemple 1: DONT: utilisation de regexp pour parser un CSV

Dans le cadre de mon bot bluesky je génère un CSV de stat qui a une structure sur laquelle on peut exceptionnellement appliquer une regexp :

timestamp (float), nombre de post français (int), nombre de posts totaux (int),?…

Le code est simple ::

from archery import mdict
from yahi import notch, shoot
from json import dump
import re


context=notch(
    off="user_agent,geo_ip",
    log_format="custom",
    output_format="json",
    date_pattern="%s",
    log_pattern="""^(?P<datetime>[^,]+),
    (?P<nb_fr>[^,]+),
    (?P<nb_total>[^,]+),?.*
    $""")

date_formater= lambda dt :"%s-%s-%s" % ( dt.year, dt.month, dt.day)
res= shoot(
        context,
        lambda data: mdict({
            "date_fr" :
                mdict({ date_formater(data["_datetime"]) : 
                    int(data["nb_fr"]) }),
            "hour_fr" : 
                mdict({ "%02d" % data["_datetime"].hour : 
                    int(data["nb_fr"]) }),
            "date_all" : 
                mdict({ date_formater(data["_datetime"]) : 
                    int(data["nb_total"]) }),
            "hour_all" : 
                mdict({ "%02d" % data["_datetime"].hour : 
                    int(data["nb_total"]) }),
            "total" : 1
        })
    )
dump(res,open("data.js","w"),  indent=4)

Ce code génère le fichier data.js dans les conventions qui suivent les attendus du fichier de données yahi

date_ … correspond à un histogramme de temps
hour_ … correspond à un histogramme par heure

Il suffit de faire :

yahi_all_in_one_maker && firefox aio.html
Pour voir les résultats dont ci joint sont deux exemples :

par heure pour les posts fr

par date pour les posts fr

Exemple 2: utilisation brutale avec CSV DictReader

Pour ce cas, j'ai pris le fichier CSV que m'a imprudemment envoyé france travail avec le listing des 10 000 chômeurs de mon coin ayant la structure suivante :

id opaque, civilité, prénom, nom, email du conseiller

pour bâtir les histogrammes de

  • combien chaque conseiller suit de chômeur,
  • quelle est la fréquence des prénoms (et ce que cela révèle)

Là encore, le code est assez simple :

from csv import DictReader
from json import dump
from archery import mdict

res=mdict()
with open("/home/jul/Téléchargements/GEMESCAPEG.csv") as f:
    for l in DictReader(f):
        res+=mdict(
            by_ref = mdict({l["Referent"]: 1}),
            by_prenom=mdict({l["Prenom"]:1}))

dump(res, open("data.js", "w"), indent=4)

Et là la magie de la convention de nommage indique que l'on veut des histogramme triés en forme de top 40

Il ne reste plus qu'à générer la page web …

yahi_all_in_one_maker && firefox aio.html
Et l'on à les graphs suivants :

(le premier est tronqué pour respecter le RGPD)

le nombre de chômeurs par conseiller

le nombre de chômeurs par conseiller

Ce qui nous apprend qu'un conseiller suit en moyenne 250 chômeurs, et que certains à plus de 500 risquent le burnout

la fréquence des prénoms

la fréquence des prénoms

Ce qui nous apprend quand on met en regard de quand les prénoms les plus courants avaient du succès que vaut mieux pas être vieux et au chômage (tarte à la crème) si on veut retrouver du boulot.

Voir la fréquence des prénoms suivants (source INSEE)
la fréquence des prénoms

la fréquence des prénoms

la fréquence des prénoms

Est-ce une bonne idée quand on est chômeur de faire du logiciel libre

J'en ai discuté avec ma conseillère qui m'a dit : pour ne pas être contrôler il est bien dans la partie mouchard projet de votre interface de france travail de rajouter des projets, le plus évitant les contrôles, et vous pouvez tout à fait rajouter vos contributions à du logiciel libre comme étant de l'auto-formation.

  • # oubli

    Posté par  (site web personnel) . Évalué à 1 (+0/-0).

    Pour l'exemple 1 il faut ajouter le fait que le fichier d'entrée est analysée comme suit ::

    python test.py < ~/trollometre.csv

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.